annotate lisp/progmodes/cc-engine.el @ 106522:0a0832d4518d

Fix bug#5091: indentation in c++-mode. * cc-mode.el (c-basic-common-init): make text property `category' rear non-sticky. * cc-engine.el (c-ssb-lit-begin): New defsubst, extracted from .... (c-syntactic-skip-backward): Refactor, extracting the above. (c-guess-basic-syntax CASEs 5D.3, 5L): Add extra anchor point; (c-guess-basic-syntax CASE 19): New CASE to handle template construct continued over line boundary. (c-guess-basic-syntax CASE 7): don't trigger on '<'.
author Alan Mackenzie <acm@muc.de>
date Thu, 10 Dec 2009 14:29:11 +0000
parents f2b36fb84bf7
children b913cb685ed4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1 ;;; cc-engine.el --- core syntax guessing engine for CC mode
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2
74372
cf3e4c6cd4c3 Fix Copyright format.
Glenn Morris <rgm@gnu.org>
parents: 69140
diff changeset
3 ;; Copyright (C) 1985, 1987, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
100908
a9dc0e7c3f2b Add 2009 to copyright years.
Glenn Morris <rgm@gnu.org>
parents: 99350
diff changeset
4 ;; 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
75347
e3694f1cb928 Add 2007 to copyright years.
Glenn Morris <rgm@gnu.org>
parents: 75315
diff changeset
5 ;; Free Software Foundation, Inc.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
6
75307
4389f67a231f Add my name.
Alan Mackenzie <acm@muc.de>
parents: 75027
diff changeset
7 ;; Authors: 2001- Alan Mackenzie
4389f67a231f Add my name.
Alan Mackenzie <acm@muc.de>
parents: 75027
diff changeset
8 ;; 1998- Martin Stjernholm
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9 ;; 1992-1999 Barry A. Warsaw
101112
0685234e527d Comment (minor header format fixes).
Glenn Morris <rgm@gnu.org>
parents: 100908
diff changeset
10 ;; 1987 Dave Detlefs
0685234e527d Comment (minor header format fixes).
Glenn Morris <rgm@gnu.org>
parents: 100908
diff changeset
11 ;; 1987 Stewart Clamen
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
12 ;; 1985 Richard M. Stallman
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
13 ;; Maintainer: bug-cc-mode@gnu.org
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
14 ;; Created: 22-Apr-1997 (split from cc-mode.el)
20142
e66d1eef0bff (c-guess-basic-syntax):
Karl Heuer <kwzh@gnu.org>
parents: 20139
diff changeset
15 ;; Version: See cc-mode.el
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
16 ;; Keywords: c languages oop
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
17
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
18 ;; This file is part of GNU Emacs.
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
19
94673
52b7a8c22af5 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 93975
diff changeset
20 ;; GNU Emacs is free software: you can redistribute it and/or modify
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
21 ;; it under the terms of the GNU General Public License as published by
94673
52b7a8c22af5 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 93975
diff changeset
22 ;; the Free Software Foundation, either version 3 of the License, or
52b7a8c22af5 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 93975
diff changeset
23 ;; (at your option) any later version.
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
24
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
25 ;; GNU Emacs is distributed in the hope that it will be useful,
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
26 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
27 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
28 ;; GNU General Public License for more details.
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
29
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
30 ;; You should have received a copy of the GNU General Public License
94673
52b7a8c22af5 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 93975
diff changeset
31 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
32
38422
7a94f1c588c4 Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents: 36920
diff changeset
33 ;;; Commentary:
7a94f1c588c4 Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents: 36920
diff changeset
34
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
35 ;; The functions which have docstring documentation can be considered
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
36 ;; part of an API which other packages can use in CC Mode buffers.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
37 ;; Otoh, undocumented functions and functions with the documentation
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
38 ;; in comments are considered purely internal and can change semantics
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
39 ;; or even disappear in the future.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
40 ;;
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
41 ;; (This policy applies to CC Mode as a whole, not just this file. It
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
42 ;; probably also applies to many other Emacs packages, but here it's
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
43 ;; clearly spelled out.)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
44
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
45 ;; Hidden buffer changes
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
46 ;;
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
47 ;; Various functions in CC Mode use text properties for caching and
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
48 ;; syntactic markup purposes, and those of them that might modify such
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
49 ;; properties but still don't modify the buffer in a visible way are
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
50 ;; said to do "hidden buffer changes". They should be used within
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
51 ;; `c-save-buffer-state' or a similar function that saves and restores
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
52 ;; buffer modifiedness, disables buffer change hooks, etc.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
53 ;;
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
54 ;; Interactive functions are assumed to not do hidden buffer changes,
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
55 ;; except in the specific parts of them that do real changes.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
56 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
57 ;; Lineup functions are assumed to do hidden buffer changes. They
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
58 ;; must not do real changes, though.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
59 ;;
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
60 ;; All other functions that do hidden buffer changes have that noted
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
61 ;; in their doc string or comment.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
62 ;;
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
63 ;; The intention with this system is to avoid wrapping every leaf
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
64 ;; function that do hidden buffer changes inside
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
65 ;; `c-save-buffer-state'. It should be used as near the top of the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
66 ;; interactive functions as possible.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
67 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
68 ;; Functions called during font locking are allowed to do hidden
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
69 ;; buffer changes since the font-lock package run them in a context
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
70 ;; similar to `c-save-buffer-state' (in fact, that function is heavily
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
71 ;; inspired by `save-buffer-state' in the font-lock package).
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
72
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
73 ;; Use of text properties
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
74 ;;
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
75 ;; CC Mode uses several text properties internally to mark up various
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
76 ;; positions, e.g. to improve speed and to eliminate glitches in
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
77 ;; interactive refontification.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
78 ;;
51829
d508ffa43505 2003-07-08 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 51714
diff changeset
79 ;; Note: This doc is for internal use only. Other packages should not
d508ffa43505 2003-07-08 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 51714
diff changeset
80 ;; assume that these text properties are used as described here.
d508ffa43505 2003-07-08 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 51714
diff changeset
81 ;;
106395
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
82 ;; 'category
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
83 ;; Used for "indirection". With its help, some other property can
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
84 ;; be cheaply and easily switched on or off everywhere it occurs.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
85 ;;
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
86 ;; 'syntax-table
80157
e67a400370f5 Set of changes so that "obtrusive" syntactic elements in a
Alan Mackenzie <acm@muc.de>
parents: 79953
diff changeset
87 ;; Used to modify the syntax of some characters. It is used to
e67a400370f5 Set of changes so that "obtrusive" syntactic elements in a
Alan Mackenzie <acm@muc.de>
parents: 79953
diff changeset
88 ;; mark the "<" and ">" of angle bracket parens with paren syntax, and
e67a400370f5 Set of changes so that "obtrusive" syntactic elements in a
Alan Mackenzie <acm@muc.de>
parents: 79953
diff changeset
89 ;; to "hide" obtrusive characters in preprocessor lines.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
90 ;;
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
91 ;; This property is used on single characters and is therefore
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
92 ;; always treated as front and rear nonsticky (or start and end open
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
93 ;; in XEmacs vocabulary). It's therefore installed on
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
94 ;; `text-property-default-nonsticky' if that variable exists (Emacs
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
95 ;; >= 21).
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
96 ;;
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
97 ;; 'c-is-sws and 'c-in-sws
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
98 ;; Used by `c-forward-syntactic-ws' and `c-backward-syntactic-ws' to
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
99 ;; speed them up. See the comment blurb before `c-put-is-sws'
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
100 ;; below for further details.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
101 ;;
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
102 ;; 'c-type
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
103 ;; This property is used on single characters to mark positions with
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
104 ;; special syntactic relevance of various sorts. Its primary use is
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
105 ;; to avoid glitches when multiline constructs are refontified
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
106 ;; interactively (on font lock decoration level 3). It's cleared in
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
107 ;; a region before it's fontified and is then put on relevant chars
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
108 ;; in that region as they are encountered during the fontification.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
109 ;; The value specifies the kind of position:
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
110 ;;
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
111 ;; 'c-decl-arg-start
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
112 ;; Put on the last char of the token preceding each declaration
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
113 ;; inside a declaration style arglist (typically in a function
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
114 ;; prototype).
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
115 ;;
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
116 ;; 'c-decl-end
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
117 ;; Put on the last char of the token preceding a declaration.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
118 ;; This is used in cases where declaration boundaries can't be
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
119 ;; recognized simply by looking for a token like ";" or "}".
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
120 ;; `c-type-decl-end-used' must be set if this is used (see also
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
121 ;; `c-find-decl-spots').
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
122 ;;
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
123 ;; 'c-<>-arg-sep
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
124 ;; Put on the commas that separate arguments in angle bracket
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
125 ;; arglists like C++ template arglists.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
126 ;;
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
127 ;; 'c-decl-id-start and 'c-decl-type-start
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
128 ;; Put on the last char of the token preceding each declarator
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
129 ;; in the declarator list of a declaration. They are also used
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
130 ;; between the identifiers cases like enum declarations.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
131 ;; 'c-decl-type-start is used when the declarators are types,
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
132 ;; 'c-decl-id-start otherwise.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
133 ;;
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
134 ;; 'c-awk-NL-prop
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
135 ;; Used in AWK mode to mark the various kinds of newlines. See
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
136 ;; cc-awk.el.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
137
38422
7a94f1c588c4 Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents: 36920
diff changeset
138 ;;; Code:
7a94f1c588c4 Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents: 36920
diff changeset
139
26817
03befb219d03 Installed version 5.26
Gerd Moellmann <gerd@gnu.org>
parents: 25178
diff changeset
140 (eval-when-compile
03befb219d03 Installed version 5.26
Gerd Moellmann <gerd@gnu.org>
parents: 25178
diff changeset
141 (let ((load-path
36920
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
142 (if (and (boundp 'byte-compile-dest-file)
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
143 (stringp byte-compile-dest-file))
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
144 (cons (file-name-directory byte-compile-dest-file) load-path)
26817
03befb219d03 Installed version 5.26
Gerd Moellmann <gerd@gnu.org>
parents: 25178
diff changeset
145 load-path)))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
146 (load "cc-bytecomp" nil t)))
36920
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
147
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
148 (cc-require 'cc-defs)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
149 (cc-require-when-compile 'cc-langs)
36920
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
150 (cc-require 'cc-vars)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
151
36920
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
152 ;; Silence the compiler.
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
153 (cc-bytecomp-defun buffer-syntactic-context) ; XEmacs
26817
03befb219d03 Installed version 5.26
Gerd Moellmann <gerd@gnu.org>
parents: 25178
diff changeset
154
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
155
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
156 ;; Make declarations for all the `c-lang-defvar' variables in cc-langs.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
157
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
158 (defmacro c-declare-lang-variables ()
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
159 `(progn
51888
b5a29d6f2851 (c-declare-lang-variables): Don't use mapcan.
Richard M. Stallman <rms@gnu.org>
parents: 51829
diff changeset
160 ,@(apply 'nconc
b5a29d6f2851 (c-declare-lang-variables): Don't use mapcan.
Richard M. Stallman <rms@gnu.org>
parents: 51829
diff changeset
161 (mapcar (lambda (init)
b5a29d6f2851 (c-declare-lang-variables): Don't use mapcan.
Richard M. Stallman <rms@gnu.org>
parents: 51829
diff changeset
162 `(,(if (elt init 2)
b5a29d6f2851 (c-declare-lang-variables): Don't use mapcan.
Richard M. Stallman <rms@gnu.org>
parents: 51829
diff changeset
163 `(defvar ,(car init) nil ,(elt init 2))
b5a29d6f2851 (c-declare-lang-variables): Don't use mapcan.
Richard M. Stallman <rms@gnu.org>
parents: 51829
diff changeset
164 `(defvar ,(car init) nil))
b5a29d6f2851 (c-declare-lang-variables): Don't use mapcan.
Richard M. Stallman <rms@gnu.org>
parents: 51829
diff changeset
165 (make-variable-buffer-local ',(car init))))
b5a29d6f2851 (c-declare-lang-variables): Don't use mapcan.
Richard M. Stallman <rms@gnu.org>
parents: 51829
diff changeset
166 (cdr c-lang-variable-inits)))))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
167 (c-declare-lang-variables)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
168
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
169
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
170 ;;; Internal state variables.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
171
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
172 ;; Internal state of hungry delete key feature
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
173 (defvar c-hungry-delete-key nil)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
174 (make-variable-buffer-local 'c-hungry-delete-key)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
175
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
176 ;; The electric flag (toggled by `c-toggle-electric-state').
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
177 ;; If t, electric actions (like automatic reindentation, and (if
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
178 ;; c-auto-newline is also set) auto newlining) will happen when an electric
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
179 ;; key like `{' is pressed (or an electric keyword like `else').
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
180 (defvar c-electric-flag t)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
181 (make-variable-buffer-local 'c-electric-flag)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
182
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
183 ;; Internal state of auto newline feature.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
184 (defvar c-auto-newline nil)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
185 (make-variable-buffer-local 'c-auto-newline)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
186
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
187 ;; Included in the mode line to indicate the active submodes.
69140
3d8b060d10fb cc-align.el, cc-awk.el, cc-bytecomp.el, cc-cmds.el, cc-compat.el,
Alan Mackenzie <acm@muc.de>
parents: 68773
diff changeset
188 ;; (defvar c-submode-indicators nil)
3d8b060d10fb cc-align.el, cc-awk.el, cc-bytecomp.el, cc-cmds.el, cc-compat.el,
Alan Mackenzie <acm@muc.de>
parents: 68773
diff changeset
189 ;; (make-variable-buffer-local 'c-submode-indicators)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
190
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
191 (defun c-calculate-state (arg prevstate)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
192 ;; Calculate the new state of PREVSTATE, t or nil, based on arg. If
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
193 ;; arg is nil or zero, toggle the state. If arg is negative, turn
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
194 ;; the state off, and if arg is positive, turn the state on
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
195 (if (or (not arg)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
196 (zerop (setq arg (prefix-numeric-value arg))))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
197 (not prevstate)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
198 (> arg 0)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
199
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
200 ;; Dynamically bound cache for `c-in-literal'.
36920
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
201 (defvar c-in-literal-cache t)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
202
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
203
53073
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
204 ;; Basic handling of preprocessor directives.
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
205
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
206 ;; This is a dynamically bound cache used together with
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
207 ;; `c-query-macro-start' and `c-query-and-set-macro-start'. It only
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
208 ;; works as long as point doesn't cross a macro boundary.
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
209 (defvar c-macro-start 'unknown)
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
210
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
211 (defsubst c-query-and-set-macro-start ()
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
212 (if (symbolp c-macro-start)
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
213 (setq c-macro-start (save-excursion
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
214 (c-save-buffer-state ()
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
215 (and (c-beginning-of-macro)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
216 (point)))))
53073
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
217 c-macro-start))
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
218
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
219 (defsubst c-query-macro-start ()
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
220 (if (symbolp c-macro-start)
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
221 (save-excursion
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
222 (c-save-buffer-state ()
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
223 (and (c-beginning-of-macro)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
224 (point))))
53073
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
225 c-macro-start))
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
226
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
227 (defun c-beginning-of-macro (&optional lim)
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
228 "Go to the beginning of a preprocessor directive.
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
229 Leave point at the beginning of the directive and return t if in one,
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
230 otherwise return nil and leave point unchanged.
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
231
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
232 Note that this function might do hidden buffer changes. See the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
233 comment at the start of cc-engine.el for more info."
53073
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
234 (when c-opt-cpp-prefix
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
235 (let ((here (point)))
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
236 (save-restriction
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
237 (if lim (narrow-to-region lim (point-max)))
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
238 (beginning-of-line)
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
239 (while (eq (char-before (1- (point))) ?\\)
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
240 (forward-line -1))
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
241 (back-to-indentation)
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
242 (if (and (<= (point) here)
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
243 (looking-at c-opt-cpp-start))
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
244 t
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
245 (goto-char here)
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
246 nil)))))
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
247
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
248 (defun c-end-of-macro ()
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
249 "Go to the end of a preprocessor directive.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
250 More accurately, move the point to the end of the closest following
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
251 line that doesn't end with a line continuation backslash - no check is
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
252 done that the point is inside a cpp directive to begin with.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
253
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
254 Note that this function might do hidden buffer changes. See the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
255 comment at the start of cc-engine.el for more info."
53073
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
256 (while (progn
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
257 (end-of-line)
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
258 (when (and (eq (char-before) ?\\)
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
259 (not (eobp)))
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
260 (forward-char)
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
261 t))))
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
262
106395
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
263 (defun c-syntactic-end-of-macro ()
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
264 ;; Go to the end of a CPP directive, or a "safe" pos just before.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
265 ;;
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
266 ;; This is normally the end of the next non-escaped line. A "safe"
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
267 ;; position is one not within a string or comment. (The EOL on a line
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
268 ;; comment is NOT "safe").
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
269 ;;
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
270 ;; This function must only be called from the beginning of a CPP construct.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
271 ;;
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
272 ;; Note that this function might do hidden buffer changes. See the comment
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
273 ;; at the start of cc-engine.el for more info.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
274 (let* ((here (point))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
275 (there (progn (c-end-of-macro) (point)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
276 (s (parse-partial-sexp here there)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
277 (while (and (or (nth 3 s) ; in a string
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
278 (nth 4 s)) ; in a comment (maybe at end of line comment)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
279 (> there here)) ; No infinite loops, please.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
280 (setq there (1- (nth 8 s)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
281 (setq s (parse-partial-sexp here there)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
282 (point)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
283
75027
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
284 (defun c-forward-over-cpp-define-id ()
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
285 ;; Assuming point is at the "#" that introduces a preprocessor
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
286 ;; directive, it's moved forward to the end of the identifier which is
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
287 ;; "#define"d (or whatever c-opt-cpp-macro-define specifies). Non-nil
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
288 ;; is returned in this case, in all other cases nil is returned and
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
289 ;; point isn't moved.
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
290 ;;
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
291 ;; This function might do hidden buffer changes.
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
292 (when (and c-opt-cpp-macro-define-id
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
293 (looking-at c-opt-cpp-macro-define-id))
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
294 (goto-char (match-end 0))))
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
295
53073
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
296 (defun c-forward-to-cpp-define-body ()
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
297 ;; Assuming point is at the "#" that introduces a preprocessor
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
298 ;; directive, it's moved forward to the start of the definition body
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
299 ;; if it's a "#define" (or whatever c-opt-cpp-macro-define
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
300 ;; specifies). Non-nil is returned in this case, in all other cases
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
301 ;; nil is returned and point isn't moved.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
302 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
303 ;; This function might do hidden buffer changes.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
304 (when (and c-opt-cpp-macro-define-start
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
305 (looking-at c-opt-cpp-macro-define-start)
53073
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
306 (not (= (match-end 0) (c-point 'eol))))
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
307 (goto-char (match-end 0))))
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
308
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
309
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
310 ;;; Basic utility functions.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
311
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
312 (defun c-syntactic-content (from to paren-level)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
313 ;; Return the given region as a string where all syntactic
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
314 ;; whitespace is removed or, where necessary, replaced with a single
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
315 ;; space. If PAREN-LEVEL is given then all parens in the region are
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
316 ;; collapsed to "()", "[]" etc.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
317 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
318 ;; This function might do hidden buffer changes.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
319
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
320 (save-excursion
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
321 (save-restriction
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
322 (narrow-to-region from to)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
323 (goto-char from)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
324 (let* ((parts (list nil)) (tail parts) pos in-paren)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
325
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
326 (while (re-search-forward c-syntactic-ws-start to t)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
327 (goto-char (setq pos (match-beginning 0)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
328 (c-forward-syntactic-ws)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
329 (if (= (point) pos)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
330 (forward-char)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
331
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
332 (when paren-level
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
333 (save-excursion
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
334 (setq in-paren (= (car (parse-partial-sexp from pos 1)) 1)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
335 pos (point))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
336
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
337 (if (and (> pos from)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
338 (< (point) to)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
339 (looking-at "\\w\\|\\s_")
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
340 (save-excursion
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
341 (goto-char (1- pos))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
342 (looking-at "\\w\\|\\s_")))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
343 (progn
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
344 (setcdr tail (list (buffer-substring-no-properties from pos)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
345 " "))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
346 (setq tail (cddr tail)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
347 (setcdr tail (list (buffer-substring-no-properties from pos)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
348 (setq tail (cdr tail)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
349
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
350 (when in-paren
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
351 (when (= (car (parse-partial-sexp pos to -1)) -1)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
352 (setcdr tail (list (buffer-substring-no-properties
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
353 (1- (point)) (point))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
354 (setq tail (cdr tail))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
355
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
356 (setq from (point))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
357
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
358 (setcdr tail (list (buffer-substring-no-properties from to)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
359 (apply 'concat (cdr parts))))))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
360
53073
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
361 (defun c-shift-line-indentation (shift-amt)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
362 ;; Shift the indentation of the current line with the specified
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
363 ;; amount (positive inwards). The buffer is modified only if
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
364 ;; SHIFT-AMT isn't equal to zero.
53073
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
365 (let ((pos (- (point-max) (point)))
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
366 (c-macro-start c-macro-start)
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
367 tmp-char-inserted)
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
368 (if (zerop shift-amt)
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
369 nil
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
370 ;; If we're on an empty line inside a macro, we take the point
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
371 ;; to be at the current indentation and shift it to the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
372 ;; appropriate column. This way we don't treat the extra
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
373 ;; whitespace out to the line continuation as indentation.
53073
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
374 (when (and (c-query-and-set-macro-start)
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
375 (looking-at "[ \t]*\\\\$")
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
376 (save-excursion
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
377 (skip-chars-backward " \t")
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
378 (bolp)))
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
379 (insert ?x)
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
380 (backward-char)
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
381 (setq tmp-char-inserted t))
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
382 (unwind-protect
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
383 (let ((col (current-indentation)))
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
384 (delete-region (c-point 'bol) (c-point 'boi))
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
385 (beginning-of-line)
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
386 (indent-to (+ col shift-amt)))
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
387 (when tmp-char-inserted
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
388 (delete-char 1))))
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
389 ;; If initial point was within line's indentation and we're not on
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
390 ;; a line with a line continuation in a macro, position after the
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
391 ;; indentation. Else stay at same point in text.
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
392 (if (and (< (point) (c-point 'boi))
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
393 (not tmp-char-inserted))
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
394 (back-to-indentation)
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
395 (if (> (- (point-max) pos) (point))
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
396 (goto-char (- (point-max) pos))))))
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
397
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
398 (defsubst c-keyword-sym (keyword)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
399 ;; Return non-nil if the string KEYWORD is a known keyword. More
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
400 ;; precisely, the value is the symbol for the keyword in
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
401 ;; `c-keywords-obarray'.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
402 (intern-soft keyword c-keywords-obarray))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
403
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
404 (defsubst c-keyword-member (keyword-sym lang-constant)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
405 ;; Return non-nil if the symbol KEYWORD-SYM, as returned by
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
406 ;; `c-keyword-sym', is a member of LANG-CONSTANT, which is the name
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
407 ;; of a language constant that ends with "-kwds". If KEYWORD-SYM is
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
408 ;; nil then the result is nil.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
409 (get keyword-sym lang-constant))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
410
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
411 ;; String syntax chars, suitable for skip-syntax-(forward|backward).
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
412 (defconst c-string-syntax (if (memq 'gen-string-delim c-emacs-features)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
413 "\"|"
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
414 "\""))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
415
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
416 ;; Regexp matching string limit syntax.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
417 (defconst c-string-limit-regexp (if (memq 'gen-string-delim c-emacs-features)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
418 "\\s\"\\|\\s|"
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
419 "\\s\""))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
420
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
421 ;; Regexp matching WS followed by string limit syntax.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
422 (defconst c-ws*-string-limit-regexp
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
423 (concat "[ \t]*\\(" c-string-limit-regexp "\\)"))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
424
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
425 ;; Holds formatted error strings for the few cases where parse errors
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
426 ;; are reported.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
427 (defvar c-parsing-error nil)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
428 (make-variable-buffer-local 'c-parsing-error)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
429
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
430 (defun c-echo-parsing-error (&optional quiet)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
431 (when (and c-report-syntactic-errors c-parsing-error (not quiet))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
432 (c-benign-error "%s" c-parsing-error))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
433 c-parsing-error)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
434
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
435 ;; Faces given to comments and string literals. This is used in some
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
436 ;; situations to speed up recognition; it isn't mandatory that font
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
437 ;; locking is in use. This variable is extended with the face in
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
438 ;; `c-doc-face-name' when fontification is activated in cc-fonts.el.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
439 (defvar c-literal-faces
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
440 (append '(font-lock-comment-face font-lock-string-face)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
441 (when (facep 'font-lock-comment-delimiter-face)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
442 ;; New in Emacs 22.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
443 '(font-lock-comment-delimiter-face))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
444
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
445 (defsubst c-put-c-type-property (pos value)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
446 ;; Put a c-type property with the given value at POS.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
447 (c-put-char-property pos 'c-type value))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
448
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
449 (defun c-clear-c-type-property (from to value)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
450 ;; Remove all occurences of the c-type property that has the given
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
451 ;; value in the region between FROM and TO. VALUE is assumed to not
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
452 ;; be nil.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
453 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
454 ;; Note: This assumes that c-type is put on single chars only; it's
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
455 ;; very inefficient if matching properties cover large regions.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
456 (save-excursion
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
457 (goto-char from)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
458 (while (progn
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
459 (when (eq (get-text-property (point) 'c-type) value)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
460 (c-clear-char-property (point) 'c-type))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
461 (goto-char (next-single-property-change (point) 'c-type nil to))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
462 (< (point) to)))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
463
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
464
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
465 ;; Some debug tools to visualize various special positions. This
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
466 ;; debug code isn't as portable as the rest of CC Mode.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
467
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
468 (cc-bytecomp-defun overlays-in)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
469 (cc-bytecomp-defun overlay-get)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
470 (cc-bytecomp-defun overlay-start)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
471 (cc-bytecomp-defun overlay-end)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
472 (cc-bytecomp-defun delete-overlay)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
473 (cc-bytecomp-defun overlay-put)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
474 (cc-bytecomp-defun make-overlay)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
475
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
476 (defun c-debug-add-face (beg end face)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
477 (c-save-buffer-state ((overlays (overlays-in beg end)) overlay)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
478 (while overlays
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
479 (setq overlay (car overlays)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
480 overlays (cdr overlays))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
481 (when (eq (overlay-get overlay 'face) face)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
482 (setq beg (min beg (overlay-start overlay))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
483 end (max end (overlay-end overlay)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
484 (delete-overlay overlay)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
485 (overlay-put (make-overlay beg end) 'face face)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
486
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
487 (defun c-debug-remove-face (beg end face)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
488 (c-save-buffer-state ((overlays (overlays-in beg end)) overlay
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
489 (ol-beg beg) (ol-end end))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
490 (while overlays
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
491 (setq overlay (car overlays)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
492 overlays (cdr overlays))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
493 (when (eq (overlay-get overlay 'face) face)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
494 (setq ol-beg (min ol-beg (overlay-start overlay))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
495 ol-end (max ol-end (overlay-end overlay)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
496 (delete-overlay overlay)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
497 (when (< ol-beg beg)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
498 (overlay-put (make-overlay ol-beg beg) 'face face))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
499 (when (> ol-end end)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
500 (overlay-put (make-overlay end ol-end) 'face face))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
501
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
502
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
503 ;; `c-beginning-of-statement-1' and accompanying stuff.
36920
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
504
18844
6b269c4ad2eb (c-maybe-labelp): Add defvar.
Richard M. Stallman <rms@gnu.org>
parents: 18720
diff changeset
505 ;; KLUDGE ALERT: c-maybe-labelp is used to pass information between
6b269c4ad2eb (c-maybe-labelp): Add defvar.
Richard M. Stallman <rms@gnu.org>
parents: 18720
diff changeset
506 ;; c-crosses-statement-barrier-p and c-beginning-of-statement-1. A
6b269c4ad2eb (c-maybe-labelp): Add defvar.
Richard M. Stallman <rms@gnu.org>
parents: 18720
diff changeset
507 ;; better way should be implemented, but this will at least shut up
6b269c4ad2eb (c-maybe-labelp): Add defvar.
Richard M. Stallman <rms@gnu.org>
parents: 18720
diff changeset
508 ;; the byte compiler.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
509 (defvar c-maybe-labelp)
18844
6b269c4ad2eb (c-maybe-labelp): Add defvar.
Richard M. Stallman <rms@gnu.org>
parents: 18720
diff changeset
510
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
511 ;; New awk-compatible version of c-beginning-of-statement-1, ACM 2002/6/22
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
512
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
513 ;; Macros used internally in c-beginning-of-statement-1 for the
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
514 ;; automaton actions.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
515 (defmacro c-bos-push-state ()
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
516 '(setq stack (cons (cons state saved-pos)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
517 stack)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
518 (defmacro c-bos-pop-state (&optional do-if-done)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
519 `(if (setq state (car (car stack))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
520 saved-pos (cdr (car stack))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
521 stack (cdr stack))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
522 t
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
523 ,do-if-done
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
524 (throw 'loop nil)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
525 (defmacro c-bos-pop-state-and-retry ()
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
526 '(throw 'loop (setq state (car (car stack))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
527 saved-pos (cdr (car stack))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
528 ;; Throw nil if stack is empty, else throw non-nil.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
529 stack (cdr stack))))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
530 (defmacro c-bos-save-pos ()
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
531 '(setq saved-pos (vector pos tok ptok pptok)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
532 (defmacro c-bos-restore-pos ()
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
533 '(unless (eq (elt saved-pos 0) start)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
534 (setq pos (elt saved-pos 0)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
535 tok (elt saved-pos 1)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
536 ptok (elt saved-pos 2)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
537 pptok (elt saved-pos 3))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
538 (goto-char pos)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
539 (setq sym nil)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
540 (defmacro c-bos-save-error-info (missing got)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
541 `(setq saved-pos (vector pos ,missing ,got)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
542 (defmacro c-bos-report-error ()
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
543 '(unless noerror
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
544 (setq c-parsing-error
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
545 (format "No matching `%s' found for `%s' on line %d"
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
546 (elt saved-pos 1)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
547 (elt saved-pos 2)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
548 (1+ (count-lines (point-min)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
549 (c-point 'bol (elt saved-pos 0))))))))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
550
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
551 (defun c-beginning-of-statement-1 (&optional lim ignore-labels
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
552 noerror comma-delim)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
553 "Move to the start of the current statement or declaration, or to
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
554 the previous one if already at the beginning of one. Only
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
555 statements/declarations on the same level are considered, i.e. don't
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
556 move into or out of sexps (not even normal expression parentheses).
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
557
98693
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
558 If point is already at the earliest statment within braces or parens,
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
559 this function doesn't move back into any whitespace preceding it; it
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
560 returns 'same in this case.
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
561
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
562 Stop at statement continuation tokens like \"else\", \"catch\",
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
563 \"finally\" and the \"while\" in \"do ... while\" if the start point
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
564 is within the continuation. If starting at such a token, move to the
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
565 corresponding statement start. If at the beginning of a statement,
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
566 move to the closest containing statement if there is any. This might
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
567 also stop at a continuation clause.
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
568
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
569 Labels are treated as part of the following statements if
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
570 IGNORE-LABELS is non-nil. (FIXME: Doesn't work if we stop at a known
69140
3d8b060d10fb cc-align.el, cc-awk.el, cc-bytecomp.el, cc-cmds.el, cc-compat.el,
Alan Mackenzie <acm@muc.de>
parents: 68773
diff changeset
571 statement start keyword.) Otherwise, each label is treated as a
3d8b060d10fb cc-align.el, cc-awk.el, cc-bytecomp.el, cc-cmds.el, cc-compat.el,
Alan Mackenzie <acm@muc.de>
parents: 68773
diff changeset
572 separate statement.
3d8b060d10fb cc-align.el, cc-awk.el, cc-bytecomp.el, cc-cmds.el, cc-compat.el,
Alan Mackenzie <acm@muc.de>
parents: 68773
diff changeset
573
3d8b060d10fb cc-align.el, cc-awk.el, cc-bytecomp.el, cc-cmds.el, cc-compat.el,
Alan Mackenzie <acm@muc.de>
parents: 68773
diff changeset
574 Macros are ignored \(i.e. skipped over) unless point is within one, in
3d8b060d10fb cc-align.el, cc-awk.el, cc-bytecomp.el, cc-cmds.el, cc-compat.el,
Alan Mackenzie <acm@muc.de>
parents: 68773
diff changeset
575 which case the content of the macro is treated as normal code. Aside
3d8b060d10fb cc-align.el, cc-awk.el, cc-bytecomp.el, cc-cmds.el, cc-compat.el,
Alan Mackenzie <acm@muc.de>
parents: 68773
diff changeset
576 from any normal statement starts found in it, stop at the first token
3d8b060d10fb cc-align.el, cc-awk.el, cc-bytecomp.el, cc-cmds.el, cc-compat.el,
Alan Mackenzie <acm@muc.de>
parents: 68773
diff changeset
577 of the content in the macro, i.e. the expression of an \"#if\" or the
3d8b060d10fb cc-align.el, cc-awk.el, cc-bytecomp.el, cc-cmds.el, cc-compat.el,
Alan Mackenzie <acm@muc.de>
parents: 68773
diff changeset
578 start of the definition in a \"#define\". Also stop at start of
3d8b060d10fb cc-align.el, cc-awk.el, cc-bytecomp.el, cc-cmds.el, cc-compat.el,
Alan Mackenzie <acm@muc.de>
parents: 68773
diff changeset
579 macros before leaving them.
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
580
98693
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
581 Return:
102168
4f3b9ebc200a cc-engine.el (c-beginning-of-statement-1): Enhance to parse case clauses
Alan Mackenzie <acm@muc.de>
parents: 101112
diff changeset
582 'label if stopped at a label or \"case...:\" or \"default:\";
98693
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
583 'same if stopped at the beginning of the current statement;
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
584 'up if stepped to a containing statement;
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
585 'previous if stepped to a preceding statement;
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
586 'beginning if stepped from a statement continuation clause to
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
587 its start clause; or
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
588 'macro if stepped to a macro start.
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
589 Note that 'same and not 'label is returned if stopped at the same
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
590 label without crossing the colon character.
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
591
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
592 LIM may be given to limit the search. If the search hits the limit,
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
593 point will be left at the closest following token, or at the start
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
594 position if that is less ('same is returned in this case).
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
595
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
596 NOERROR turns off error logging to `c-parsing-error'.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
597
69140
3d8b060d10fb cc-align.el, cc-awk.el, cc-bytecomp.el, cc-cmds.el, cc-compat.el,
Alan Mackenzie <acm@muc.de>
parents: 68773
diff changeset
598 Normally only ';' and virtual semicolons are considered to delimit
3d8b060d10fb cc-align.el, cc-awk.el, cc-bytecomp.el, cc-cmds.el, cc-compat.el,
Alan Mackenzie <acm@muc.de>
parents: 68773
diff changeset
599 statements, but if COMMA-DELIM is non-nil then ',' is treated
3d8b060d10fb cc-align.el, cc-awk.el, cc-bytecomp.el, cc-cmds.el, cc-compat.el,
Alan Mackenzie <acm@muc.de>
parents: 68773
diff changeset
600 as a delimiter too.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
601
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
602 Note that this function might do hidden buffer changes. See the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
603 comment at the start of cc-engine.el for more info."
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
604
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
605 ;; The bulk of this function is a pushdown automaton that looks at statement
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
606 ;; boundaries and the tokens (such as "while") in c-opt-block-stmt-key. Its
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
607 ;; purpose is to keep track of nested statements, ensuring that such
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
608 ;; statments are skipped over in their entirety (somewhat akin to what C-M-p
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
609 ;; does with nested braces/brackets/parentheses).
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
610 ;;
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
611 ;; Note: The position of a boundary is the following token.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
612 ;;
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
613 ;; Beginning with the current token (the one following point), move back one
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
614 ;; sexp at a time (where a sexp is, more or less, either a token or the
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
615 ;; entire contents of a brace/bracket/paren pair). Each time a statement
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
616 ;; boundary is crossed or a "while"-like token is found, update the state of
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
617 ;; the PDA. Stop at the beginning of a statement when the stack (holding
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
618 ;; nested statement info) is empty and the position has been moved.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
619 ;;
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
620 ;; The following variables constitute the PDA:
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
621 ;;
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
622 ;; sym: This is either the "while"-like token (e.g. 'for) we've just
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
623 ;; scanned back over, 'boundary if we've just gone back over a
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
624 ;; statement boundary, or nil otherwise.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
625 ;; state: takes one of the values (nil else else-boundary while
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
626 ;; while-boundary catch catch-boundary).
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
627 ;; nil means "no "while"-like token yet scanned".
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
628 ;; 'else, for example, means "just gone back over an else".
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
629 ;; 'else-boundary means "just gone back over a statement boundary
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
630 ;; immediately after having gone back over an else".
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
631 ;; saved-pos: A vector of either saved positions (tok ptok pptok, etc.) or
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
632 ;; of error reporting information.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
633 ;; stack: The stack onto which the PDA pushes its state. Each entry
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
634 ;; consists of a saved value of state and saved-pos. An entry is
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
635 ;; pushed when we move back over a "continuation" token (e.g. else)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
636 ;; and popped when we encounter the corresponding opening token
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
637 ;; (e.g. if).
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
638 ;;
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
639 ;;
79408
a29ca195b71e (c-crosses-statement-barrier-p): Fix typo in docstring.
Juanma Barranquero <lekktu@gmail.com>
parents: 78656
diff changeset
640 ;; The following diagram briefly outlines the PDA.
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
641 ;;
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
642 ;; Common state:
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
643 ;; "else": Push state, goto state `else'.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
644 ;; "while": Push state, goto state `while'.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
645 ;; "catch" or "finally": Push state, goto state `catch'.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
646 ;; boundary: Pop state.
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
647 ;; other: Do nothing special.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
648 ;;
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
649 ;; State `else':
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
650 ;; boundary: Goto state `else-boundary'.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
651 ;; other: Error, pop state, retry token.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
652 ;;
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
653 ;; State `else-boundary':
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
654 ;; "if": Pop state.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
655 ;; boundary: Error, pop state.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
656 ;; other: See common state.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
657 ;;
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
658 ;; State `while':
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
659 ;; boundary: Save position, goto state `while-boundary'.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
660 ;; other: Pop state, retry token.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
661 ;;
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
662 ;; State `while-boundary':
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
663 ;; "do": Pop state.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
664 ;; boundary: Restore position if it's not at start, pop state. [*see below]
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
665 ;; other: See common state.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
666 ;;
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
667 ;; State `catch':
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
668 ;; boundary: Goto state `catch-boundary'.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
669 ;; other: Error, pop state, retry token.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
670 ;;
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
671 ;; State `catch-boundary':
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
672 ;; "try": Pop state.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
673 ;; "catch": Goto state `catch'.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
674 ;; boundary: Error, pop state.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
675 ;; other: See common state.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
676 ;;
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
677 ;; [*] In the `while-boundary' state, we had pushed a 'while state, and were
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
678 ;; searching for a "do" which would have opened a do-while. If we didn't
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
679 ;; find it, we discard the analysis done since the "while", go back to this
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
680 ;; token in the buffer and restart the scanning there, this time WITHOUT
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
681 ;; pushing the 'while state onto the stack.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
682 ;;
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
683 ;; In addition to the above there is some special handling of labels
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
684 ;; and macros.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
685
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
686 (let ((case-fold-search nil)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
687 (start (point))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
688 macro-start
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
689 (delims (if comma-delim '(?\; ?,) '(?\;)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
690 (c-stmt-delim-chars (if comma-delim
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
691 c-stmt-delim-chars-with-comma
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
692 c-stmt-delim-chars))
102168
4f3b9ebc200a cc-engine.el (c-beginning-of-statement-1): Enhance to parse case clauses
Alan Mackenzie <acm@muc.de>
parents: 101112
diff changeset
693 c-in-literal-cache c-maybe-labelp after-case:-pos saved
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
694 ;; Current position.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
695 pos
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
696 ;; Position of last stmt boundary character (e.g. ;).
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
697 boundary-pos
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
698 ;; The position of the last sexp or bound that follows the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
699 ;; first found colon, i.e. the start of the nonlabel part of
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
700 ;; the statement. It's `start' if a colon is found just after
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
701 ;; the start.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
702 after-labels-pos
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
703 ;; Like `after-labels-pos', but the first such position inside
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
704 ;; a label, i.e. the start of the last label before the start
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
705 ;; of the nonlabel part of the statement.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
706 last-label-pos
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
707 ;; The last position where a label is possible provided the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
708 ;; statement started there. It's nil as long as no invalid
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
709 ;; label content has been found (according to
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
710 ;; `c-nonlabel-token-key'. It's `start' if no valid label
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
711 ;; content was found in the label. Note that we might still
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
712 ;; regard it a label if it starts with `c-label-kwds'.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
713 label-good-pos
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
714 ;; Symbol just scanned back over (e.g. 'while or 'boundary).
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
715 ;; See above.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
716 sym
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
717 ;; Current state in the automaton. See above.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
718 state
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
719 ;; Current saved positions. See above.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
720 saved-pos
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
721 ;; Stack of conses (state . saved-pos).
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
722 stack
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
723 ;; Regexp which matches "for", "if", etc.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
724 (cond-key (or c-opt-block-stmt-key
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
725 "\\<\\>")) ; Matches nothing.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
726 ;; Return value.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
727 (ret 'same)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
728 ;; Positions of the last three sexps or bounds we've stopped at.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
729 tok ptok pptok)
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
730
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
731 (save-restriction
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
732 (if lim (narrow-to-region lim (point-max)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
733
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
734 (if (save-excursion
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
735 (and (c-beginning-of-macro)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
736 (/= (point) start)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
737 (setq macro-start (point)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
738
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
739 ;; Try to skip back over unary operator characters, to register
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
740 ;; that we've moved.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
741 (while (progn
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
742 (setq pos (point))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
743 (c-backward-syntactic-ws)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
744 ;; Protect post-++/-- operators just before a virtual semicolon.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
745 (and (not (c-at-vsemi-p))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
746 (/= (skip-chars-backward "-+!*&~@`#") 0))))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
747
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
748 ;; Skip back over any semicolon here. If it was a bare semicolon, we're
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
749 ;; done. Later on we ignore the boundaries for statements that don't
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
750 ;; contain any sexp. The only thing that is affected is that the error
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
751 ;; checking is a little less strict, and we really don't bother.
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
752 (if (and (memq (char-before) delims)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
753 (progn (forward-char -1)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
754 (setq saved (point))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
755 (c-backward-syntactic-ws)
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
756 (or (memq (char-before) delims)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
757 (memq (char-before) '(?: nil))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
758 (eq (char-syntax (char-before)) ?\()
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
759 (c-at-vsemi-p))))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
760 (setq ret 'previous
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
761 pos saved)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
762
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
763 ;; Begin at start and not pos to detect macros if we stand
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
764 ;; directly after the #.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
765 (goto-char start)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
766 (if (looking-at "\\<\\|\\W")
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
767 ;; Record this as the first token if not starting inside it.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
768 (setq tok start))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
769
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
770 ;; The following while loop goes back one sexp (balanced parens,
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
771 ;; etc. with contents, or symbol or suchlike) each iteration. This
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
772 ;; movement is accomplished with a call to scan-sexps approx 130 lines
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
773 ;; below.
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
774 (while
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
775 (catch 'loop ;; Throw nil to break, non-nil to continue.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
776 (cond
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
777 ((save-excursion
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
778 (and macro-start ; Always NIL for AWK.
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
779 (progn (skip-chars-backward " \t")
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
780 (eq (char-before) ?#))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
781 (progn (setq saved (1- (point)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
782 (beginning-of-line)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
783 (not (eq (char-before (1- (point))) ?\\)))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
784 (looking-at c-opt-cpp-start)
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
785 (progn (skip-chars-forward " \t")
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
786 (eq (point) saved))))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
787 (goto-char saved)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
788 (if (and (c-forward-to-cpp-define-body)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
789 (progn (c-forward-syntactic-ws start)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
790 (< (point) start)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
791 ;; Stop at the first token in the content of the macro.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
792 (setq pos (point)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
793 ignore-labels t) ; Avoid the label check on exit.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
794 (setq pos saved
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
795 ret 'macro
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
796 ignore-labels t))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
797 (throw 'loop nil))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
798
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
799 ;; Do a round through the automaton if we've just passed a
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
800 ;; statement boundary or passed a "while"-like token.
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
801 ((or sym
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
802 (and (looking-at cond-key)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
803 (setq sym (intern (match-string 1)))))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
804
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
805 (when (and (< pos start) (null stack))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
806 (throw 'loop nil))
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
807
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
808 ;; The PDA state handling.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
809 ;;
53073
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
810 ;; Refer to the description of the PDA in the opening
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
811 ;; comments. In the following OR form, the first leaf
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
812 ;; attempts to handles one of the specific actions detailed
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
813 ;; (e.g., finding token "if" whilst in state `else-boundary').
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
814 ;; We drop through to the second leaf (which handles common
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
815 ;; state) if no specific handler is found in the first cond.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
816 ;; If a parsing error is detected (e.g. an "else" with no
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
817 ;; preceding "if"), we throw to the enclosing catch.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
818 ;;
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
819 ;; Note that the (eq state 'else) means
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
820 ;; "we've just passed an else", NOT "we're looking for an
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
821 ;; else".
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
822 (or (cond
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
823 ((eq state 'else)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
824 (if (eq sym 'boundary)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
825 (setq state 'else-boundary)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
826 (c-bos-report-error)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
827 (c-bos-pop-state-and-retry)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
828
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
829 ((eq state 'else-boundary)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
830 (cond ((eq sym 'if)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
831 (c-bos-pop-state (setq ret 'beginning)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
832 ((eq sym 'boundary)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
833 (c-bos-report-error)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
834 (c-bos-pop-state))))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
835
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
836 ((eq state 'while)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
837 (if (and (eq sym 'boundary)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
838 ;; Since this can cause backtracking we do a
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
839 ;; little more careful analysis to avoid it:
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
840 ;; If there's a label in front of the while
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
841 ;; it can't be part of a do-while.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
842 (not after-labels-pos))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
843 (progn (c-bos-save-pos)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
844 (setq state 'while-boundary))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
845 (c-bos-pop-state-and-retry))) ; Can't be a do-while
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
846
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
847 ((eq state 'while-boundary)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
848 (cond ((eq sym 'do)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
849 (c-bos-pop-state (setq ret 'beginning)))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
850 ((eq sym 'boundary) ; isn't a do-while
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
851 (c-bos-restore-pos) ; the position of the while
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
852 (c-bos-pop-state)))) ; no longer searching for do.
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
853
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
854 ((eq state 'catch)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
855 (if (eq sym 'boundary)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
856 (setq state 'catch-boundary)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
857 (c-bos-report-error)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
858 (c-bos-pop-state-and-retry)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
859
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
860 ((eq state 'catch-boundary)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
861 (cond
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
862 ((eq sym 'try)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
863 (c-bos-pop-state (setq ret 'beginning)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
864 ((eq sym 'catch)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
865 (setq state 'catch))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
866 ((eq sym 'boundary)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
867 (c-bos-report-error)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
868 (c-bos-pop-state)))))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
869
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
870 ;; This is state common. We get here when the previous
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
871 ;; cond statement found no particular state handler.
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
872 (cond ((eq sym 'boundary)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
873 ;; If we have a boundary at the start
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
874 ;; position we push a frame to go to the
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
875 ;; previous statement.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
876 (if (>= pos start)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
877 (c-bos-push-state)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
878 (c-bos-pop-state)))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
879 ((eq sym 'else)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
880 (c-bos-push-state)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
881 (c-bos-save-error-info 'if 'else)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
882 (setq state 'else))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
883 ((eq sym 'while)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
884 ;; Is this a real while, or a do-while?
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
885 ;; The next `when' triggers unless we are SURE that
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
886 ;; the `while' is not the tailend of a `do-while'.
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
887 (when (or (not pptok)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
888 (memq (char-after pptok) delims)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
889 ;; The following kludge is to prevent
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
890 ;; infinite recursion when called from
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
891 ;; c-awk-after-if-for-while-condition-p,
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
892 ;; or the like.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
893 (and (eq (point) start)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
894 (c-vsemi-status-unknown-p))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
895 (c-at-vsemi-p pptok))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
896 ;; Since this can cause backtracking we do a
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
897 ;; little more careful analysis to avoid it: If
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
898 ;; the while isn't followed by a (possibly
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
899 ;; virtual) semicolon it can't be a do-while.
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
900 (c-bos-push-state)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
901 (setq state 'while)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
902 ((memq sym '(catch finally))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
903 (c-bos-push-state)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
904 (c-bos-save-error-info 'try sym)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
905 (setq state 'catch))))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
906
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
907 (when c-maybe-labelp
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
908 ;; We're either past a statement boundary or at the
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
909 ;; start of a statement, so throw away any label data
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
910 ;; for the previous one.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
911 (setq after-labels-pos nil
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
912 last-label-pos nil
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
913 c-maybe-labelp nil))))
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
914
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
915 ;; Step to the previous sexp, but not if we crossed a
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
916 ;; boundary, since that doesn't consume an sexp.
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
917 (if (eq sym 'boundary)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
918 (setq ret 'previous)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
919
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
920 ;; HERE IS THE SINGLE PLACE INSIDE THE PDA LOOP WHERE WE MOVE
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
921 ;; BACKWARDS THROUGH THE SOURCE.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
922
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
923 ;; This is typically fast with the caching done by
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
924 ;; c-(backward|forward)-sws.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
925 (c-backward-syntactic-ws)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
926
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
927 (let ((before-sws-pos (point))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
928 ;; Set as long as we have to continue jumping by sexps.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
929 ;; It's the position to use as end in the next round.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
930 sexp-loop-continue-pos
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
931 ;; The end position of the area to search for statement
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
932 ;; barriers in this round.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
933 (sexp-loop-end-pos pos))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
934
69140
3d8b060d10fb cc-align.el, cc-awk.el, cc-bytecomp.el, cc-cmds.el, cc-compat.el,
Alan Mackenzie <acm@muc.de>
parents: 68773
diff changeset
935 ;; The following while goes back one sexp per iteration.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
936 (while
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
937 (progn
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
938 (unless (c-safe (c-backward-sexp) t)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
939 ;; Give up if we hit an unbalanced block. Since the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
940 ;; stack won't be empty the code below will report a
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
941 ;; suitable error.
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
942 (throw 'loop nil))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
943
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
944 ;; Check if the sexp movement crossed a statement or
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
945 ;; declaration boundary. But first modify the point
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
946 ;; so that `c-crosses-statement-barrier-p' only looks
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
947 ;; at the non-sexp chars following the sexp.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
948 (save-excursion
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
949 (when (setq
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
950 boundary-pos
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
951 (cond
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
952 ((if macro-start
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
953 nil
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
954 (save-excursion
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
955 (when (c-beginning-of-macro)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
956 ;; Set continuation position in case
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
957 ;; `c-crosses-statement-barrier-p'
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
958 ;; doesn't detect anything below.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
959 (setq sexp-loop-continue-pos (point)))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
960 ;; If the sexp movement took us into a
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
961 ;; macro then there were only some non-sexp
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
962 ;; chars after it. Skip out of the macro
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
963 ;; to analyze them but not the non-sexp
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
964 ;; chars that might be inside the macro.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
965 (c-end-of-macro)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
966 (c-crosses-statement-barrier-p
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
967 (point) sexp-loop-end-pos))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
968
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
969 ((and
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
970 (eq (char-after) ?{)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
971 (not (c-looking-at-inexpr-block lim nil t)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
972 ;; Passed a block sexp. That's a boundary
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
973 ;; alright.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
974 (point))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
975
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
976 ((looking-at "\\s\(")
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
977 ;; Passed some other paren. Only analyze
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
978 ;; the non-sexp chars after it.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
979 (goto-char (1+ (c-down-list-backward
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
980 before-sws-pos)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
981 ;; We're at a valid token start position
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
982 ;; (outside the `save-excursion') if
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
983 ;; `c-crosses-statement-barrier-p' failed.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
984 (c-crosses-statement-barrier-p
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
985 (point) sexp-loop-end-pos))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
986
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
987 (t
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
988 ;; Passed a symbol sexp or line
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
989 ;; continuation. It doesn't matter that
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
990 ;; it's included in the analyzed region.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
991 (if (c-crosses-statement-barrier-p
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
992 (point) sexp-loop-end-pos)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
993 t
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
994 ;; If it was a line continuation then we
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
995 ;; have to continue looping.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
996 (if (looking-at "\\\\$")
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
997 (setq sexp-loop-continue-pos (point)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
998 nil))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
999
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1000 (setq pptok ptok
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1001 ptok tok
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1002 tok boundary-pos
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1003 sym 'boundary)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1004 ;; Like a C "continue". Analyze the next sexp.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1005 (throw 'loop t)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1006
102168
4f3b9ebc200a cc-engine.el (c-beginning-of-statement-1): Enhance to parse case clauses
Alan Mackenzie <acm@muc.de>
parents: 101112
diff changeset
1007 sexp-loop-continue-pos) ; End of "go back a sexp" loop condition.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1008 (goto-char sexp-loop-continue-pos)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1009 (setq sexp-loop-end-pos sexp-loop-continue-pos
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1010 sexp-loop-continue-pos nil))))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1011
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1012 ;; ObjC method def?
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1013 (when (and c-opt-method-key
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1014 (setq saved (c-in-method-def-p)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1015 (setq pos saved
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1016 ignore-labels t) ; Avoid the label check on exit.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1017 (throw 'loop nil))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1018
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1019 ;; Handle labels.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1020 (unless (eq ignore-labels t)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1021 (when (numberp c-maybe-labelp)
69140
3d8b060d10fb cc-align.el, cc-awk.el, cc-bytecomp.el, cc-cmds.el, cc-compat.el,
Alan Mackenzie <acm@muc.de>
parents: 68773
diff changeset
1022 ;; `c-crosses-statement-barrier-p' has found a colon, so we
3d8b060d10fb cc-align.el, cc-awk.el, cc-bytecomp.el, cc-cmds.el, cc-compat.el,
Alan Mackenzie <acm@muc.de>
parents: 68773
diff changeset
1023 ;; might be in a label now. Have we got a real label
3d8b060d10fb cc-align.el, cc-awk.el, cc-bytecomp.el, cc-cmds.el, cc-compat.el,
Alan Mackenzie <acm@muc.de>
parents: 68773
diff changeset
1024 ;; (including a case label) or something like C++'s "public:"?
102168
4f3b9ebc200a cc-engine.el (c-beginning-of-statement-1): Enhance to parse case clauses
Alan Mackenzie <acm@muc.de>
parents: 101112
diff changeset
1025 ;; A case label might use an expression rather than a token.
4f3b9ebc200a cc-engine.el (c-beginning-of-statement-1): Enhance to parse case clauses
Alan Mackenzie <acm@muc.de>
parents: 101112
diff changeset
1026 (setq after-case:-pos (or tok start))
4f3b9ebc200a cc-engine.el (c-beginning-of-statement-1): Enhance to parse case clauses
Alan Mackenzie <acm@muc.de>
parents: 101112
diff changeset
1027 (if (looking-at c-nonlabel-token-key) ; e.g. "while" or "'a'"
4f3b9ebc200a cc-engine.el (c-beginning-of-statement-1): Enhance to parse case clauses
Alan Mackenzie <acm@muc.de>
parents: 101112
diff changeset
1028 (setq c-maybe-labelp nil)
4f3b9ebc200a cc-engine.el (c-beginning-of-statement-1): Enhance to parse case clauses
Alan Mackenzie <acm@muc.de>
parents: 101112
diff changeset
1029 (if after-labels-pos ; Have we already encountered a label?
4f3b9ebc200a cc-engine.el (c-beginning-of-statement-1): Enhance to parse case clauses
Alan Mackenzie <acm@muc.de>
parents: 101112
diff changeset
1030 (if (not last-label-pos)
4f3b9ebc200a cc-engine.el (c-beginning-of-statement-1): Enhance to parse case clauses
Alan Mackenzie <acm@muc.de>
parents: 101112
diff changeset
1031 (setq last-label-pos (or tok start)))
4f3b9ebc200a cc-engine.el (c-beginning-of-statement-1): Enhance to parse case clauses
Alan Mackenzie <acm@muc.de>
parents: 101112
diff changeset
1032 (setq after-labels-pos (or tok start)))
4f3b9ebc200a cc-engine.el (c-beginning-of-statement-1): Enhance to parse case clauses
Alan Mackenzie <acm@muc.de>
parents: 101112
diff changeset
1033 (setq c-maybe-labelp t
4f3b9ebc200a cc-engine.el (c-beginning-of-statement-1): Enhance to parse case clauses
Alan Mackenzie <acm@muc.de>
parents: 101112
diff changeset
1034 label-good-pos nil))) ; bogus "label"
69140
3d8b060d10fb cc-align.el, cc-awk.el, cc-bytecomp.el, cc-cmds.el, cc-compat.el,
Alan Mackenzie <acm@muc.de>
parents: 68773
diff changeset
1035
3d8b060d10fb cc-align.el, cc-awk.el, cc-bytecomp.el, cc-cmds.el, cc-compat.el,
Alan Mackenzie <acm@muc.de>
parents: 68773
diff changeset
1036 (when (and (not label-good-pos) ; i.e. no invalid "label"'s yet
3d8b060d10fb cc-align.el, cc-awk.el, cc-bytecomp.el, cc-cmds.el, cc-compat.el,
Alan Mackenzie <acm@muc.de>
parents: 68773
diff changeset
1037 ; been found.
3d8b060d10fb cc-align.el, cc-awk.el, cc-bytecomp.el, cc-cmds.el, cc-compat.el,
Alan Mackenzie <acm@muc.de>
parents: 68773
diff changeset
1038 (looking-at c-nonlabel-token-key)) ; e.g. "while :"
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1039 ;; We're in a potential label and it's the first
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1040 ;; time we've found something that isn't allowed in
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1041 ;; one.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1042 (setq label-good-pos (or tok start))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1043
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1044 ;; We've moved back by a sexp, so update the token positions.
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1045 (setq sym nil
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1046 pptok ptok
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1047 ptok tok
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1048 tok (point)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1049 pos tok))) ; Not nil (for the while loop).
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1050
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1051 ;; If the stack isn't empty there might be errors to report.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1052 (while stack
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1053 (if (and (vectorp saved-pos) (eq (length saved-pos) 3))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1054 (c-bos-report-error))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1055 (setq saved-pos (cdr (car stack))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1056 stack (cdr stack)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1057
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1058 (when (and (eq ret 'same)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1059 (not (memq sym '(boundary ignore nil))))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1060 ;; Need to investigate closer whether we've crossed
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1061 ;; between a substatement and its containing statement.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1062 (if (setq saved (if (looking-at c-block-stmt-1-key)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1063 ptok
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1064 pptok))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1065 (cond ((> start saved) (setq pos saved))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1066 ((= start saved) (setq ret 'up)))))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1067
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1068 (when (and (not ignore-labels)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1069 (eq c-maybe-labelp t)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1070 (not (eq ret 'beginning))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1071 after-labels-pos
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1072 (or (not label-good-pos)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1073 (<= label-good-pos pos)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1074 (progn
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1075 (goto-char (if (and last-label-pos
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1076 (< last-label-pos start))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1077 last-label-pos
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1078 pos))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1079 (looking-at c-label-kwds-regexp))))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1080 ;; We're in a label. Maybe we should step to the statement
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1081 ;; after it.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1082 (if (< after-labels-pos start)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1083 (setq pos after-labels-pos)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1084 (setq ret 'label)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1085 (if (and last-label-pos (< last-label-pos start))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1086 ;; Might have jumped over several labels. Go to the last one.
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1087 (setq pos last-label-pos)))))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1088
102168
4f3b9ebc200a cc-engine.el (c-beginning-of-statement-1): Enhance to parse case clauses
Alan Mackenzie <acm@muc.de>
parents: 101112
diff changeset
1089 ;; Have we got "case <expression>:"?
4f3b9ebc200a cc-engine.el (c-beginning-of-statement-1): Enhance to parse case clauses
Alan Mackenzie <acm@muc.de>
parents: 101112
diff changeset
1090 (goto-char pos)
4f3b9ebc200a cc-engine.el (c-beginning-of-statement-1): Enhance to parse case clauses
Alan Mackenzie <acm@muc.de>
parents: 101112
diff changeset
1091 (when (and after-case:-pos
4f3b9ebc200a cc-engine.el (c-beginning-of-statement-1): Enhance to parse case clauses
Alan Mackenzie <acm@muc.de>
parents: 101112
diff changeset
1092 (not (eq ret 'beginning))
4f3b9ebc200a cc-engine.el (c-beginning-of-statement-1): Enhance to parse case clauses
Alan Mackenzie <acm@muc.de>
parents: 101112
diff changeset
1093 (looking-at c-case-kwds-regexp))
4f3b9ebc200a cc-engine.el (c-beginning-of-statement-1): Enhance to parse case clauses
Alan Mackenzie <acm@muc.de>
parents: 101112
diff changeset
1094 (if (< after-case:-pos start)
105206
60cf2b54da00 cc-langs.el (c-nonlabel-token-key): Allow quoted character constants (as
Alan Mackenzie <acm@muc.de>
parents: 104693
diff changeset
1095 (setq pos after-case:-pos))
60cf2b54da00 cc-langs.el (c-nonlabel-token-key): Allow quoted character constants (as
Alan Mackenzie <acm@muc.de>
parents: 104693
diff changeset
1096 (if (eq ret 'same)
60cf2b54da00 cc-langs.el (c-nonlabel-token-key): Allow quoted character constants (as
Alan Mackenzie <acm@muc.de>
parents: 104693
diff changeset
1097 (setq ret 'label)))
102168
4f3b9ebc200a cc-engine.el (c-beginning-of-statement-1): Enhance to parse case clauses
Alan Mackenzie <acm@muc.de>
parents: 101112
diff changeset
1098
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1099 ;; Skip over the unary operators that can start the statement.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1100 (while (progn
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1101 (c-backward-syntactic-ws)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1102 ;; protect AWK post-inc/decrement operators, etc.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1103 (and (not (c-at-vsemi-p (point)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1104 (/= (skip-chars-backward "-+!*&~@`#") 0)))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1105 (setq pos (point)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1106 (goto-char pos)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1107 ret)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1108
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1109 (defun c-crosses-statement-barrier-p (from to)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1110 "Return non-nil if buffer positions FROM to TO cross one or more
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1111 statement or declaration boundaries. The returned value is actually
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1112 the position of the earliest boundary char. FROM must not be within
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1113 a string or comment.
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1114
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1115 The variable `c-maybe-labelp' is set to the position of the first `:' that
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1116 might start a label (i.e. not part of `::' and not preceded by `?'). If a
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1117 single `?' is found, then `c-maybe-labelp' is cleared.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1118
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1119 For AWK, a statement which is terminated by an EOL (not a \; or a }) is
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1120 regarded as having a \"virtual semicolon\" immediately after the last token on
79408
a29ca195b71e (c-crosses-statement-barrier-p): Fix typo in docstring.
Juanma Barranquero <lekktu@gmail.com>
parents: 78656
diff changeset
1121 the line. If this virtual semicolon is _at_ from, the function recognizes it.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1122
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1123 Note that this function might do hidden buffer changes. See the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1124 comment at the start of cc-engine.el for more info."
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1125 (let ((skip-chars c-stmt-delim-chars)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1126 lit-range)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1127 (save-excursion
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1128 (catch 'done
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1129 (goto-char from)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1130 (while (progn (skip-chars-forward skip-chars to)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1131 (< (point) to))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1132 (cond
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1133 ((setq lit-range (c-literal-limits from)) ; Have we landed in a string/comment?
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1134 (goto-char (cdr lit-range)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1135 ((eq (char-after) ?:)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1136 (forward-char)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1137 (if (and (eq (char-after) ?:)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1138 (< (point) to))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1139 ;; Ignore scope operators.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1140 (forward-char)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1141 (setq c-maybe-labelp (1- (point)))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1142 ((eq (char-after) ??)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1143 ;; A question mark. Can't be a label, so stop
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1144 ;; looking for more : and ?.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1145 (setq c-maybe-labelp nil
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1146 skip-chars (substring c-stmt-delim-chars 0 -2)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1147 ((memq (char-after) '(?# ?\n ?\r)) ; A virtual semicolon?
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1148 (if (and (eq (char-before) ?\\) (memq (char-after) '(?\n ?\r)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1149 (backward-char))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1150 (skip-chars-backward " \t" from)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1151 (if (c-at-vsemi-p)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1152 (throw 'done (point))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1153 (forward-line)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1154 (t (throw 'done (point)))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1155 ;; In trailing space after an as yet undetected virtual semicolon?
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1156 (c-backward-syntactic-ws from)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1157 (if (and (< (point) to)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1158 (c-at-vsemi-p))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1159 (point)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1160 nil)))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1161
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1162 (defun c-at-statement-start-p ()
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1163 "Return non-nil if the point is at the first token in a statement
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1164 or somewhere in the syntactic whitespace before it.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1165
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1166 A \"statement\" here is not restricted to those inside code blocks.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1167 Any kind of declaration-like construct that occur outside function
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1168 bodies is also considered a \"statement\".
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1169
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1170 Note that this function might do hidden buffer changes. See the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1171 comment at the start of cc-engine.el for more info."
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1172
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1173 (save-excursion
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1174 (let ((end (point))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1175 c-maybe-labelp)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1176 (c-syntactic-skip-backward (substring c-stmt-delim-chars 1) nil t)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1177 (or (bobp)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1178 (eq (char-before) ?})
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1179 (and (eq (char-before) ?{)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1180 (not (and c-special-brace-lists
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1181 (progn (backward-char)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1182 (c-looking-at-special-brace-list)))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1183 (c-crosses-statement-barrier-p (point) end)))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1184
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1185 (defun c-at-expression-start-p ()
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1186 "Return non-nil if the point is at the first token in an expression or
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1187 statement, or somewhere in the syntactic whitespace before it.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1188
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1189 An \"expression\" here is a bit different from the normal language
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1190 grammar sense: It's any sequence of expression tokens except commas,
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1191 unless they are enclosed inside parentheses of some kind. Also, an
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1192 expression never continues past an enclosing parenthesis, but it might
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1193 contain parenthesis pairs of any sort except braces.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1194
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1195 Since expressions never cross statement boundaries, this function also
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1196 recognizes statement beginnings, just like `c-at-statement-start-p'.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1197
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1198 Note that this function might do hidden buffer changes. See the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1199 comment at the start of cc-engine.el for more info."
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1200
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1201 (save-excursion
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1202 (let ((end (point))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1203 (c-stmt-delim-chars c-stmt-delim-chars-with-comma)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1204 c-maybe-labelp)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1205 (c-syntactic-skip-backward (substring c-stmt-delim-chars 1) nil t)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1206 (or (bobp)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1207 (memq (char-before) '(?{ ?}))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1208 (save-excursion (backward-char)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1209 (looking-at "\\s("))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1210 (c-crosses-statement-barrier-p (point) end)))))
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1211
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1212
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1213 ;; A set of functions that covers various idiosyncrasies in
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1214 ;; implementations of `forward-comment'.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1215
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1216 ;; Note: Some emacsen considers incorrectly that any line comment
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1217 ;; ending with a backslash continues to the next line. I can't think
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1218 ;; of any way to work around that in a reliable way without changing
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1219 ;; the buffer, though. Suggestions welcome. ;) (No, temporarily
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1220 ;; changing the syntax for backslash doesn't work since we must treat
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1221 ;; escapes in string literals correctly.)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1222
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1223 (defun c-forward-single-comment ()
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1224 "Move forward past whitespace and the closest following comment, if any.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1225 Return t if a comment was found, nil otherwise. In either case, the
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1226 point is moved past the following whitespace. Line continuations,
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1227 i.e. a backslashes followed by line breaks, are treated as whitespace.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1228 The line breaks that end line comments are considered to be the
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1229 comment enders, so the point will be put on the beginning of the next
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1230 line if it moved past a line comment.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1231
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1232 This function does not do any hidden buffer changes."
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1233
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1234 (let ((start (point)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1235 (when (looking-at "\\([ \t\n\r\f\v]\\|\\\\[\n\r]\\)+")
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1236 (goto-char (match-end 0)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1237
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1238 (when (forward-comment 1)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1239 (if (eobp)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1240 ;; Some emacsen (e.g. XEmacs 21) return t when moving
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1241 ;; forwards at eob.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1242 nil
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1243
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1244 ;; Emacs includes the ending newline in a b-style (c++)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1245 ;; comment, but XEmacs doesn't. We depend on the Emacs
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1246 ;; behavior (which also is symmetric).
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1247 (if (and (eolp) (elt (parse-partial-sexp start (point)) 7))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1248 (condition-case nil (forward-char 1)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1249
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1250 t))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1251
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1252 (defsubst c-forward-comments ()
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1253 "Move forward past all following whitespace and comments.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1254 Line continuations, i.e. a backslashes followed by line breaks, are
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1255 treated as whitespace.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1256
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1257 Note that this function might do hidden buffer changes. See the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1258 comment at the start of cc-engine.el for more info."
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1259
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1260 (while (or
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1261 ;; If forward-comment in at least XEmacs 21 is given a large
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1262 ;; positive value, it'll loop all the way through if it hits
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1263 ;; eob.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1264 (and (forward-comment 5)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1265 ;; Some emacsen (e.g. XEmacs 21) return t when moving
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1266 ;; forwards at eob.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1267 (not (eobp)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1268
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1269 (when (looking-at "\\\\[\n\r]")
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1270 (forward-char 2)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1271 t))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1272
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1273 (defun c-backward-single-comment ()
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1274 "Move backward past whitespace and the closest preceding comment, if any.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1275 Return t if a comment was found, nil otherwise. In either case, the
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1276 point is moved past the preceding whitespace. Line continuations,
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1277 i.e. a backslashes followed by line breaks, are treated as whitespace.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1278 The line breaks that end line comments are considered to be the
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1279 comment enders, so the point cannot be at the end of the same line to
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1280 move over a line comment.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1281
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1282 This function does not do any hidden buffer changes."
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1283
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1284 (let ((start (point)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1285 ;; When we got newline terminated comments, forward-comment in all
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1286 ;; supported emacsen so far will stop at eol of each line not
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1287 ;; ending with a comment when moving backwards. This corrects for
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1288 ;; that, and at the same time handles line continuations.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1289 (while (progn
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1290 (skip-chars-backward " \t\n\r\f\v")
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1291 (and (looking-at "[\n\r]")
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1292 (eq (char-before) ?\\)))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1293 (backward-char))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1294
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1295 (if (bobp)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1296 ;; Some emacsen (e.g. Emacs 19.34) return t when moving
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1297 ;; backwards at bob.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1298 nil
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1299
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1300 ;; Leave point after the closest following newline if we've
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1301 ;; backed up over any above, since forward-comment won't move
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1302 ;; backward over a line comment if point is at the end of the
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1303 ;; same line.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1304 (re-search-forward "\\=\\s *[\n\r]" start t)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1305
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1306 (if (if (forward-comment -1)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1307 (if (eolp)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1308 ;; If forward-comment above succeeded and we're at eol
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1309 ;; then the newline we moved over above didn't end a
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1310 ;; line comment, so we give it another go.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1311 (forward-comment -1)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1312 t))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1313
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1314 ;; Emacs <= 20 and XEmacs move back over the closer of a
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1315 ;; block comment that lacks an opener.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1316 (if (looking-at "\\*/")
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1317 (progn (forward-char 2) nil)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1318 t)))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1319
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1320 (defsubst c-backward-comments ()
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1321 "Move backward past all preceding whitespace and comments.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1322 Line continuations, i.e. a backslashes followed by line breaks, are
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1323 treated as whitespace. The line breaks that end line comments are
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1324 considered to be the comment enders, so the point cannot be at the end
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1325 of the same line to move over a line comment. Unlike
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1326 c-backward-syntactic-ws, this function doesn't move back over
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1327 preprocessor directives.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1328
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1329 Note that this function might do hidden buffer changes. See the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1330 comment at the start of cc-engine.el for more info."
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1331
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1332 (let ((start (point)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1333 (while (and
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1334 ;; `forward-comment' in some emacsen (e.g. XEmacs 21.4)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1335 ;; return t when moving backwards at bob.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1336 (not (bobp))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1337
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1338 (if (forward-comment -1)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1339 (if (looking-at "\\*/")
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1340 ;; Emacs <= 20 and XEmacs move back over the
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1341 ;; closer of a block comment that lacks an opener.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1342 (progn (forward-char 2) nil)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1343 t)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1344
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1345 ;; XEmacs treats line continuations as whitespace but
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1346 ;; only in the backward direction, which seems a bit
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1347 ;; odd. Anyway, this is necessary for Emacs.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1348 (when (and (looking-at "[\n\r]")
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1349 (eq (char-before) ?\\)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1350 (< (point) start))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1351 (backward-char)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1352 t))))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1353
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1354
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1355 ;; Tools for skipping over syntactic whitespace.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1356
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1357 ;; The following functions use text properties to cache searches over
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1358 ;; large regions of syntactic whitespace. It works as follows:
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1359 ;;
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1360 ;; o If a syntactic whitespace region contains anything but simple
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1361 ;; whitespace (i.e. space, tab and line breaks), the text property
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1362 ;; `c-in-sws' is put over it. At places where we have stopped
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1363 ;; within that region there's also a `c-is-sws' text property.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1364 ;; That since there typically are nested whitespace inside that
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1365 ;; must be handled separately, e.g. whitespace inside a comment or
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1366 ;; cpp directive. Thus, from one point with `c-is-sws' it's safe
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1367 ;; to jump to another point with that property within the same
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1368 ;; `c-in-sws' region. It can be likened to a ladder where
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1369 ;; `c-in-sws' marks the bars and `c-is-sws' the rungs.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1370 ;;
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1371 ;; o The `c-is-sws' property is put on the simple whitespace chars at
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1372 ;; a "rung position" and also maybe on the first following char.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1373 ;; As many characters as can be conveniently found in this range
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1374 ;; are marked, but no assumption can be made that the whole range
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1375 ;; is marked (it could be clobbered by later changes, for
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1376 ;; instance).
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1377 ;;
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1378 ;; Note that some part of the beginning of a sequence of simple
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1379 ;; whitespace might be part of the end of a preceding line comment
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1380 ;; or cpp directive and must not be considered part of the "rung".
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1381 ;; Such whitespace is some amount of horizontal whitespace followed
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1382 ;; by a newline. In the case of cpp directives it could also be
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1383 ;; two newlines with horizontal whitespace between them.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1384 ;;
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1385 ;; The reason to include the first following char is to cope with
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1386 ;; "rung positions" that doesn't have any ordinary whitespace. If
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1387 ;; `c-is-sws' is put on a token character it does not have
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1388 ;; `c-in-sws' set simultaneously. That's the only case when that
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1389 ;; can occur, and the reason for not extending the `c-in-sws'
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1390 ;; region to cover it is that the `c-in-sws' region could then be
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1391 ;; accidentally merged with a following one if the token is only
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1392 ;; one character long.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1393 ;;
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1394 ;; o On buffer changes the `c-in-sws' and `c-is-sws' properties are
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1395 ;; removed in the changed region. If the change was inside
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1396 ;; syntactic whitespace that means that the "ladder" is broken, but
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1397 ;; a later call to `c-forward-sws' or `c-backward-sws' will use the
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1398 ;; parts on either side and use an ordinary search only to "repair"
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1399 ;; the gap.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1400 ;;
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1401 ;; Special care needs to be taken if a region is removed: If there
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1402 ;; are `c-in-sws' on both sides of it which do not connect inside
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1403 ;; the region then they can't be joined. If e.g. a marked macro is
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1404 ;; broken, syntactic whitespace inside the new text might be
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1405 ;; marked. If those marks would become connected with the old
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1406 ;; `c-in-sws' range around the macro then we could get a ladder
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1407 ;; with one end outside the macro and the other at some whitespace
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1408 ;; within it.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1409 ;;
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1410 ;; The main motivation for this system is to increase the speed in
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1411 ;; skipping over the large whitespace regions that can occur at the
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1412 ;; top level in e.g. header files that contain a lot of comments and
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1413 ;; cpp directives. For small comments inside code it's probably
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1414 ;; slower than using `forward-comment' straightforwardly, but speed is
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1415 ;; not a significant factor there anyway.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1416
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1417 ; (defface c-debug-is-sws-face
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1418 ; '((t (:background "GreenYellow")))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1419 ; "Debug face to mark the `c-is-sws' property.")
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1420 ; (defface c-debug-in-sws-face
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1421 ; '((t (:underline t)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1422 ; "Debug face to mark the `c-in-sws' property.")
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1423
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1424 ; (defun c-debug-put-sws-faces ()
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1425 ; ;; Put the sws debug faces on all the `c-is-sws' and `c-in-sws'
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1426 ; ;; properties in the buffer.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1427 ; (interactive)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1428 ; (save-excursion
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1429 ; (c-save-buffer-state (in-face)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1430 ; (goto-char (point-min))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1431 ; (setq in-face (if (get-text-property (point) 'c-is-sws)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1432 ; (point)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1433 ; (while (progn
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1434 ; (goto-char (next-single-property-change
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1435 ; (point) 'c-is-sws nil (point-max)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1436 ; (if in-face
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1437 ; (progn
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1438 ; (c-debug-add-face in-face (point) 'c-debug-is-sws-face)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1439 ; (setq in-face nil))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1440 ; (setq in-face (point)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1441 ; (not (eobp))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1442 ; (goto-char (point-min))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1443 ; (setq in-face (if (get-text-property (point) 'c-in-sws)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1444 ; (point)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1445 ; (while (progn
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1446 ; (goto-char (next-single-property-change
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1447 ; (point) 'c-in-sws nil (point-max)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1448 ; (if in-face
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1449 ; (progn
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1450 ; (c-debug-add-face in-face (point) 'c-debug-in-sws-face)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1451 ; (setq in-face nil))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1452 ; (setq in-face (point)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1453 ; (not (eobp)))))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1454
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1455 (defmacro c-debug-sws-msg (&rest args)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1456 ;;`(message ,@args)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1457 )
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1458
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1459 (defmacro c-put-is-sws (beg end)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1460 ;; This macro does a hidden buffer change.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1461 `(let ((beg ,beg) (end ,end))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1462 (put-text-property beg end 'c-is-sws t)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1463 ,@(when (facep 'c-debug-is-sws-face)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1464 `((c-debug-add-face beg end 'c-debug-is-sws-face)))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1465
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1466 (defmacro c-put-in-sws (beg end)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1467 ;; This macro does a hidden buffer change.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1468 `(let ((beg ,beg) (end ,end))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1469 (put-text-property beg end 'c-in-sws t)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1470 ,@(when (facep 'c-debug-is-sws-face)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1471 `((c-debug-add-face beg end 'c-debug-in-sws-face)))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1472
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1473 (defmacro c-remove-is-sws (beg end)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1474 ;; This macro does a hidden buffer change.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1475 `(let ((beg ,beg) (end ,end))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1476 (remove-text-properties beg end '(c-is-sws nil))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1477 ,@(when (facep 'c-debug-is-sws-face)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1478 `((c-debug-remove-face beg end 'c-debug-is-sws-face)))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1479
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1480 (defmacro c-remove-in-sws (beg end)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1481 ;; This macro does a hidden buffer change.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1482 `(let ((beg ,beg) (end ,end))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1483 (remove-text-properties beg end '(c-in-sws nil))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1484 ,@(when (facep 'c-debug-is-sws-face)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1485 `((c-debug-remove-face beg end 'c-debug-in-sws-face)))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1486
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1487 (defmacro c-remove-is-and-in-sws (beg end)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1488 ;; This macro does a hidden buffer change.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1489 `(let ((beg ,beg) (end ,end))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1490 (remove-text-properties beg end '(c-is-sws nil c-in-sws nil))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1491 ,@(when (facep 'c-debug-is-sws-face)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1492 `((c-debug-remove-face beg end 'c-debug-is-sws-face)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1493 (c-debug-remove-face beg end 'c-debug-in-sws-face)))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1494
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1495 (defsubst c-invalidate-sws-region-after (beg end)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1496 ;; Called from `after-change-functions'. Note that if
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1497 ;; `c-forward-sws' or `c-backward-sws' are used outside
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1498 ;; `c-save-buffer-state' or similar then this will remove the cache
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1499 ;; properties right after they're added.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1500 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1501 ;; This function does hidden buffer changes.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1502
20914
8f189ffad604 (c-forward-syntactic-ws, c-backward-syntactic-ws):
Richard M. Stallman <rms@gnu.org>
parents: 20142
diff changeset
1503 (save-excursion
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1504 ;; Adjust the end to remove the properties in any following simple
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1505 ;; ws up to and including the next line break, if there is any
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1506 ;; after the changed region. This is necessary e.g. when a rung
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1507 ;; marked empty line is converted to a line comment by inserting
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1508 ;; "//" before the line break. In that case the line break would
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1509 ;; keep the rung mark which could make a later `c-backward-sws'
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1510 ;; move into the line comment instead of over it.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1511 (goto-char end)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1512 (skip-chars-forward " \t\f\v")
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1513 (when (and (eolp) (not (eobp)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1514 (setq end (1+ (point)))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1515
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1516 (when (and (= beg end)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1517 (get-text-property beg 'c-in-sws)
56646
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
1518 (> beg (point-min))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1519 (get-text-property (1- beg) 'c-in-sws))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1520 ;; Ensure that an `c-in-sws' range gets broken. Note that it isn't
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1521 ;; safe to keep a range that was continuous before the change. E.g:
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1522 ;;
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1523 ;; #define foo
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1524 ;; \
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1525 ;; bar
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1526 ;;
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1527 ;; There can be a "ladder" between "#" and "b". Now, if the newline
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1528 ;; after "foo" is removed then "bar" will become part of the cpp
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1529 ;; directive instead of a syntactically relevant token. In that
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1530 ;; case there's no longer syntactic ws from "#" to "b".
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1531 (setq beg (1- beg)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1532
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1533 (c-debug-sws-msg "c-invalidate-sws-region-after [%s..%s]" beg end)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1534 (c-remove-is-and-in-sws beg end))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1535
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1536 (defun c-forward-sws ()
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1537 ;; Used by `c-forward-syntactic-ws' to implement the unbounded search.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1538 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1539 ;; This function might do hidden buffer changes.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1540
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1541 (let (;; `rung-pos' is set to a position as early as possible in the
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1542 ;; unmarked part of the simple ws region.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1543 (rung-pos (point)) next-rung-pos rung-end-pos last-put-in-sws-pos
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1544 rung-is-marked next-rung-is-marked simple-ws-end
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1545 ;; `safe-start' is set when it's safe to cache the start position.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1546 ;; It's not set if we've initially skipped over comments and line
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1547 ;; continuations since we might have gone out through the end of a
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1548 ;; macro then. This provision makes `c-forward-sws' not populate the
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1549 ;; cache in the majority of cases, but otoh is `c-backward-sws' by far
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1550 ;; more common.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1551 safe-start)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1552
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1553 ;; Skip simple ws and do a quick check on the following character to see
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1554 ;; if it's anything that can't start syntactic ws, so we can bail out
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1555 ;; early in the majority of cases when there just are a few ws chars.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1556 (skip-chars-forward " \t\n\r\f\v")
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1557 (when (looking-at c-syntactic-ws-start)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1558
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1559 (setq rung-end-pos (min (1+ (point)) (point-max)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1560 (if (setq rung-is-marked (text-property-any rung-pos rung-end-pos
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1561 'c-is-sws t))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1562 ;; Find the last rung position to avoid setting properties in all
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1563 ;; the cases when the marked rung is complete.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1564 ;; (`next-single-property-change' is certain to move at least one
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1565 ;; step forward.)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1566 (setq rung-pos (1- (next-single-property-change
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1567 rung-is-marked 'c-is-sws nil rung-end-pos)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1568 ;; Got no marked rung here. Since the simple ws might have started
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1569 ;; inside a line comment or cpp directive we must set `rung-pos' as
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1570 ;; high as possible.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1571 (setq rung-pos (point)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1572
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1573 (while
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1574 (progn
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1575 (while
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1576 (when (and rung-is-marked
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1577 (get-text-property (point) 'c-in-sws))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1578
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1579 ;; The following search is the main reason that `c-in-sws'
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1580 ;; and `c-is-sws' aren't combined to one property.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1581 (goto-char (next-single-property-change
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1582 (point) 'c-in-sws nil (point-max)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1583 (unless (get-text-property (point) 'c-is-sws)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1584 ;; If the `c-in-sws' region extended past the last
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1585 ;; `c-is-sws' char we have to go back a bit.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1586 (or (get-text-property (1- (point)) 'c-is-sws)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1587 (goto-char (previous-single-property-change
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1588 (point) 'c-is-sws)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1589 (backward-char))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1590
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1591 (c-debug-sws-msg
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1592 "c-forward-sws cached move %s -> %s (max %s)"
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1593 rung-pos (point) (point-max))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1594
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1595 (setq rung-pos (point))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1596 (and (> (skip-chars-forward " \t\n\r\f\v") 0)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1597 (not (eobp))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1598
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1599 ;; We'll loop here if there is simple ws after the last rung.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1600 ;; That means that there's been some change in it and it's
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1601 ;; possible that we've stepped into another ladder, so extend
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1602 ;; the previous one to join with it if there is one, and try to
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1603 ;; use the cache again.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1604 (c-debug-sws-msg
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1605 "c-forward-sws extending rung with [%s..%s] (max %s)"
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1606 (1+ rung-pos) (1+ (point)) (point-max))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1607 (unless (get-text-property (point) 'c-is-sws)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1608 ;; Remove any `c-in-sws' property from the last char of
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1609 ;; the rung before we mark it with `c-is-sws', so that we
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1610 ;; won't connect with the remains of a broken "ladder".
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1611 (c-remove-in-sws (point) (1+ (point))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1612 (c-put-is-sws (1+ rung-pos)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1613 (1+ (point)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1614 (c-put-in-sws rung-pos
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1615 (setq rung-pos (point)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1616 last-put-in-sws-pos rung-pos)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1617
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1618 (setq simple-ws-end (point))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1619 (c-forward-comments)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1620
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1621 (cond
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1622 ((/= (point) simple-ws-end)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1623 ;; Skipped over comments. Don't cache at eob in case the buffer
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1624 ;; is narrowed.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1625 (not (eobp)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1626
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1627 ((save-excursion
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1628 (and c-opt-cpp-prefix
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1629 (looking-at c-opt-cpp-start)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1630 (progn (skip-chars-backward " \t")
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1631 (bolp))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1632 (or (bobp)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1633 (progn (backward-char)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1634 (not (eq (char-before) ?\\))))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1635 ;; Skip a preprocessor directive.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1636 (end-of-line)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1637 (while (and (eq (char-before) ?\\)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1638 (= (forward-line 1) 0))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1639 (end-of-line))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1640 (forward-line 1)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1641 (setq safe-start t)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1642 ;; Don't cache at eob in case the buffer is narrowed.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1643 (not (eobp)))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1644
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1645 ;; We've searched over a piece of non-white syntactic ws. See if this
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1646 ;; can be cached.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1647 (setq next-rung-pos (point))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1648 (skip-chars-forward " \t\n\r\f\v")
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1649 (setq rung-end-pos (min (1+ (point)) (point-max)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1650
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1651 (if (or
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1652 ;; Cache if we haven't skipped comments only, and if we started
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1653 ;; either from a marked rung or from a completely uncached
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1654 ;; position.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1655 (and safe-start
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1656 (or rung-is-marked
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1657 (not (get-text-property simple-ws-end 'c-in-sws))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1658
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1659 ;; See if there's a marked rung in the encountered simple ws. If
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1660 ;; so then we can cache, unless `safe-start' is nil. Even then
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1661 ;; we need to do this to check if the cache can be used for the
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1662 ;; next step.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1663 (and (setq next-rung-is-marked
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1664 (text-property-any next-rung-pos rung-end-pos
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1665 'c-is-sws t))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1666 safe-start))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1667
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1668 (progn
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1669 (c-debug-sws-msg
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1670 "c-forward-sws caching [%s..%s] - [%s..%s] (max %s)"
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1671 rung-pos (1+ simple-ws-end) next-rung-pos rung-end-pos
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1672 (point-max))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1673
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1674 ;; Remove the properties for any nested ws that might be cached.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1675 ;; Only necessary for `c-is-sws' since `c-in-sws' will be set
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1676 ;; anyway.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1677 (c-remove-is-sws (1+ simple-ws-end) next-rung-pos)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1678 (unless (and rung-is-marked (= rung-pos simple-ws-end))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1679 (c-put-is-sws rung-pos
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1680 (1+ simple-ws-end))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1681 (setq rung-is-marked t))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1682 (c-put-in-sws rung-pos
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1683 (setq rung-pos (point)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1684 last-put-in-sws-pos rung-pos))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1685 (unless (get-text-property (1- rung-end-pos) 'c-is-sws)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1686 ;; Remove any `c-in-sws' property from the last char of
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1687 ;; the rung before we mark it with `c-is-sws', so that we
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1688 ;; won't connect with the remains of a broken "ladder".
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1689 (c-remove-in-sws (1- rung-end-pos) rung-end-pos))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1690 (c-put-is-sws next-rung-pos
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1691 rung-end-pos))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1692
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1693 (c-debug-sws-msg
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1694 "c-forward-sws not caching [%s..%s] - [%s..%s] (max %s)"
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1695 rung-pos (1+ simple-ws-end) next-rung-pos rung-end-pos
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1696 (point-max))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1697
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1698 ;; Set `rung-pos' for the next rung. It's the same thing here as
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1699 ;; initially, except that the rung position is set as early as
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1700 ;; possible since we can't be in the ending ws of a line comment or
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1701 ;; cpp directive now.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1702 (if (setq rung-is-marked next-rung-is-marked)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1703 (setq rung-pos (1- (next-single-property-change
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1704 rung-is-marked 'c-is-sws nil rung-end-pos)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1705 (setq rung-pos next-rung-pos))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1706 (setq safe-start t)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1707
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1708 ;; Make sure that the newly marked `c-in-sws' region doesn't connect to
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1709 ;; another one after the point (which might occur when editing inside a
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1710 ;; comment or macro).
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1711 (when (eq last-put-in-sws-pos (point))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1712 (cond ((< last-put-in-sws-pos (point-max))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1713 (c-debug-sws-msg
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1714 "c-forward-sws clearing at %s for cache separation"
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1715 last-put-in-sws-pos)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1716 (c-remove-in-sws last-put-in-sws-pos
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1717 (1+ last-put-in-sws-pos)))
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
1718 (t
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1719 ;; If at eob we have to clear the last character before the end
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1720 ;; instead since the buffer might be narrowed and there might
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1721 ;; be a `c-in-sws' after (point-max). In this case it's
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1722 ;; necessary to clear both properties.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1723 (c-debug-sws-msg
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1724 "c-forward-sws clearing thoroughly at %s for cache separation"
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1725 (1- last-put-in-sws-pos))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1726 (c-remove-is-and-in-sws (1- last-put-in-sws-pos)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1727 last-put-in-sws-pos))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1728 )))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1729
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1730 (defun c-backward-sws ()
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1731 ;; Used by `c-backward-syntactic-ws' to implement the unbounded search.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1732 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1733 ;; This function might do hidden buffer changes.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1734
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1735 (let (;; `rung-pos' is set to a position as late as possible in the unmarked
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1736 ;; part of the simple ws region.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1737 (rung-pos (point)) next-rung-pos last-put-in-sws-pos
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1738 rung-is-marked simple-ws-beg cmt-skip-pos)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1739
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1740 ;; Skip simple horizontal ws and do a quick check on the preceding
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1741 ;; character to see if it's anying that can't end syntactic ws, so we can
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1742 ;; bail out early in the majority of cases when there just are a few ws
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1743 ;; chars. Newlines are complicated in the backward direction, so we can't
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1744 ;; skip over them.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1745 (skip-chars-backward " \t\f")
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1746 (when (and (not (bobp))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1747 (save-excursion
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1748 (backward-char)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1749 (looking-at c-syntactic-ws-end)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1750
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1751 ;; Try to find a rung position in the simple ws preceding point, so that
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1752 ;; we can get a cache hit even if the last bit of the simple ws has
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1753 ;; changed recently.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1754 (setq simple-ws-beg (point))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1755 (skip-chars-backward " \t\n\r\f\v")
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1756 (if (setq rung-is-marked (text-property-any
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1757 (point) (min (1+ rung-pos) (point-max))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1758 'c-is-sws t))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1759 ;; `rung-pos' will be the earliest marked position, which means that
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1760 ;; there might be later unmarked parts in the simple ws region.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1761 ;; It's not worth the effort to fix that; the last part of the
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1762 ;; simple ws is also typically edited often, so it could be wasted.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1763 (goto-char (setq rung-pos rung-is-marked))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1764 (goto-char simple-ws-beg))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1765
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1766 (while
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1767 (progn
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1768 (while
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1769 (when (and rung-is-marked
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1770 (not (bobp))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1771 (get-text-property (1- (point)) 'c-in-sws))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1772
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1773 ;; The following search is the main reason that `c-in-sws'
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1774 ;; and `c-is-sws' aren't combined to one property.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1775 (goto-char (previous-single-property-change
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1776 (point) 'c-in-sws nil (point-min)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1777 (unless (get-text-property (point) 'c-is-sws)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1778 ;; If the `c-in-sws' region extended past the first
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1779 ;; `c-is-sws' char we have to go forward a bit.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1780 (goto-char (next-single-property-change
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1781 (point) 'c-is-sws)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1782
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1783 (c-debug-sws-msg
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1784 "c-backward-sws cached move %s <- %s (min %s)"
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1785 (point) rung-pos (point-min))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1786
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1787 (setq rung-pos (point))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1788 (if (and (< (min (skip-chars-backward " \t\f\v")
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1789 (progn
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1790 (setq simple-ws-beg (point))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1791 (skip-chars-backward " \t\n\r\f\v")))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1792 0)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1793 (setq rung-is-marked
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1794 (text-property-any (point) rung-pos
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1795 'c-is-sws t)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1796 t
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1797 (goto-char simple-ws-beg)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1798 nil))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1799
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1800 ;; We'll loop here if there is simple ws before the first rung.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1801 ;; That means that there's been some change in it and it's
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1802 ;; possible that we've stepped into another ladder, so extend
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1803 ;; the previous one to join with it if there is one, and try to
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1804 ;; use the cache again.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1805 (c-debug-sws-msg
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1806 "c-backward-sws extending rung with [%s..%s] (min %s)"
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1807 rung-is-marked rung-pos (point-min))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1808 (unless (get-text-property (1- rung-pos) 'c-is-sws)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1809 ;; Remove any `c-in-sws' property from the last char of
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1810 ;; the rung before we mark it with `c-is-sws', so that we
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1811 ;; won't connect with the remains of a broken "ladder".
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1812 (c-remove-in-sws (1- rung-pos) rung-pos))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1813 (c-put-is-sws rung-is-marked
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1814 rung-pos)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1815 (c-put-in-sws rung-is-marked
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1816 (1- rung-pos))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1817 (setq rung-pos rung-is-marked
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1818 last-put-in-sws-pos rung-pos))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1819
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1820 (c-backward-comments)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1821 (setq cmt-skip-pos (point))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1822
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1823 (cond
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1824 ((and c-opt-cpp-prefix
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1825 (/= cmt-skip-pos simple-ws-beg)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1826 (c-beginning-of-macro))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1827 ;; Inside a cpp directive. See if it should be skipped over.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1828 (let ((cpp-beg (point)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1829
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1830 ;; Move back over all line continuations in the region skipped
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1831 ;; over by `c-backward-comments'. If we go past it then we
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1832 ;; started inside the cpp directive.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1833 (goto-char simple-ws-beg)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1834 (beginning-of-line)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1835 (while (and (> (point) cmt-skip-pos)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1836 (progn (backward-char)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1837 (eq (char-before) ?\\)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1838 (beginning-of-line))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1839
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1840 (if (< (point) cmt-skip-pos)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1841 ;; Don't move past the cpp directive if we began inside
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1842 ;; it. Note that the position at the end of the last line
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1843 ;; of the macro is also considered to be within it.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1844 (progn (goto-char cmt-skip-pos)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1845 nil)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1846
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1847 ;; It's worthwhile to spend a little bit of effort on finding
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1848 ;; the end of the macro, to get a good `simple-ws-beg'
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1849 ;; position for the cache. Note that `c-backward-comments'
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1850 ;; could have stepped over some comments before going into
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1851 ;; the macro, and then `simple-ws-beg' must be kept on the
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1852 ;; same side of those comments.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1853 (goto-char simple-ws-beg)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1854 (skip-chars-backward " \t\n\r\f\v")
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1855 (if (eq (char-before) ?\\)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1856 (forward-char))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1857 (forward-line 1)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1858 (if (< (point) simple-ws-beg)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1859 ;; Might happen if comments after the macro were skipped
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1860 ;; over.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1861 (setq simple-ws-beg (point)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1862
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1863 (goto-char cpp-beg)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1864 t)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1865
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1866 ((/= (save-excursion
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1867 (skip-chars-forward " \t\n\r\f\v" simple-ws-beg)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1868 (setq next-rung-pos (point)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1869 simple-ws-beg)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1870 ;; Skipped over comments. Must put point at the end of
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1871 ;; the simple ws at point since we might be after a line
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1872 ;; comment or cpp directive that's been partially
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1873 ;; narrowed out, and we can't risk marking the simple ws
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1874 ;; at the end of it.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1875 (goto-char next-rung-pos)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1876 t)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1877
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1878 ;; We've searched over a piece of non-white syntactic ws. See if this
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1879 ;; can be cached.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1880 (setq next-rung-pos (point))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1881 (skip-chars-backward " \t\f\v")
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1882
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1883 (if (or
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1884 ;; Cache if we started either from a marked rung or from a
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1885 ;; completely uncached position.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1886 rung-is-marked
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1887 (not (get-text-property (1- simple-ws-beg) 'c-in-sws))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1888
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1889 ;; Cache if there's a marked rung in the encountered simple ws.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1890 (save-excursion
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1891 (skip-chars-backward " \t\n\r\f\v")
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1892 (text-property-any (point) (min (1+ next-rung-pos) (point-max))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1893 'c-is-sws t)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1894
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1895 (progn
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1896 (c-debug-sws-msg
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1897 "c-backward-sws caching [%s..%s] - [%s..%s] (min %s)"
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1898 (point) (1+ next-rung-pos)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1899 simple-ws-beg (min (1+ rung-pos) (point-max))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1900 (point-min))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1901
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1902 ;; Remove the properties for any nested ws that might be cached.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1903 ;; Only necessary for `c-is-sws' since `c-in-sws' will be set
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1904 ;; anyway.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1905 (c-remove-is-sws (1+ next-rung-pos) simple-ws-beg)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1906 (unless (and rung-is-marked (= simple-ws-beg rung-pos))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1907 (let ((rung-end-pos (min (1+ rung-pos) (point-max))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1908 (unless (get-text-property (1- rung-end-pos) 'c-is-sws)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1909 ;; Remove any `c-in-sws' property from the last char of
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1910 ;; the rung before we mark it with `c-is-sws', so that we
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1911 ;; won't connect with the remains of a broken "ladder".
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1912 (c-remove-in-sws (1- rung-end-pos) rung-end-pos))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1913 (c-put-is-sws simple-ws-beg
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1914 rung-end-pos)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1915 (setq rung-is-marked t)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1916 (c-put-in-sws (setq simple-ws-beg (point)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1917 last-put-in-sws-pos simple-ws-beg)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1918 rung-pos)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1919 (c-put-is-sws (setq rung-pos simple-ws-beg)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1920 (1+ next-rung-pos)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1921
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1922 (c-debug-sws-msg
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1923 "c-backward-sws not caching [%s..%s] - [%s..%s] (min %s)"
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1924 (point) (1+ next-rung-pos)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1925 simple-ws-beg (min (1+ rung-pos) (point-max))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1926 (point-min))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1927 (setq rung-pos next-rung-pos
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1928 simple-ws-beg (point))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1929 ))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1930
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1931 ;; Make sure that the newly marked `c-in-sws' region doesn't connect to
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1932 ;; another one before the point (which might occur when editing inside a
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1933 ;; comment or macro).
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1934 (when (eq last-put-in-sws-pos (point))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1935 (cond ((< (point-min) last-put-in-sws-pos)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1936 (c-debug-sws-msg
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1937 "c-backward-sws clearing at %s for cache separation"
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1938 (1- last-put-in-sws-pos))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1939 (c-remove-in-sws (1- last-put-in-sws-pos)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1940 last-put-in-sws-pos))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1941 ((> (point-min) 1)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1942 ;; If at bob and the buffer is narrowed, we have to clear the
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1943 ;; character we're standing on instead since there might be a
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1944 ;; `c-in-sws' before (point-min). In this case it's necessary
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1945 ;; to clear both properties.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1946 (c-debug-sws-msg
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1947 "c-backward-sws clearing thoroughly at %s for cache separation"
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1948 last-put-in-sws-pos)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1949 (c-remove-is-and-in-sws last-put-in-sws-pos
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1950 (1+ last-put-in-sws-pos)))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
1951 )))
20914
8f189ffad604 (c-forward-syntactic-ws, c-backward-syntactic-ws):
Richard M. Stallman <rms@gnu.org>
parents: 20142
diff changeset
1952
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1953
76400
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
1954 ;; Other whitespace tools
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
1955 (defun c-partial-ws-p (beg end)
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
1956 ;; Is the region (beg end) WS, and is there WS (or BOB/EOB) next to the
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
1957 ;; region? This is a "heuristic" function. .....
79408
a29ca195b71e (c-crosses-statement-barrier-p): Fix typo in docstring.
Juanma Barranquero <lekktu@gmail.com>
parents: 78656
diff changeset
1958 ;;
76723
a68603f8b839 Fix typo.
Alan Mackenzie <acm@muc.de>
parents: 76400
diff changeset
1959 ;; The motivation for the second bit is to check whether removing this
a68603f8b839 Fix typo.
Alan Mackenzie <acm@muc.de>
parents: 76400
diff changeset
1960 ;; region would coalesce two symbols.
76400
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
1961 ;;
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
1962 ;; FIXME!!! This function doesn't check virtual semicolons in any way. Be
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
1963 ;; careful about using this function for, e.g. AWK. (2007/3/7)
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
1964 (save-excursion
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
1965 (let ((end+1 (min (1+ end) (point-max))))
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
1966 (or (progn (goto-char (max (point-min) (1- beg)))
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
1967 (c-skip-ws-forward end)
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
1968 (eq (point) end))
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
1969 (progn (goto-char beg)
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
1970 (c-skip-ws-forward end+1)
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
1971 (eq (point) end+1))))))
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
1972
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1973 ;; A system for finding noteworthy parens before the point.
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1974
106395
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
1975 (defconst c-state-cache-too-far 5000)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
1976 ;; A maximum comfortable scanning distance, e.g. between
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
1977 ;; `c-state-cache-good-pos' and "HERE" (where we call c-parse-state). When
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
1978 ;; this distance is exceeded, we take "emergency meausures", e.g. by clearing
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
1979 ;; the cache and starting again from point-min or a beginning of defun. This
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
1980 ;; value can be tuned for efficiency or set to a lower value for testing.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
1981
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1982 (defvar c-state-cache nil)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1983 (make-variable-buffer-local 'c-state-cache)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1984 ;; The state cache used by `c-parse-state' to cut down the amount of
106395
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
1985 ;; searching. It's the result from some earlier `c-parse-state' call. See
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
1986 ;; `c-parse-state''s doc string for details of its structure.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1987 ;;
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1988 ;; The use of the cached info is more effective if the next
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1989 ;; `c-parse-state' call is on a line close by the one the cached state
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1990 ;; was made at; the cache can actually slow down a little if the
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1991 ;; cached state was made very far back in the buffer. The cache is
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1992 ;; most effective if `c-parse-state' is used on each line while moving
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1993 ;; forward.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
1994
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1995 (defvar c-state-cache-good-pos 1)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
1996 (make-variable-buffer-local 'c-state-cache-good-pos)
106395
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
1997 ;; This is a position where `c-state-cache' is known to be correct, or
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
1998 ;; nil (see below). It's a position inside one of the recorded unclosed
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
1999 ;; parens or the top level, but not further nested inside any literal or
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2000 ;; subparen that is closed before the last recorded position.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
2001 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
2002 ;; The exact position is chosen to try to be close to yet earlier than
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
2003 ;; the position where `c-state-cache' will be called next. Right now
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
2004 ;; the heuristic is to set it to the position after the last found
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
2005 ;; closing paren (of any type) before the line on which
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
2006 ;; `c-parse-state' was called. That is chosen primarily to work well
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
2007 ;; with refontification of the current line.
106395
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2008 ;;
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2009 ;; 2009-07-28: When `c-state-point-min' and the last position where
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2010 ;; `c-parse-state' or for which `c-invalidate-state-cache' was called, are
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2011 ;; both in the same literal, there is no such "good position", and
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2012 ;; c-state-cache-good-pos is then nil. This is the ONLY circumstance in which
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2013 ;; it can be nil. In this case, `c-state-point-min-literal' will be non-nil.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2014 ;;
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2015 ;; 2009-06-12: In a brace desert, c-state-cache-good-pos may also be in
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2016 ;; the middle of the desert, as long as it is not within a brace pair
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2017 ;; recorded in `c-state-cache' or a paren/bracket pair.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2018
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2019
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2020 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2021 ;; We maintain a simple cache of positions which aren't in a literal, so as to
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2022 ;; speed up testing for non-literality.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2023 (defconst c-state-nonlit-pos-interval 10000)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2024 ;; The approximate interval between entries in `c-state-nonlit-pos-cache'.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2025
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2026 (defvar c-state-nonlit-pos-cache nil)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2027 (make-variable-buffer-local 'c-state-nonlit-pos-cache)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2028 ;; A list of buffer positions which are known not to be in a literal. This is
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2029 ;; ordered with higher positions at the front of the list. Only those which
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2030 ;; are less than `c-state-nonlit-pos-cache-limit' are valid.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2031
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2032 (defvar c-state-nonlit-pos-cache-limit 1)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2033 (make-variable-buffer-local 'c-state-nonlit-pos-cache-limit)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2034 ;; An upper limit on valid entries in `c-state-nonlit-pos-cache'. This is
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2035 ;; reduced by buffer changes, and increased by invocations of
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2036 ;; `c-state-literal-at'.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2037
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2038 (defsubst c-state-pp-to-literal (from to)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2039 ;; Do a parse-partial-sexp from FROM to TO, returning the bounds of any
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2040 ;; literal at TO as a cons, otherwise NIL.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2041 ;; FROM must not be in a literal, and the buffer should already be wide
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2042 ;; enough.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2043 (save-excursion
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2044 (let ((s (parse-partial-sexp from to)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2045 (when (or (nth 3 s) (nth 4 s)) ; in a string or comment
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2046 (parse-partial-sexp (point) (point-max)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2047 nil ; TARGETDEPTH
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2048 nil ; STOPBEFORE
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2049 s ; OLDSTATE
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2050 'syntax-table) ; stop at end of literal
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2051 (cons (nth 8 s) (point))))))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2052
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2053 (defun c-state-literal-at (here)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2054 ;; If position HERE is inside a literal, return (START . END), the
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2055 ;; boundaries of the literal (which may be outside the accessible bit of the
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2056 ;; buffer). Otherwise, return nil.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2057 ;;
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2058 ;; This function is almost the same as `c-literal-limits'. It differs in
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2059 ;; that it is a lower level function, and that it rigourously follows the
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2060 ;; syntax from BOB, whereas `c-literal-limits' uses a "local" safe position.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2061 (save-restriction
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2062 (widen)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2063 (save-excursion
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2064 (let ((c c-state-nonlit-pos-cache)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2065 pos npos lit)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2066 ;; Trim the cache to take account of buffer changes.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2067 (while (and c (> (car c) c-state-nonlit-pos-cache-limit))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2068 (setq c (cdr c)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2069 (setq c-state-nonlit-pos-cache c)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2070
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2071 (while (and c (> (car c) here))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2072 (setq c (cdr c)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2073 (setq pos (or (car c) (point-min)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2074
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2075 (while (<= (setq npos (+ pos c-state-nonlit-pos-interval))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2076 here)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2077 (setq lit (c-state-pp-to-literal pos npos))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2078 (setq pos (or (cdr lit) npos)) ; end of literal containing npos.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2079 (setq c-state-nonlit-pos-cache (cons pos c-state-nonlit-pos-cache)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2080
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2081 (if (> pos c-state-nonlit-pos-cache-limit)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2082 (setq c-state-nonlit-pos-cache-limit pos))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2083 (if (< pos here)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2084 (setq lit (c-state-pp-to-literal pos here)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2085 lit))))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2086
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2087 (defsubst c-state-lit-beg (pos)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2088 ;; Return the start of the literal containing POS, or POS itself.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2089 (or (car (c-state-literal-at pos))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2090 pos))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2091
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2092 (defsubst c-state-cache-non-literal-place (pos state)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2093 ;; Return a position outside of a string/comment at or before POS.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2094 ;; STATE is the parse-partial-sexp state at POS.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2095 (if (or (nth 3 state) ; in a string?
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2096 (nth 4 state)) ; in a comment?
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2097 (nth 8 state)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2098 pos))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2099
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2100
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2101 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2102 ;; Stuff to do with point-min, and coping with any literal there.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2103 (defvar c-state-point-min 1)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2104 (make-variable-buffer-local 'c-state-point-min)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2105 ;; This is (point-min) when `c-state-cache' was last calculated. A change of
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2106 ;; narrowing is likely to affect the parens that are visible before the point.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2107
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2108 (defvar c-state-point-min-lit-type nil)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2109 (make-variable-buffer-local 'c-state-point-min-lit-type)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2110 (defvar c-state-point-min-lit-start nil)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2111 (make-variable-buffer-local 'c-state-point-min-lit-start)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2112 ;; These two variables define the literal, if any, containing point-min.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2113 ;; Their values are, respectively, 'string, c, or c++, and the start of the
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2114 ;; literal. If there's no literal there, they're both nil.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2115
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2116 (defvar c-state-min-scan-pos 1)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2117 (make-variable-buffer-local 'c-state-min-scan-pos)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2118 ;; This is the earliest buffer-pos from which scanning can be done. It is
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2119 ;; either the end of the literal containing point-min, or point-min itself.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2120 ;; It becomes nil if the buffer is changed earlier than this point.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2121 (defun c-state-get-min-scan-pos ()
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2122 ;; Return the lowest valid scanning pos. This will be the end of the
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2123 ;; literal enclosing point-min, or point-min itself.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2124 (or c-state-min-scan-pos
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2125 (save-restriction
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2126 (save-excursion
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2127 (widen)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2128 (goto-char c-state-point-min-lit-start)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2129 (if (eq c-state-point-min-lit-type 'string)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2130 (forward-sexp)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2131 (forward-comment 1))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2132 (setq c-state-min-scan-pos (point))))))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2133
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2134 (defun c-state-mark-point-min-literal ()
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2135 ;; Determine the properties of any literal containing POINT-MIN, setting the
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2136 ;; variables `c-state-point-min-lit-type', `c-state-point-min-lit-start',
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2137 ;; and `c-state-min-scan-pos' accordingly. The return value is meaningless.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2138 (let ((p-min (point-min))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2139 lit)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2140 (save-restriction
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2141 (widen)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2142 (setq lit (c-state-literal-at p-min))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2143 (if lit
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2144 (setq c-state-point-min-lit-type
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2145 (save-excursion
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2146 (goto-char (car lit))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2147 (cond
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2148 ((looking-at c-block-comment-start-regexp) 'c)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2149 ((looking-at c-line-comment-starter) 'c++)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2150 (t 'string)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2151 c-state-point-min-lit-start (car lit)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2152 c-state-min-scan-pos (cdr lit))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2153 (setq c-state-point-min-lit-type nil
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2154 c-state-point-min-lit-start nil
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2155 c-state-min-scan-pos p-min)))))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2156
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2157
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2158 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2159 ;; A variable which signals a brace dessert - helpful for reducing the number
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2160 ;; of fruitless backward scans.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2161 (defvar c-state-brace-pair-desert nil)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2162 (make-variable-buffer-local 'c-state-brace-pair-desert)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2163 ;; Used only in `c-append-lower-brace-pair-to-state-cache'. It is set when an
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2164 ;; that defun has searched backwards for a brace pair and not found one. Its
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2165 ;; value is either nil or a cons (PA . FROM), where PA is the position of the
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2166 ;; enclosing opening paren/brace/bracket which bounds the backwards search (or
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2167 ;; nil when at top level) and FROM is where the backward search started. It
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2168 ;; is reset to nil in `c-invalidate-state-cache'.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2169
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2170
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2171 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2172 ;; Lowish level functions/macros which work directly on `c-state-cache', or a
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2173 ;; list of like structure.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2174 (defmacro c-state-cache-top-lparen (&optional cache)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2175 ;; Return the address of the top left brace/bracket/paren recorded in CACHE
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2176 ;; (default `c-state-cache') (or nil).
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2177 (let ((cash (or cache 'c-state-cache)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2178 `(if (consp (car ,cash))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2179 (caar ,cash)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2180 (car ,cash))))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2181
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2182 (defmacro c-state-cache-top-paren (&optional cache)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2183 ;; Return the address of the latest brace/bracket/paren (whether left or
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2184 ;; right) recorded in CACHE (default `c-state-cache') or nil.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2185 (let ((cash (or cache 'c-state-cache)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2186 `(if (consp (car ,cash))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2187 (cdar ,cash)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2188 (car ,cash))))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2189
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2190 (defmacro c-state-cache-after-top-paren (&optional cache)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2191 ;; Return the position just after the latest brace/bracket/paren (whether
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2192 ;; left or right) recorded in CACHE (default `c-state-cache') or nil.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2193 (let ((cash (or cache 'c-state-cache)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2194 `(if (consp (car ,cash))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2195 (cdar ,cash)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2196 (and (car ,cash)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2197 (1+ (car ,cash))))))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2198
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2199 (defun c-get-cache-scan-pos (here)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2200 ;; From the state-cache, determine the buffer position from which we might
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2201 ;; scan forward to HERE to update this cache. This position will be just
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2202 ;; after a paren/brace/bracket recorded in the cache, if possible, otherwise
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2203 ;; return the earliest position in the accessible region which isn't within
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2204 ;; a literal. If the visible portion of the buffer is entirely within a
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2205 ;; literal, return NIL.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2206 (let ((c c-state-cache) elt)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2207 ;(while (>= (or (c-state-cache-top-lparen c) 1) here)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2208 (while (and c
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2209 (>= (c-state-cache-top-lparen c) here))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2210 (setq c (cdr c)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2211
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2212 (setq elt (car c))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2213 (cond
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2214 ((consp elt)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2215 (if (> (cdr elt) here)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2216 (1+ (car elt))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2217 (cdr elt)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2218 (elt (1+ elt))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2219 ((<= (c-state-get-min-scan-pos) here)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2220 (c-state-get-min-scan-pos))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2221 (t nil))))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2222
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2223 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2224 ;; Variables which keep track of preprocessor constructs.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2225 (defvar c-state-old-cpp-beg nil)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2226 (make-variable-buffer-local 'c-state-old-cpp-beg)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2227 (defvar c-state-old-cpp-end nil)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2228 (make-variable-buffer-local 'c-state-old-cpp-end)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2229 ;; These are the limits of the macro containing point at the previous call of
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2230 ;; `c-parse-state', or nil.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2231
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2232 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2233 ;; Defuns which analyse the buffer, yet don't change `c-state-cache'.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2234 (defun c-get-fallback-scan-pos (here)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2235 ;; Return a start position for building `c-state-cache' from
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2236 ;; scratch. This will be at the top level, 2 defuns back.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
2237 (save-excursion
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
2238 ;; Go back 2 bods, but ignore any bogus positions returned by
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
2239 ;; beginning-of-defun (i.e. open paren in column zero).
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
2240 (goto-char here)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
2241 (let ((cnt 2))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
2242 (while (not (or (bobp) (zerop cnt)))
106395
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2243 (c-beginning-of-defun-1) ; Pure elisp BOD.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
2244 (if (eq (char-after) ?\{)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
2245 (setq cnt (1- cnt)))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
2246 (point)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
2247
106395
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2248 (defun c-state-balance-parens-backwards (here top)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2249 ;; Return the position of the opening paren/brace/bracket before HERE which
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2250 ;; matches the outermost close p/b/b between HERE and TOP, like this:
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2251 ;;
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2252 ;; ......................................
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2253 ;; | |
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2254 ;; ( [ ( ........... ) ( ) ] )
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2255 ;; ^ ^ ^
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2256 ;; | | |
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2257 ;; return HERE TOP
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2258 ;;
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2259 ;; If there aren't enough opening paren/brace/brackets, return the position
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2260 ;; of the outermost one found, or HERE it there are none. If there are no
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2261 ;; closeing p/b/bs between HERE and TOP, return HERE. HERE and TOP must not
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2262 ;; be inside literals. Only the accessible portion of the buffer will be
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2263 ;; scanned.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2264
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2265 ;; PART 1: scan from `here' up to `top', accumulating ")"s which enclose
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2266 ;; `here'. Go round the next loop each time we pass over such a ")". These
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2267 ;; probably match "("s before `here'.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2268 (let (pos pa ren+1 lonely-rens)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2269 (save-excursion
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2270 (save-restriction
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2271 (narrow-to-region (point-min) top) ; This can move point, sometimes.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2272 (setq pos here)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2273 (c-safe
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2274 (while
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2275 (setq ren+1 (scan-lists pos 1 1)) ; might signal
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2276 (setq lonely-rens (cons ren+1 lonely-rens)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2277 pos ren+1)))))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2278
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2279 ;; PART 2: Scan back before `here' searching for the "("s
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2280 ;; matching/mismatching the ")"s found above. We only need to direct the
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2281 ;; caller to scan when we've encountered unmatched right parens.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2282 (when lonely-rens
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2283 (setq pos here)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2284 (c-safe
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2285 (while
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2286 (and lonely-rens ; actual values aren't used.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2287 (setq pa (scan-lists pos -1 1)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2288 (setq pos pa)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2289 (setq lonely-rens (cdr lonely-rens)))) ;)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2290 )
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2291 pos))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2292
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2293 (defun c-parse-state-get-strategy (here good-pos)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2294 ;; Determine the scanning strategy for adjusting `c-parse-state', attempting
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2295 ;; to minimise the amount of scanning. HERE is the pertinent position in
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2296 ;; the buffer, GOOD-POS is a position where `c-state-cache' (possibly with
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2297 ;; its head trimmed) is known to be good, or nil if there is no such
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2298 ;; position.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2299 ;;
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2300 ;; The return value is a list, one of the following:
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2301 ;;
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2302 ;; o - ('forward CACHE-POS START-POINT) - scan forward from START-POINT,
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2303 ;; which is not less than CACHE-POS.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2304 ;; o - ('backward CACHE-POS nil) - scan backwards (from HERE).
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2305 ;; o - ('BOD nil START-POINT) - scan forwards from START-POINT, which is at the
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2306 ;; top level.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2307 ;; o - ('IN-LIT nil nil) - point is inside the literal containing point-min.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2308 ;; , where CACHE-POS is the highest position recorded in `c-state-cache' at
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2309 ;; or below HERE.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2310 (let ((cache-pos (c-get-cache-scan-pos here)) ; highest position below HERE in cache (or 1)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2311 BOD-pos ; position of 2nd BOD before HERE.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2312 strategy ; 'forward, 'backward, 'BOD, or 'IN-LIT.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2313 start-point
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2314 how-far) ; putative scanning distance.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2315 (setq good-pos (or good-pos (c-state-get-min-scan-pos)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2316 (cond
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2317 ((< here (c-state-get-min-scan-pos))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2318 (setq strategy 'IN-LIT
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2319 start-point nil
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2320 cache-pos nil
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2321 how-far 0))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2322 ((<= good-pos here)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2323 (setq strategy 'forward
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2324 start-point (max good-pos cache-pos)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2325 how-far (- here start-point)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2326 ((< (- good-pos here) (- here cache-pos)) ; FIXME!!! ; apply some sort of weighting.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2327 (setq strategy 'backward
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2328 how-far (- good-pos here)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2329 (t
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2330 (setq strategy 'forward
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2331 how-far (- here cache-pos)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2332 start-point cache-pos)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2333
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2334 ;; Might we be better off starting from the top level, two defuns back,
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2335 ;; instead?
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2336 (when (> how-far c-state-cache-too-far)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2337 (setq BOD-pos (c-get-fallback-scan-pos here)) ; somewhat EXPENSIVE!!!
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2338 (if (< (- here BOD-pos) how-far)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2339 (setq strategy 'BOD
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2340 start-point BOD-pos)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2341
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2342 (list
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2343 strategy
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2344 (and (memq strategy '(forward backward)) cache-pos)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2345 (and (memq strategy '(forward BOD)) start-point))))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2346
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2347
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2348 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2349 ;; Routines which change `c-state-cache' and associated values.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2350 (defun c-renarrow-state-cache ()
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2351 ;; The region (more precisely, point-min) has changed since we
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2352 ;; calculated `c-state-cache'. Amend `c-state-cache' accordingly.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2353 (if (< (point-min) c-state-point-min)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2354 ;; If point-min has MOVED BACKWARDS then we drop the state completely.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2355 ;; It would be possible to do a better job here and recalculate the top
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2356 ;; only.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2357 (progn
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2358 (c-state-mark-point-min-literal)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2359 (setq c-state-cache nil
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2360 c-state-cache-good-pos c-state-min-scan-pos
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2361 c-state-brace-pair-desert nil))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2362
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2363 ;; point-min has MOVED FORWARD.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2364
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2365 ;; Is the new point-min inside a (different) literal?
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2366 (unless (and c-state-point-min-lit-start ; at prev. point-min
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2367 (< (point-min) (c-state-get-min-scan-pos)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2368 (c-state-mark-point-min-literal))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2369
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2370 ;; Cut off a bit of the tail from `c-state-cache'.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2371 (let ((ptr (cons nil c-state-cache))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2372 pa)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2373 (while (and (setq pa (c-state-cache-top-lparen (cdr ptr)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2374 (>= pa (point-min)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2375 (setq ptr (cdr ptr)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2376
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2377 (when (consp ptr)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2378 (if (eq (cdr ptr) c-state-cache)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2379 (setq c-state-cache nil
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2380 c-state-cache-good-pos c-state-min-scan-pos)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2381 (setcdr ptr nil)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2382 (setq c-state-cache-good-pos (1+ (c-state-cache-top-lparen))))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2383 )))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2384
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2385 (setq c-state-point-min (point-min)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2386
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2387 (defun c-append-lower-brace-pair-to-state-cache (from &optional upper-lim)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2388 ;; If there is a brace pair preceding FROM in the buffer (not necessarily
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2389 ;; immediately preceding), push a cons onto `c-state-cache' to represent it.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2390 ;; FROM must not be inside a literal. If UPPER-LIM is non-nil, we append
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2391 ;; the highest brace pair whose "}" is below UPPER-LIM.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2392 ;;
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2393 ;; Return non-nil when this has been done.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2394 ;;
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2395 ;; This routine should be fast. Since it can get called a LOT, we maintain
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2396 ;; `c-state-brace-pair-desert', a small cache of "failures", such that we
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2397 ;; reduce the time wasted in repeated fruitless searches in brace deserts.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2398 (save-excursion
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2399 (save-restriction
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2400 (let ((bra from) ce ; Positions of "{" and "}".
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2401 new-cons
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2402 (cache-pos (c-state-cache-top-lparen)) ; might be nil.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2403 (macro-start-or-from
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2404 (progn (goto-char from)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2405 (c-beginning-of-macro)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2406 (point))))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2407 (or upper-lim (setq upper-lim from))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2408
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2409 ;; If we're essentially repeating a fruitless search, just give up.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2410 (unless (and c-state-brace-pair-desert
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2411 (eq cache-pos (car c-state-brace-pair-desert))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2412 (<= from (cdr c-state-brace-pair-desert)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2413 ;; Only search what we absolutely need to:
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2414 (if (and c-state-brace-pair-desert
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2415 (> from (cdr c-state-brace-pair-desert)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2416 (narrow-to-region (cdr c-state-brace-pair-desert) (point-max)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2417
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2418 ;; In the next pair of nested loops, the inner one moves back past a
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2419 ;; pair of (mis-)matching parens or brackets; the outer one moves
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2420 ;; back over a sequence of unmatched close brace/paren/bracket each
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2421 ;; time round.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2422 (while
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2423 (progn
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2424 (c-safe
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2425 (while
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2426 (and (setq ce (scan-lists bra -1 -1)) ; back past )/]/}; might signal
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2427 (setq bra (scan-lists ce -1 1)) ; back past (/[/{; might signal
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2428 (or (> ce upper-lim)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2429 (not (eq (char-after bra) ?\{))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2430 (and (goto-char bra)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2431 (c-beginning-of-macro)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2432 (< (point) macro-start-or-from))))))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2433 (and ce (< ce bra)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2434 (setq bra ce)) ; If we just backed over an unbalanced closing
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2435 ; brace, ignore it.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2436
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2437 (if (and ce (< bra ce) (eq (char-after bra) ?\{))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2438 ;; We've found the desired brace-pair.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2439 (progn
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2440 (setq new-cons (cons bra (1+ ce)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2441 (cond
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2442 ((consp (car c-state-cache))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2443 (setcar c-state-cache new-cons))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2444 ((and (numberp (car c-state-cache)) ; probably never happens
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2445 (< ce (car c-state-cache)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2446 (setcdr c-state-cache
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2447 (cons new-cons (cdr c-state-cache))))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2448 (t (setq c-state-cache (cons new-cons c-state-cache)))))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2449
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2450 ;; We haven't found a brace pair. Record this.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2451 (setq c-state-brace-pair-desert (cons cache-pos from))))))))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2452
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2453 (defsubst c-state-push-any-brace-pair (bra+1 macro-start-or-here)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2454 ;; If BRA+1 is nil, do nothing. Otherwise, BRA+1 is the buffer position
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2455 ;; following a {, and that brace has a (mis-)matching } (or ]), and we
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2456 ;; "push" "a" brace pair onto `c-state-cache'.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2457 ;;
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2458 ;; Here "push" means overwrite the top element if it's itself a brace-pair,
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2459 ;; otherwise push it normally.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2460 ;;
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2461 ;; The brace pair we push is normally the one surrounding BRA+1, but if the
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2462 ;; latter is inside a macro, not being a macro containing
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2463 ;; MACRO-START-OR-HERE, we scan backwards through the buffer for a non-macro
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2464 ;; base pair. This latter case is assumed to be rare.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2465 ;;
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2466 ;; Note: POINT is not preserved in this routine.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2467 (if bra+1
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2468 (if (or (> bra+1 macro-start-or-here)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2469 (progn (goto-char bra+1)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2470 (not (c-beginning-of-macro))))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2471 (setq c-state-cache
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2472 (cons (cons (1- bra+1)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2473 (scan-lists bra+1 1 1))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2474 (if (consp (car c-state-cache))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2475 (cdr c-state-cache)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2476 c-state-cache)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2477 ;; N.B. This defsubst codes one method for the simple, normal case,
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2478 ;; and a more sophisticated, slower way for the general case. Don't
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2479 ;; eliminate this defsubst - it's a speed optimisation.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2480 (c-append-lower-brace-pair-to-state-cache (1- bra+1)))))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2481
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2482 (defun c-append-to-state-cache (from)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2483 ;; Scan the buffer from FROM to (point-max), adding elements into
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2484 ;; `c-state-cache' for braces etc. Return a candidate for
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2485 ;; `c-state-cache-good-pos'.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2486 ;;
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2487 ;; FROM must be after the latest brace/paren/bracket in `c-state-cache', if
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2488 ;; any. Typically, it is immediately after it. It must not be inside a
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2489 ;; literal.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2490 (let ((here-bol (c-point 'bol (point-max)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2491 (macro-start-or-here
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2492 (save-excursion (goto-char (point-max))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2493 (if (c-beginning-of-macro)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2494 (point)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2495 (point-max))))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2496 pa+1 ; pos just after an opening PAren (or brace).
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2497 (ren+1 from) ; usually a pos just after an closing paREN etc.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2498 ; Is actually the pos. to scan for a (/{/[ from,
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2499 ; which sometimes is after a silly )/}/].
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2500 paren+1 ; Pos after some opening or closing paren.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2501 paren+1s ; A list of `paren+1's; used to determine a
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2502 ; good-pos.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2503 bra+1 ce+1 ; just after L/R bra-ces.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2504 bra+1s ; list of OLD values of bra+1.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2505 mstart) ; start of a macro.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2506
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2507 (save-excursion
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2508 ;; Each time round the following loop, we enter a succesively deeper
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2509 ;; level of brace/paren nesting. (Except sometimes we "continue at
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2510 ;; the existing level".) `pa+1' is a pos inside an opening
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2511 ;; brace/paren/bracket, usually just after it.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2512 (while
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2513 (progn
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2514 ;; Each time round the next loop moves forward over an opening then
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2515 ;; a closing brace/bracket/paren. This loop is white hot, so it
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2516 ;; plays ugly tricks to go fast. DON'T PUT ANYTHING INTO THIS
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2517 ;; LOOP WHICH ISN'T ABSOLUTELY NECESSARY!!! It terminates when a
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2518 ;; call of `scan-lists' signals an error, which happens when there
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2519 ;; are no more b/b/p's to scan.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2520 (c-safe
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2521 (while t
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2522 (setq pa+1 (scan-lists ren+1 1 -1) ; Into (/{/[; might signal
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2523 paren+1s (cons pa+1 paren+1s))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2524 (setq ren+1 (scan-lists pa+1 1 1)) ; Out of )/}/]; might signal
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2525 (if (and (eq (char-before pa+1) ?{)) ; Check for a macro later.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2526 (setq bra+1 pa+1))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2527 (setcar paren+1s ren+1)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2528
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2529 (if (and pa+1 (> pa+1 ren+1))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2530 ;; We've just entered a deeper nesting level.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2531 (progn
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2532 ;; Insert the brace pair (if present) and the single open
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2533 ;; paren/brace/bracket into `c-state-cache' It cannot be
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2534 ;; inside a macro, except one around point, because of what
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2535 ;; `c-neutralize-syntax-in-CPP' has done.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2536 (c-state-push-any-brace-pair bra+1 macro-start-or-here)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2537 ;; Insert the opening brace/bracket/paren position.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2538 (setq c-state-cache (cons (1- pa+1) c-state-cache))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2539 ;; Clear admin stuff for the next more nested part of the scan.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2540 (setq ren+1 pa+1 pa+1 nil bra+1 nil bra+1s nil)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2541 t) ; Carry on the loop
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2542
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2543 ;; All open p/b/b's at this nesting level, if any, have probably
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2544 ;; been closed by matching/mismatching ones. We're probably
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2545 ;; finished - we just need to check for having found an
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2546 ;; unmatched )/}/], which we ignore. Such a )/}/] can't be in a
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2547 ;; macro, due the action of `c-neutralize-syntax-in-CPP'.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2548 (c-safe (setq ren+1 (scan-lists ren+1 1 1)))))) ; acts as loop control.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2549
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2550 ;; Record the final, innermost, brace-pair if there is one.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2551 (c-state-push-any-brace-pair bra+1 macro-start-or-here)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2552
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2553 ;; Determine a good pos
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2554 (while (and (setq paren+1 (car paren+1s))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2555 (> (if (> paren+1 macro-start-or-here)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2556 paren+1
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2557 (goto-char paren+1)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2558 (setq mstart (and (c-beginning-of-macro)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2559 (point)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2560 (or mstart paren+1))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2561 here-bol))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2562 (setq paren+1s (cdr paren+1s)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2563 (cond
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2564 ((and paren+1 mstart)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2565 (min paren+1 mstart))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2566 (paren+1)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2567 (t from)))))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2568
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2569 (defun c-remove-stale-state-cache (good-pos pps-point)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2570 ;; Remove stale entries from the `c-cache-state', i.e. those which will
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2571 ;; not be in it when it is amended for position (point-max).
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2572 ;; Additionally, the "outermost" open-brace entry before (point-max)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2573 ;; will be converted to a cons if the matching close-brace is scanned.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2574 ;;
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2575 ;; GOOD-POS is a "maximal" "safe position" - there must be no open
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2576 ;; parens/braces/brackets between GOOD-POS and (point-max).
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2577 ;;
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2578 ;; As a second thing, calculate the result of parse-partial-sexp at
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2579 ;; PPS-POINT, w.r.t. GOOD-POS. The motivation here is that
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2580 ;; `c-state-cache-good-pos' may become PPS-POINT, but the caller may need to
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2581 ;; adjust it to get outside a string/comment. (Sorry about this! The code
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2582 ;; needs to be FAST).
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2583 ;;
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2584 ;; Return a list (GOOD-POS SCAN-BACK-POS PPS-STATE), where
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2585 ;; o - GOOD-POS is a position where the new value `c-state-cache' is known
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2586 ;; to be good (we aim for this to be as high as possible);
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2587 ;; o - SCAN-BACK-POS, if not nil, indicates there may be a brace pair
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2588 ;; preceding POS which needs to be recorded in `c-state-cache'. It is a
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2589 ;; position to scan backwards from.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2590 ;; o - PPS-STATE is the parse-partial-sexp state at PPS-POINT.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2591 (save-restriction
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2592 (narrow-to-region 1 (point-max))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2593 (save-excursion
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2594 (let* ((in-macro-start ; point-max or beginning of macro containing it
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2595 (save-excursion
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2596 (goto-char (point-max))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2597 (and (c-beginning-of-macro)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2598 (point))))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2599 (good-pos-actual-macro-start ; Start of macro containing good-pos
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2600 ; or nil
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2601 (and (< good-pos (point-max))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2602 (save-excursion
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2603 (goto-char good-pos)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2604 (and (c-beginning-of-macro)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2605 (point)))))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2606 (good-pos-actual-macro-end ; End of this macro, (maybe
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2607 ; (point-max)), or nil.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2608 (and good-pos-actual-macro-start
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2609 (save-excursion
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2610 (goto-char good-pos-actual-macro-start)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2611 (c-end-of-macro)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2612 (point))))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2613 pps-state ; Will be 9 or 10 elements long.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2614 pos
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2615 upper-lim ; ,beyond which `c-state-cache' entries are removed
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2616 scan-back-pos
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2617 pair-beg pps-point-state target-depth)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2618
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2619 ;; Remove entries beyond (point-max). Also remove any entries inside
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2620 ;; a macro, unless (point-max) is in the same macro.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2621 (setq upper-lim
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2622 (if (or (null c-state-old-cpp-beg)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2623 (and (> (point-max) c-state-old-cpp-beg)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2624 (< (point-max) c-state-old-cpp-end)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2625 (point-max)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2626 (min (point-max) c-state-old-cpp-beg)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2627 (while (and c-state-cache (> (c-state-cache-top-lparen) upper-lim))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2628 (setq c-state-cache (cdr c-state-cache)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2629 ;; If `upper-lim' is inside the last recorded brace pair, remove its
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2630 ;; RBrace and indicate we'll need to search backwards for a previous
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2631 ;; brace pair.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2632 (when (and c-state-cache
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2633 (consp (car c-state-cache))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2634 (> (cdar c-state-cache) upper-lim))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2635 (setcar c-state-cache (caar c-state-cache))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2636 (setq scan-back-pos (car c-state-cache)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2637
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2638 ;; The next loop jumps forward out of a nested level of parens each
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2639 ;; time round; the corresponding elements in `c-state-cache' are
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2640 ;; removed. `pos' is just after the brace-pair or the open paren at
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2641 ;; (car c-state-cache). There can be no open parens/braces/brackets
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2642 ;; between `good-pos'/`good-pos-actual-macro-start' and (point-max),
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2643 ;; due to the interface spec to this function.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2644 (setq pos (if good-pos-actual-macro-end
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2645 (1+ good-pos-actual-macro-end) ; get outside the macro as
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2646 ; marked by a `category' text property.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2647 good-pos))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2648 (goto-char pos)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2649 (while (and c-state-cache
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2650 (< (point) (point-max)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2651 (cond
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2652 ((null pps-state) ; first time through
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2653 (setq target-depth -1))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2654 ((eq (car pps-state) target-depth) ; found closing ),},]
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2655 (setq target-depth (1- (car pps-state))))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2656 ;; Do nothing when we've merely reached pps-point.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2657 )
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2658
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2659 ;; Scan!
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2660 (setq pps-state
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2661 (parse-partial-sexp
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2662 (point) (if (< (point) pps-point) pps-point (point-max))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2663 target-depth
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2664 nil pps-state))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2665
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2666 (if (= (point) pps-point)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2667 (setq pps-point-state pps-state))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2668
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2669 (when (eq (car pps-state) target-depth)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2670 (setq pos (point)) ; POS is now just after an R-paren/brace.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2671 (cond
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2672 ((and (consp (car c-state-cache))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2673 (eq (point) (cdar c-state-cache)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2674 ;; We've just moved out of the paren pair containing the brace-pair
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2675 ;; at (car c-state-cache). `pair-beg' is where the open paren is,
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2676 ;; and is potentially where the open brace of a cons in
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2677 ;; c-state-cache will be.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2678 (setq pair-beg (car-safe (cdr c-state-cache))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2679 c-state-cache (cdr-safe (cdr c-state-cache)))) ; remove {}pair + containing Lparen.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2680 ((numberp (car c-state-cache))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2681 (setq pair-beg (car c-state-cache)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2682 c-state-cache (cdr c-state-cache))) ; remove this
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2683 ; containing Lparen
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2684 ((numberp (cadr c-state-cache))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2685 (setq pair-beg (cadr c-state-cache)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2686 c-state-cache (cddr c-state-cache))) ; Remove a paren pair
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2687 ; together with enclosed brace pair.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2688 ;; (t nil) ; Ignore an unmated Rparen.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2689 )))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2690
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2691 (if (< (point) pps-point)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2692 (setq pps-state (parse-partial-sexp (point) pps-point
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2693 nil nil ; TARGETDEPTH, STOPBEFORE
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2694 pps-state)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2695
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2696 ;; If the last paren pair we moved out of was actually a brace pair,
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2697 ;; insert it into `c-state-cache'.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2698 (when (and pair-beg (eq (char-after pair-beg) ?{))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2699 (if (consp (car-safe c-state-cache))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2700 (setq c-state-cache (cdr c-state-cache)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2701 (setq c-state-cache (cons (cons pair-beg pos)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2702 c-state-cache)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2703
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2704 (list pos scan-back-pos pps-state)))))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2705
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2706 (defun c-remove-stale-state-cache-backwards (here cache-pos)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2707 ;; Strip stale elements of `c-state-cache' by moving backwards through the
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2708 ;; buffer, and inform the caller of the scenario detected.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2709 ;;
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2710 ;; HERE is the position we're setting `c-state-cache' for.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2711 ;; CACHE-POS is just after the latest recorded position in `c-state-cache'
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2712 ;; before HERE, or a position at or near point-min which isn't in a
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2713 ;; literal.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2714 ;;
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2715 ;; This function must only be called only when (> `c-state-cache-good-pos'
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2716 ;; HERE). Usually the gap between CACHE-POS and HERE is large. It is thus
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2717 ;; optimised to eliminate (or minimise) scanning between these two
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2718 ;; positions.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2719 ;;
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2720 ;; Return a three element list (GOOD-POS SCAN-BACK-POS FWD-FLAG), where:
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2721 ;; o - GOOD-POS is a "good position", where `c-state-cache' is valid, or
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2722 ;; could become so after missing elements are inserted into
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2723 ;; `c-state-cache'. This is JUST AFTER an opening or closing
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2724 ;; brace/paren/bracket which is already in `c-state-cache' or just before
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2725 ;; one otherwise. exceptionally (when there's no such b/p/b handy) the BOL
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2726 ;; before `here''s line, or the start of the literal containing it.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2727 ;; o - SCAN-BACK-POS, if non-nil, indicates there may be a brace pair
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2728 ;; preceding POS which isn't recorded in `c-state-cache'. It is a position
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2729 ;; to scan backwards from.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2730 ;; o - FWD-FLAG, if non-nil, indicates there may be parens/braces between
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2731 ;; POS and HERE which aren't recorded in `c-state-cache'.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2732 ;;
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2733 ;; The comments in this defun use "paren" to mean parenthesis or square
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2734 ;; bracket (as contrasted with a brace), and "(" and ")" likewise.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2735 ;;
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2736 ;; . {..} (..) (..) ( .. { } ) (...) ( .... . ..)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2737 ;; | | | | | |
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2738 ;; CP E here D C good
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2739 (let ((pos c-state-cache-good-pos)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2740 pa ren ; positions of "(" and ")"
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2741 dropped-cons ; whether the last element dropped from `c-state-cache'
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2742 ; was a cons (representing a brace-pair)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2743 good-pos ; see above.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2744 lit ; (START . END) of a literal containing some point.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2745 here-lit-start here-lit-end ; bounds of literal containing `here'
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2746 ; or `here' itself.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2747 (here-bol (c-point 'bol here))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2748 (too-far-back (max (- here c-state-cache-too-far) 1)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2749
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2750 ;; Remove completely irrelevant entries from `c-state-cache'.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2751 (while (and c-state-cache
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2752 (>= (setq pa (c-state-cache-top-lparen)) here))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2753 (setq dropped-cons (consp (car c-state-cache)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2754 (setq c-state-cache (cdr c-state-cache))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2755 (setq pos pa))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2756 ;; At this stage, (> pos here);
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2757 ;; (< (c-state-cache-top-lparen) here) (or is nil).
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2758
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2759 ;; CASE 1: The top of the cache is a brace pair which now encloses `here'.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2760 ;; As good-pos, return the address. of the "{".
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2761 (if (and (consp (car c-state-cache))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2762 (> (cdar c-state-cache) here))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2763 ;; Since we've no knowledge of what's inside these braces, we have no
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2764 ;; alternative but to direct the caller to scan the buffer from the
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2765 ;; opening brace.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2766 (progn
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2767 (setq pos (caar c-state-cache))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2768 (setcar c-state-cache pos)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2769 (list (1+ pos) pos t)) ; return value. We've just converted a brace
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2770 ; pair entry into a { entry, so the caller
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2771 ; needs to search for a brace pair before the
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2772 ; {.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2773
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2774 ;; ;; `here' might be inside a literal. Check for this.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2775 (setq lit (c-state-literal-at here)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2776 here-lit-start (or (car lit) here)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2777 here-lit-end (or (cdr lit) here))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2778
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2779 ;; `here' might be nested inside any depth of parens (or brackets but
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2780 ;; not braces). Scan backwards to find the outermost such opening
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2781 ;; paren, if there is one. This will be the scan position to return.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2782 (save-restriction
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2783 (narrow-to-region cache-pos (point-max))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2784 (setq pos (c-state-balance-parens-backwards here-lit-end pos)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2785
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2786 (if (< pos here-lit-start)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2787 ;; CASE 2: Address of outermost ( or [ which now encloses `here',
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2788 ;; but didn't enclose the (previous) `c-state-cache-good-pos'. If
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2789 ;; there is a brace pair preceding this, it will already be in
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2790 ;; `c-state-cache', unless there was a brace pair after it,
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2791 ;; i.e. there'll only be one to scan for if we've just deleted one.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2792 (list pos (and dropped-cons pos) t) ; Return value.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2793
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2794 ;; `here' isn't enclosed in a (previously unrecorded) bracket/paren.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2795 ;; Further forward scanning isn't needed, but we still need to find a
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2796 ;; GOOD-POS. Step out of all enclosing "("s on HERE's line.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2797 (save-restriction
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2798 (narrow-to-region here-bol (point-max))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2799 (setq pos here-lit-start)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2800 (c-safe (while (setq pa (scan-lists pos -1 1))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2801 (setq pos pa)))) ; might signal
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2802 (if (setq ren (c-safe-scan-lists pos -1 -1 too-far-back))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2803 ;; CASE 3: After a }/)/] before `here''s BOL.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2804 (list (1+ ren) (and dropped-cons pos) nil) ; Return value
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2805
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2806 ;; CASE 4; Best of a bad job: BOL before `here-bol', or beginning of
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2807 ;; literal containing it.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2808 (setq good-pos (c-state-lit-beg (c-point 'bopl here-bol)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2809 (list good-pos (and dropped-cons good-pos) nil))))))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2810
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2811
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2812 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2813 ;; Externally visible routines.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2814
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2815 (defun c-state-cache-init ()
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2816 (setq c-state-cache nil
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2817 c-state-cache-good-pos 1
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2818 c-state-nonlit-pos-cache nil
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2819 c-state-nonlit-pos-cache-limit 1
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2820 c-state-brace-pair-desert nil
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2821 c-state-point-min 1
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2822 c-state-point-min-lit-type nil
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2823 c-state-point-min-lit-start nil
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2824 c-state-min-scan-pos 1
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2825 c-state-old-cpp-beg nil
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2826 c-state-old-cpp-end nil)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2827 (c-state-mark-point-min-literal))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2828
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2829 (defun c-invalidate-state-cache-1 (here)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2830 ;; Invalidate all info on `c-state-cache' that applies to the buffer at HERE
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2831 ;; or higher and set `c-state-cache-good-pos' accordingly. The cache is
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2832 ;; left in a consistent state.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2833 ;;
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2834 ;; This is much like `c-whack-state-after', but it never changes a paren
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2835 ;; pair element into an open paren element. Doing that would mean that the
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2836 ;; new open paren wouldn't have the required preceding paren pair element.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2837 ;;
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2838 ;; This function is called from c-after-change.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2839
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2840 ;; The cache of non-literals:
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2841 (if (< here c-state-nonlit-pos-cache-limit)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2842 (setq c-state-nonlit-pos-cache-limit here))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2843
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2844 ;; `c-state-cache':
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2845 ;; Case 1: if `here' is in a literal containing point-min, everything
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2846 ;; becomes (or is already) nil.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2847 (if (or (null c-state-cache-good-pos)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2848 (< here (c-state-get-min-scan-pos)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2849 (setq c-state-cache nil
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2850 c-state-cache-good-pos nil
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2851 c-state-min-scan-pos nil)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2852
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2853 ;;; Truncate `c-state-cache' and set `c-state-cache-good-pos' to a value below
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2854 ;;; `here'. To maintain its consistency, we may need to insert a new brace
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2855 ;;; pair.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2856 (let ((here-bol (c-point 'bol here))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2857 too-high-pa ; recorded {/(/[ next above here, or nil.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2858 dropped-cons ; was the last removed element a brace pair?
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2859 pa)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2860 ;; The easy bit - knock over-the-top bits off `c-state-cache'.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2861 (while (and c-state-cache
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2862 (>= (setq pa (c-state-cache-top-paren)) here))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2863 (setq dropped-cons (consp (car c-state-cache))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2864 too-high-pa (c-state-cache-top-lparen)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2865 c-state-cache (cdr c-state-cache)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2866
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2867 ;; Do we need to add in an earlier brace pair, having lopped one off?
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2868 (if (and dropped-cons
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2869 (< too-high-pa (+ here c-state-cache-too-far)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2870 (c-append-lower-brace-pair-to-state-cache too-high-pa here-bol))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2871 (setq c-state-cache-good-pos (or (c-state-cache-after-top-paren)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2872 (c-state-get-min-scan-pos)))))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2873
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2874 ;; The brace-pair desert marker:
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2875 (when (car c-state-brace-pair-desert)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2876 (if (< here (car c-state-brace-pair-desert))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2877 (setq c-state-brace-pair-desert nil)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2878 (if (< here (cdr c-state-brace-pair-desert))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2879 (setcdr c-state-brace-pair-desert here)))))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2880
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2881 (defun c-parse-state-1 ()
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2882 ;; Find and record all noteworthy parens between some good point earlier in
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2883 ;; the file and point. That good point is at least the beginning of the
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2884 ;; top-level construct we are in, or the beginning of the preceding
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2885 ;; top-level construct if we aren't in one.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2886 ;;
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2887 ;; The returned value is a list of the noteworthy parens with the last one
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2888 ;; first. If an element in the list is an integer, it's the position of an
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2889 ;; open paren (of any type) which has not been closed before the point. If
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2890 ;; an element is a cons, it gives the position of a closed BRACE paren
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2891 ;; pair[*]; the car is the start brace position and the cdr is the position
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2892 ;; following the closing brace. Only the last closed brace paren pair
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2893 ;; before each open paren and before the point is recorded, and thus the
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2894 ;; state never contains two cons elements in succession. When a close brace
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2895 ;; has no matching open brace (e.g., the matching brace is outside the
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2896 ;; visible region), it is not represented in the returned value.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2897 ;;
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2898 ;; [*] N.B. The close "brace" might be a mismatching close bracket or paren.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2899 ;; This defun explicitly treats mismatching parens/braces/brackets as
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2900 ;; matching. It is the open brace which makes it a "brace" pair.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2901 ;;
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2902 ;; If POINT is within a macro, open parens and brace pairs within
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2903 ;; THIS macro MIGHT be recorded. This depends on whether their
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2904 ;; syntactic properties have been suppressed by
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2905 ;; `c-neutralize-syntax-in-CPP'. This might need fixing (2008-12-11).
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
2906 ;;
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
2907 ;; Currently no characters which are given paren syntax with the
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
2908 ;; syntax-table property are recorded, i.e. angle bracket arglist
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
2909 ;; parens are never present here. Note that this might change.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
2910 ;;
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
2911 ;; BUG: This function doesn't cope entirely well with unbalanced
106395
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2912 ;; parens in macros. (2008-12-11: this has probably been resolved
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2913 ;; by the function `c-neutralize-syntax-in-CPP'.) E.g. in the
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2914 ;; following case the brace before the macro isn't balanced with the
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2915 ;; one after it:
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
2916 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
2917 ;; {
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
2918 ;; #define X {
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
2919 ;; }
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
2920 ;;
106395
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2921 ;; Note to maintainers: this function DOES get called with point
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2922 ;; within comments and strings, so don't assume it doesn't!
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2923 ;;
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
2924 ;; This function might do hidden buffer changes.
106395
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2925 (let* ((here (point))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2926 (here-bopl (c-point 'bopl))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2927 strategy ; 'forward, 'backward etc..
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2928 ;; Candidate positions to start scanning from:
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2929 cache-pos ; highest position below HERE already existing in
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2930 ; cache (or 1).
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2931 good-pos
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2932 start-point
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2933 bopl-state
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2934 res
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2935 scan-backward-pos scan-forward-p) ; used for 'backward.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2936 ;; If POINT-MIN has changed, adjust the cache
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2937 (unless (= (point-min) c-state-point-min)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2938 (c-renarrow-state-cache))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2939
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2940 ;; Strategy?
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2941 (setq res (c-parse-state-get-strategy here c-state-cache-good-pos)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2942 strategy (car res)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2943 cache-pos (cadr res)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2944 start-point (nth 2 res))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2945
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2946 (when (eq strategy 'BOD)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2947 (setq c-state-cache nil
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2948 c-state-cache-good-pos start-point))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2949
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2950 ;; SCAN!
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2951 (save-restriction
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2952 (cond
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2953 ((memq strategy '(forward BOD))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
2954 (narrow-to-region (point-min) here)
106395
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2955 (setq res (c-remove-stale-state-cache start-point here-bopl))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2956 (setq cache-pos (car res)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2957 scan-backward-pos (cadr res)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2958 bopl-state (car (cddr res))) ; will be nil if (< here-bopl
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2959 ; start-point)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2960 (if scan-backward-pos
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2961 (c-append-lower-brace-pair-to-state-cache scan-backward-pos))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2962 (setq good-pos
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2963 (c-append-to-state-cache cache-pos))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2964 (setq c-state-cache-good-pos
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2965 (if (and bopl-state
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2966 (< good-pos (- here c-state-cache-too-far)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2967 (c-state-cache-non-literal-place here-bopl bopl-state)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2968 good-pos)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2969
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2970 ((eq strategy 'backward)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2971 (setq res (c-remove-stale-state-cache-backwards here cache-pos)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2972 good-pos (car res)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2973 scan-backward-pos (cadr res)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2974 scan-forward-p (car (cddr res)))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2975 (if scan-backward-pos
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2976 (c-append-lower-brace-pair-to-state-cache
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2977 scan-backward-pos))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2978 (setq c-state-cache-good-pos
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2979 (if scan-forward-p
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2980 (progn (narrow-to-region (point-min) here)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2981 (c-append-to-state-cache good-pos))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2982
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2983 (c-get-cache-scan-pos good-pos))))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2984
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2985 (t ; (eq strategy 'IN-LIT)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2986 (setq c-state-cache nil
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2987 c-state-cache-good-pos nil)))))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2988
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2989 c-state-cache)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2990
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2991 (defun c-invalidate-state-cache (here)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2992 ;; This is a wrapper over `c-invalidate-state-cache-1'.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2993 ;;
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2994 ;; It suppresses the syntactic effect of the < and > (template) brackets and
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2995 ;; of all parens in preprocessor constructs, except for any such construct
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2996 ;; containing point. We can then call `c-invalidate-state-cache-1' without
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2997 ;; worrying further about macros and template delimiters.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2998 (c-with-<->-as-parens-suppressed
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
2999 (if c-state-old-cpp-beg
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3000 (c-with-all-but-one-cpps-commented-out
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3001 c-state-old-cpp-beg c-state-old-cpp-end
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3002 (c-invalidate-state-cache-1 here))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3003 (c-with-cpps-commented-out
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3004 (c-invalidate-state-cache-1 here)))))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3005
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3006 (defun c-parse-state ()
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3007 ;; This is a wrapper over `c-parse-state-1'. See that function for a
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3008 ;; description of the functionality and return value.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3009 ;;
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3010 ;; It suppresses the syntactic effect of the < and > (template) brackets and
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3011 ;; of all parens in preprocessor constructs, except for any such construct
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3012 ;; containing point. We can then call `c-parse-state-1' without worrying
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3013 ;; further about macros and template delimiters.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3014 (let (here-cpp-beg here-cpp-end)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3015 (save-excursion
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3016 (when (c-beginning-of-macro)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3017 (setq here-cpp-beg (point))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3018 (unless
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3019 (> (setq here-cpp-end (c-syntactic-end-of-macro))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3020 here-cpp-beg)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3021 (setq here-cpp-beg nil here-cpp-end nil))))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3022 ;; FIXME!!! Put in a `condition-case' here to protect the integrity of the
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3023 ;; subsystem.
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3024 (prog1
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3025 (c-with-<->-as-parens-suppressed
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3026 (if (and here-cpp-beg (> here-cpp-end here-cpp-beg))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3027 (c-with-all-but-one-cpps-commented-out
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3028 here-cpp-beg here-cpp-end
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3029 (c-parse-state-1))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3030 (c-with-cpps-commented-out
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3031 (c-parse-state-1))))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3032 (setq c-state-old-cpp-beg here-cpp-beg
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3033 c-state-old-cpp-end here-cpp-end))))
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3034
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3035 ;; Debug tool to catch cache inconsistencies. This is called from
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3036 ;; 000tests.el.
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3037 (defvar c-debug-parse-state nil)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3038 (unless (fboundp 'c-real-parse-state)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3039 (fset 'c-real-parse-state (symbol-function 'c-parse-state)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3040 (cc-bytecomp-defun c-real-parse-state)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3041 (defun c-debug-parse-state ()
106395
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3042 (let ((here (point)) (res1 (c-real-parse-state)) res2)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3043 (let ((c-state-cache nil)
106395
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3044 (c-state-cache-good-pos 1)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3045 (c-state-nonlit-pos-cache nil)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3046 (c-state-nonlit-pos-cache-limit 1)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3047 (c-state-brace-pair-desert nil)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3048 (c-state-point-min 1)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3049 (c-state-point-min-lit-type nil)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3050 (c-state-point-min-lit-start nil)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3051 (c-state-min-scan-pos 1)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3052 (c-state-old-cpp-beg nil)
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3053 (c-state-old-cpp-end nil))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3054 (setq res2 (c-real-parse-state)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3055 (unless (equal res1 res2)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3056 ;; The cache can actually go further back due to the ad-hoc way
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3057 ;; the first paren is found, so try to whack off a bit of its
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3058 ;; start before complaining.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3059 (save-excursion
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3060 (goto-char (or (c-least-enclosing-brace res2) (point)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3061 (c-beginning-of-defun-1)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3062 (while (not (or (bobp) (eq (char-after) ?{)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3063 (c-beginning-of-defun-1))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3064 (unless (equal (c-whack-state-before (point) res1) res2)
106395
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3065 (message (concat "c-parse-state inconsistency at %s: "
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3066 "using cache: %s, from scratch: %s")
106395
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3067 here res1 res2))))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3068 res1))
106395
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3069
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3070 (defun c-toggle-parse-state-debug (&optional arg)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3071 (interactive "P")
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3072 (setq c-debug-parse-state (c-calculate-state arg c-debug-parse-state))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3073 (fset 'c-parse-state (symbol-function (if c-debug-parse-state
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3074 'c-debug-parse-state
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3075 'c-real-parse-state)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3076 (c-keep-region-active))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3077 (when c-debug-parse-state
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3078 (c-toggle-parse-state-debug 1))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3079
106395
f2b36fb84bf7 Enhance `c-parse-state' to run efficiently in "brace desserts".
Alan Mackenzie <acm@muc.de>
parents: 105424
diff changeset
3080
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3081 (defun c-whack-state-before (bufpos paren-state)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3082 ;; Whack off any state information from PAREN-STATE which lies
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3083 ;; before BUFPOS. Not destructive on PAREN-STATE.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3084 (let* ((newstate (list nil))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3085 (ptr newstate)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3086 car)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3087 (while paren-state
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3088 (setq car (car paren-state)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3089 paren-state (cdr paren-state))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3090 (if (< (if (consp car) (car car) car) bufpos)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3091 (setq paren-state nil)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3092 (setcdr ptr (list car))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3093 (setq ptr (cdr ptr))))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3094 (cdr newstate)))
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3095
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3096 (defun c-whack-state-after (bufpos paren-state)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3097 ;; Whack off any state information from PAREN-STATE which lies at or
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3098 ;; after BUFPOS. Not destructive on PAREN-STATE.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3099 (catch 'done
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3100 (while paren-state
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3101 (let ((car (car paren-state)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3102 (if (consp car)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3103 ;; just check the car, because in a balanced brace
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3104 ;; expression, it must be impossible for the corresponding
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3105 ;; close brace to be before point, but the open brace to
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3106 ;; be after.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3107 (if (<= bufpos (car car))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3108 nil ; whack it off
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3109 (if (< bufpos (cdr car))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3110 ;; its possible that the open brace is before
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3111 ;; bufpos, but the close brace is after. In that
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3112 ;; case, convert this to a non-cons element. The
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3113 ;; rest of the state is before bufpos, so we're
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3114 ;; done.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3115 (throw 'done (cons (car car) (cdr paren-state)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3116 ;; we know that both the open and close braces are
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3117 ;; before bufpos, so we also know that everything else
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3118 ;; on state is before bufpos.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3119 (throw 'done paren-state)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3120 (if (<= bufpos car)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3121 nil ; whack it off
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3122 ;; it's before bufpos, so everything else should too.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3123 (throw 'done paren-state)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3124 (setq paren-state (cdr paren-state)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
3125 nil)))
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3126
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3127 (defun c-most-enclosing-brace (paren-state &optional bufpos)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3128 ;; Return the bufpos of the innermost enclosing open paren before
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3129 ;; bufpos, or nil if none was found.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3130 (let (enclosingp)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3131 (or bufpos (setq bufpos 134217727))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3132 (while paren-state
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3133 (setq enclosingp (car paren-state)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3134 paren-state (cdr paren-state))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3135 (if (or (consp enclosingp)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3136 (>= enclosingp bufpos))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3137 (setq enclosingp nil)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3138 (setq paren-state nil)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3139 enclosingp))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3140
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3141 (defun c-least-enclosing-brace (paren-state)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3142 ;; Return the bufpos of the outermost enclosing open paren, or nil
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3143 ;; if none was found.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3144 (let (pos elem)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3145 (while paren-state
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3146 (setq elem (car paren-state)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3147 paren-state (cdr paren-state))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3148 (if (integerp elem)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3149 (setq pos elem)))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3150 pos))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3151
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3152 (defun c-safe-position (bufpos paren-state)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3153 ;; Return the closest "safe" position recorded on PAREN-STATE that
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3154 ;; is higher up than BUFPOS. Return nil if PAREN-STATE doesn't
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3155 ;; contain any. Return nil if BUFPOS is nil, which is useful to
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3156 ;; find the closest limit before a given limit that might be nil.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3157 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3158 ;; A "safe" position is a position at or after a recorded open
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3159 ;; paren, or after a recorded close paren. The returned position is
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3160 ;; thus either the first position after a close brace, or the first
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3161 ;; position after an enclosing paren, or at the enclosing paren in
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3162 ;; case BUFPOS is immediately after it.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3163 (when bufpos
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3164 (let (elem)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3165 (catch 'done
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3166 (while paren-state
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3167 (setq elem (car paren-state))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3168 (if (consp elem)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3169 (cond ((< (cdr elem) bufpos)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3170 (throw 'done (cdr elem)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3171 ((< (car elem) bufpos)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3172 ;; See below.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3173 (throw 'done (min (1+ (car elem)) bufpos))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3174 (if (< elem bufpos)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3175 ;; elem is the position at and not after the opening paren, so
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3176 ;; we can go forward one more step unless it's equal to
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3177 ;; bufpos. This is useful in some cases avoid an extra paren
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3178 ;; level between the safe position and bufpos.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3179 (throw 'done (min (1+ elem) bufpos))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3180 (setq paren-state (cdr paren-state)))))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3181
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3182 (defun c-beginning-of-syntax ()
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3183 ;; This is used for `font-lock-beginning-of-syntax-function'. It
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3184 ;; goes to the closest previous point that is known to be outside
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3185 ;; any string literal or comment. `c-state-cache' is used if it has
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3186 ;; a position in the vicinity.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3187 (let* ((paren-state c-state-cache)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3188 elem
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3189
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3190 (pos (catch 'done
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3191 ;; Note: Similar code in `c-safe-position'. The
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3192 ;; difference is that we accept a safe position at
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3193 ;; the point and don't bother to go forward past open
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3194 ;; parens.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3195 (while paren-state
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3196 (setq elem (car paren-state))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3197 (if (consp elem)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3198 (cond ((<= (cdr elem) (point))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3199 (throw 'done (cdr elem)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3200 ((<= (car elem) (point))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3201 (throw 'done (car elem))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3202 (if (<= elem (point))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3203 (throw 'done elem)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3204 (setq paren-state (cdr paren-state)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3205 (point-min))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3206
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3207 (if (> pos (- (point) 4000))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3208 (goto-char pos)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3209 ;; The position is far back. Try `c-beginning-of-defun-1'
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3210 ;; (although we can't be entirely sure it will go to a position
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3211 ;; outside a comment or string in current emacsen). FIXME:
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3212 ;; Consult `syntax-ppss' here.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3213 (c-beginning-of-defun-1)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3214 (if (< (point) pos)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3215 (goto-char pos)))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3216
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3217
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3218 ;; Tools for scanning identifiers and other tokens.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3219
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3220 (defun c-on-identifier ()
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3221 "Return non-nil if the point is on or directly after an identifier.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3222 Keywords are recognized and not considered identifiers. If an
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3223 identifier is detected, the returned value is its starting position.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3224 If an identifier ends at the point and another begins at it \(can only
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3225 happen in Pike) then the point for the preceding one is returned.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3226
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3227 Note that this function might do hidden buffer changes. See the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3228 comment at the start of cc-engine.el for more info."
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3229
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3230 ;; FIXME: Shouldn't this function handle "operator" in C++?
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3231
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3232 (save-excursion
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3233 (skip-syntax-backward "w_")
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3234
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3235 (or
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3236
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3237 ;; Check for a normal (non-keyword) identifier.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3238 (and (looking-at c-symbol-start)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3239 (not (looking-at c-keywords-regexp))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3240 (point))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3241
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3242 (when (c-major-mode-is 'pike-mode)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3243 ;; Handle the `<operator> syntax in Pike.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3244 (let ((pos (point)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3245 (skip-chars-backward "-!%&*+/<=>^|~[]()")
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3246 (and (if (< (skip-chars-backward "`") 0)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3247 t
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3248 (goto-char pos)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3249 (eq (char-after) ?\`))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3250 (looking-at c-symbol-key)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3251 (>= (match-end 0) pos)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3252 (point))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3253
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3254 ;; Handle the "operator +" syntax in C++.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3255 (when (and c-overloadable-operators-regexp
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3256 (= (c-backward-token-2 0) 0))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3257
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3258 (cond ((and (looking-at c-overloadable-operators-regexp)
75027
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
3259 (or (not c-opt-op-identifier-prefix)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3260 (and (= (c-backward-token-2 1) 0)
75027
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
3261 (looking-at c-opt-op-identifier-prefix))))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3262 (point))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3263
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3264 ((save-excursion
75027
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
3265 (and c-opt-op-identifier-prefix
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
3266 (looking-at c-opt-op-identifier-prefix)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3267 (= (c-forward-token-2 1) 0)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3268 (looking-at c-overloadable-operators-regexp)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3269 (point))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3270
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3271 )))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3272
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3273 (defsubst c-simple-skip-symbol-backward ()
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3274 ;; If the point is at the end of a symbol then skip backward to the
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3275 ;; beginning of it. Don't move otherwise. Return non-nil if point
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3276 ;; moved.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3277 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3278 ;; This function might do hidden buffer changes.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3279 (or (< (skip-syntax-backward "w_") 0)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3280 (and (c-major-mode-is 'pike-mode)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3281 ;; Handle the `<operator> syntax in Pike.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3282 (let ((pos (point)))
56646
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3283 (if (and (< (skip-chars-backward "-!%&*+/<=>^|~[]()") 0)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3284 (< (skip-chars-backward "`") 0)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3285 (looking-at c-symbol-key)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3286 (>= (match-end 0) pos))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3287 t
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3288 (goto-char pos)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3289 nil)))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3290
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3291 (defun c-beginning-of-current-token (&optional back-limit)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3292 ;; Move to the beginning of the current token. Do not move if not
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3293 ;; in the middle of one. BACK-LIMIT may be used to bound the
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3294 ;; backward search; if given it's assumed to be at the boundary
98693
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
3295 ;; between two tokens. Return non-nil if the point is moved, nil
76400
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
3296 ;; otherwise.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3297 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3298 ;; This function might do hidden buffer changes.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3299 (let ((start (point)))
76400
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
3300 (if (looking-at "\\w\\|\\s_")
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
3301 (skip-syntax-backward "w_" back-limit)
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
3302 (when (< (skip-syntax-backward ".()" back-limit) 0)
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
3303 (while (let ((pos (or (and (looking-at c-nonsymbol-token-regexp)
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
3304 (match-end 0))
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
3305 ;; `c-nonsymbol-token-regexp' should always match
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
3306 ;; since we've skipped backward over punctuator
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
3307 ;; or paren syntax, but consume one char in case
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
3308 ;; it doesn't so that we don't leave point before
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
3309 ;; some earlier incorrect token.
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
3310 (1+ (point)))))
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
3311 (if (<= pos start)
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
3312 (goto-char pos))))))
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
3313 (< (point) start)))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3314
52107
3a5379a0d7f3 2003-08-01 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 51947
diff changeset
3315 (defun c-end-of-current-token (&optional back-limit)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3316 ;; Move to the end of the current token. Do not move if not in the
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3317 ;; middle of one. BACK-LIMIT may be used to bound the backward
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3318 ;; search; if given it's assumed to be at the boundary between two
52107
3a5379a0d7f3 2003-08-01 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 51947
diff changeset
3319 ;; tokens. Return non-nil if the point is moved, nil otherwise.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3320 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3321 ;; This function might do hidden buffer changes.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3322 (let ((start (point)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3323 (cond ((< (skip-syntax-backward "w_" (1- start)) 0)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3324 (skip-syntax-forward "w_"))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3325 ((< (skip-syntax-backward ".()" back-limit) 0)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3326 (while (progn
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3327 (if (looking-at c-nonsymbol-token-regexp)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3328 (goto-char (match-end 0))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3329 ;; `c-nonsymbol-token-regexp' should always match since
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3330 ;; we've skipped backward over punctuator or paren
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3331 ;; syntax, but move forward in case it doesn't so that
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3332 ;; we don't leave point earlier than we started with.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3333 (forward-char))
52107
3a5379a0d7f3 2003-08-01 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 51947
diff changeset
3334 (< (point) start)))))
3a5379a0d7f3 2003-08-01 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 51947
diff changeset
3335 (> (point) start)))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3336
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3337 (defconst c-jump-syntax-balanced
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3338 (if (memq 'gen-string-delim c-emacs-features)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3339 "\\w\\|\\s_\\|\\s\(\\|\\s\)\\|\\s\"\\|\\s|"
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3340 "\\w\\|\\s_\\|\\s\(\\|\\s\)\\|\\s\""))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3341
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3342 (defconst c-jump-syntax-unbalanced
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3343 (if (memq 'gen-string-delim c-emacs-features)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3344 "\\w\\|\\s_\\|\\s\"\\|\\s|"
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3345 "\\w\\|\\s_\\|\\s\""))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3346
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3347 (defun c-forward-token-2 (&optional count balanced limit)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3348 "Move forward by tokens.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3349 A token is defined as all symbols and identifiers which aren't
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3350 syntactic whitespace \(note that multicharacter tokens like \"==\" are
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3351 treated properly). Point is always either left at the beginning of a
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3352 token or not moved at all. COUNT specifies the number of tokens to
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3353 move; a negative COUNT moves in the opposite direction. A COUNT of 0
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3354 moves to the next token beginning only if not already at one. If
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3355 BALANCED is true, move over balanced parens, otherwise move into them.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3356 Also, if BALANCED is true, never move out of an enclosing paren.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3357
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3358 LIMIT sets the limit for the movement and defaults to the point limit.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3359 The case when LIMIT is set in the middle of a token, comment or macro
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3360 is handled correctly, i.e. the point won't be left there.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3361
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3362 Return the number of tokens left to move \(positive or negative). If
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3363 BALANCED is true, a move over a balanced paren counts as one. Note
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3364 that if COUNT is 0 and no appropriate token beginning is found, 1 will
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3365 be returned. Thus, a return value of 0 guarantees that point is at
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3366 the requested position and a return value less \(without signs) than
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3367 COUNT guarantees that point is at the beginning of some token.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3368
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3369 Note that this function might do hidden buffer changes. See the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3370 comment at the start of cc-engine.el for more info."
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3371
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3372 (or count (setq count 1))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3373 (if (< count 0)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3374 (- (c-backward-token-2 (- count) balanced limit))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3375
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3376 (let ((jump-syntax (if balanced
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3377 c-jump-syntax-balanced
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3378 c-jump-syntax-unbalanced))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3379 (last (point))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3380 (prev (point)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3381
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3382 (if (zerop count)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3383 ;; If count is zero we should jump if in the middle of a token.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3384 (c-end-of-current-token))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3385
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3386 (save-restriction
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3387 (if limit (narrow-to-region (point-min) limit))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3388 (if (/= (point)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3389 (progn (c-forward-syntactic-ws) (point)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3390 ;; Skip whitespace. Count this as a move if we did in
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3391 ;; fact move.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3392 (setq count (max (1- count) 0)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3393
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3394 (if (eobp)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3395 ;; Moved out of bounds. Make sure the returned count isn't zero.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3396 (progn
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3397 (if (zerop count) (setq count 1))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3398 (goto-char last))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3399
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3400 ;; Use `condition-case' to avoid having the limit tests
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3401 ;; inside the loop.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3402 (condition-case nil
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3403 (while (and
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3404 (> count 0)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3405 (progn
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3406 (setq last (point))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3407 (cond ((looking-at jump-syntax)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3408 (goto-char (scan-sexps (point) 1))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3409 t)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3410 ((looking-at c-nonsymbol-token-regexp)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3411 (goto-char (match-end 0))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3412 t)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3413 ;; `c-nonsymbol-token-regexp' above should always
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3414 ;; match if there are correct tokens. Try to
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3415 ;; widen to see if the limit was set in the
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3416 ;; middle of one, else fall back to treating
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3417 ;; the offending thing as a one character token.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3418 ((and limit
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3419 (save-restriction
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3420 (widen)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3421 (looking-at c-nonsymbol-token-regexp)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3422 nil)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3423 (t
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3424 (forward-char)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3425 t))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3426 (c-forward-syntactic-ws)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3427 (setq prev last
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3428 count (1- count)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3429 (error (goto-char last)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3430
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3431 (when (eobp)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3432 (goto-char prev)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3433 (setq count (1+ count)))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3434
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3435 count)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3436
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3437 (defun c-backward-token-2 (&optional count balanced limit)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3438 "Move backward by tokens.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3439 See `c-forward-token-2' for details."
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3440
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3441 (or count (setq count 1))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3442 (if (< count 0)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3443 (- (c-forward-token-2 (- count) balanced limit))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3444
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3445 (or limit (setq limit (point-min)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3446 (let ((jump-syntax (if balanced
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3447 c-jump-syntax-balanced
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3448 c-jump-syntax-unbalanced))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3449 (last (point)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3450
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3451 (if (zerop count)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3452 ;; The count is zero so try to skip to the beginning of the
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3453 ;; current token.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3454 (if (> (point)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3455 (progn (c-beginning-of-current-token) (point)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3456 (if (< (point) limit)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3457 ;; The limit is inside the same token, so return 1.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3458 (setq count 1))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3459
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3460 ;; We're not in the middle of a token. If there's
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3461 ;; whitespace after the point then we must move backward,
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3462 ;; so set count to 1 in that case.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3463 (and (looking-at c-syntactic-ws-start)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3464 ;; If we're looking at a '#' that might start a cpp
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3465 ;; directive then we have to do a more elaborate check.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3466 (or (/= (char-after) ?#)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3467 (not c-opt-cpp-prefix)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3468 (save-excursion
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3469 (and (= (point)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3470 (progn (beginning-of-line)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3471 (looking-at "[ \t]*")
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3472 (match-end 0)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3473 (or (bobp)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3474 (progn (backward-char)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3475 (not (eq (char-before) ?\\)))))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3476 (setq count 1))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3477
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3478 ;; Use `condition-case' to avoid having to check for buffer
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3479 ;; limits in `backward-char', `scan-sexps' and `goto-char' below.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3480 (condition-case nil
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3481 (while (and
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3482 (> count 0)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3483 (progn
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3484 (c-backward-syntactic-ws)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3485 (backward-char)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3486 (if (looking-at jump-syntax)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3487 (goto-char (scan-sexps (1+ (point)) -1))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3488 ;; This can be very inefficient if there's a long
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3489 ;; sequence of operator tokens without any separation.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3490 ;; That doesn't happen in practice, anyway.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3491 (c-beginning-of-current-token))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3492 (>= (point) limit)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3493 (setq last (point)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3494 count (1- count)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3495 (error (goto-char last)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3496
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3497 (if (< (point) limit)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3498 (goto-char last))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3499
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3500 count)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3501
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3502 (defun c-forward-token-1 (&optional count balanced limit)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3503 "Like `c-forward-token-2' but doesn't treat multicharacter operator
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3504 tokens like \"==\" as single tokens, i.e. all sequences of symbol
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3505 characters are jumped over character by character. This function is
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3506 for compatibility only; it's only a wrapper over `c-forward-token-2'."
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3507 (let ((c-nonsymbol-token-regexp "\\s.\\|\\s\(\\|\\s\)"))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3508 (c-forward-token-2 count balanced limit)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3509
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3510 (defun c-backward-token-1 (&optional count balanced limit)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3511 "Like `c-backward-token-2' but doesn't treat multicharacter operator
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3512 tokens like \"==\" as single tokens, i.e. all sequences of symbol
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3513 characters are jumped over character by character. This function is
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3514 for compatibility only; it's only a wrapper over `c-backward-token-2'."
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3515 (let ((c-nonsymbol-token-regexp "\\s.\\|\\s\(\\|\\s\)"))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3516 (c-backward-token-2 count balanced limit)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3517
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3518
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3519 ;; Tools for doing searches restricted to syntactically relevant text.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3520
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3521 (defun c-syntactic-re-search-forward (regexp &optional bound noerror
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3522 paren-level not-inside-token
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3523 lookbehind-submatch)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3524 "Like `re-search-forward', but only report matches that are found
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3525 in syntactically significant text. I.e. matches in comments, macros
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3526 or string literals are ignored. The start point is assumed to be
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3527 outside any comment, macro or string literal, or else the content of
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3528 that region is taken as syntactically significant text.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3529
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3530 If PAREN-LEVEL is non-nil, an additional restriction is added to
56646
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3531 ignore matches in nested paren sexps. The search will also not go
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3532 outside the current list sexp, which has the effect that if the point
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3533 should be moved to BOUND when no match is found \(i.e. NOERROR is
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3534 neither nil nor t), then it will be at the closing paren if the end of
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3535 the current list sexp is encountered first.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3536
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3537 If NOT-INSIDE-TOKEN is non-nil, matches in the middle of tokens are
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3538 ignored. Things like multicharacter operators and special symbols
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3539 \(e.g. \"`()\" in Pike) are handled but currently not floating point
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3540 constants.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3541
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3542 If LOOKBEHIND-SUBMATCH is non-nil, it's taken as a number of a
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3543 subexpression in REGEXP. The end of that submatch is used as the
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3544 position to check for syntactic significance. If LOOKBEHIND-SUBMATCH
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3545 isn't used or if that subexpression didn't match then the start
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3546 position of the whole match is used instead. The \"look behind\"
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3547 subexpression is never tested before the starting position, so it
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3548 might be a good idea to include \\=\\= as a match alternative in it.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3549
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3550 Optimization note: Matches might be missed if the \"look behind\"
56646
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3551 subexpression can match the end of nonwhite syntactic whitespace,
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3552 i.e. the end of comments or cpp directives. This since the function
56646
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3553 skips over such things before resuming the search. It's on the other
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3554 hand not safe to assume that the \"look behind\" subexpression never
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3555 matches syntactic whitespace.
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3556
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3557 Bug: Unbalanced parens inside cpp directives are currently not handled
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3558 correctly \(i.e. they don't get ignored as they should) when
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3559 PAREN-LEVEL is set.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3560
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3561 Note that this function might do hidden buffer changes. See the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3562 comment at the start of cc-engine.el for more info."
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3563
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3564 (or bound (setq bound (point-max)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3565 (if paren-level (setq paren-level -1))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3566
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3567 ;;(message "c-syntactic-re-search-forward %s %s %S" (point) bound regexp)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3568
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3569 (let ((start (point))
56646
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3570 tmp
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3571 ;; Start position for the last search.
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3572 search-pos
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3573 ;; The `parse-partial-sexp' state between the start position
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3574 ;; and the point.
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3575 state
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3576 ;; The current position after the last state update. The next
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3577 ;; `parse-partial-sexp' continues from here.
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3578 (state-pos (point))
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3579 ;; The position at which to check the state and the state
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3580 ;; there. This is separate from `state-pos' since we might
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3581 ;; need to back up before doing the next search round.
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3582 check-pos check-state
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3583 ;; Last position known to end a token.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3584 (last-token-end-pos (point-min))
56646
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3585 ;; Set when a valid match is found.
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3586 found)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3587
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3588 (condition-case err
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3589 (while
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3590 (and
56646
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3591 (progn
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3592 (setq search-pos (point))
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3593 (re-search-forward regexp bound noerror))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3594
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3595 (progn
56646
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3596 (setq state (parse-partial-sexp
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3597 state-pos (match-beginning 0) paren-level nil state)
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3598 state-pos (point))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3599 (if (setq check-pos (and lookbehind-submatch
56646
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3600 (or (not paren-level)
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3601 (>= (car state) 0))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3602 (match-end lookbehind-submatch)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3603 (setq check-state (parse-partial-sexp
56646
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3604 state-pos check-pos paren-level nil state))
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3605 (setq check-pos state-pos
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3606 check-state state))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3607
56646
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3608 ;; NOTE: If we got a look behind subexpression and get
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3609 ;; an insignificant match in something that isn't
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3610 ;; syntactic whitespace (i.e. strings or in nested
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3611 ;; parentheses), then we can never skip more than a
56646
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3612 ;; single character from the match start position
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3613 ;; (i.e. `state-pos' here) before continuing the
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3614 ;; search. That since the look behind subexpression
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3615 ;; might match the end of the insignificant region in
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3616 ;; the next search.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3617
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3618 (cond
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3619 ((elt check-state 7)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3620 ;; Match inside a line comment. Skip to eol. Use
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3621 ;; `re-search-forward' instead of `skip-chars-forward' to get
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3622 ;; the right bound behavior.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3623 (re-search-forward "[\n\r]" bound noerror))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3624
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3625 ((elt check-state 4)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3626 ;; Match inside a block comment. Skip to the '*/'.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3627 (search-forward "*/" bound noerror))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3628
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3629 ((and (not (elt check-state 5))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3630 (eq (char-before check-pos) ?/)
56646
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3631 (not (c-get-char-property (1- check-pos) 'syntax-table))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3632 (memq (char-after check-pos) '(?/ ?*)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3633 ;; Match in the middle of the opener of a block or line
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3634 ;; comment.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3635 (if (= (char-after check-pos) ?/)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3636 (re-search-forward "[\n\r]" bound noerror)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3637 (search-forward "*/" bound noerror)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3638
56646
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3639 ;; The last `parse-partial-sexp' above might have
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3640 ;; stopped short of the real check position if the end
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3641 ;; of the current sexp was encountered in paren-level
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3642 ;; mode. The checks above are always false in that
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3643 ;; case, and since they can do better skipping in
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3644 ;; lookbehind-submatch mode, we do them before
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3645 ;; checking the paren level.
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3646
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3647 ((and paren-level
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3648 (/= (setq tmp (car check-state)) 0))
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3649 ;; Check the paren level first since we're short of the
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3650 ;; syntactic checking position if the end of the
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3651 ;; current sexp was encountered by `parse-partial-sexp'.
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3652 (if (> tmp 0)
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3653
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3654 ;; Inside a nested paren sexp.
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3655 (if lookbehind-submatch
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3656 ;; See the NOTE above.
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3657 (progn (goto-char state-pos) t)
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3658 ;; Skip out of the paren quickly.
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3659 (setq state (parse-partial-sexp state-pos bound 0 nil state)
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3660 state-pos (point)))
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3661
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3662 ;; Have exited the current paren sexp.
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3663 (if noerror
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3664 (progn
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3665 ;; The last `parse-partial-sexp' call above
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3666 ;; has left us just after the closing paren
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3667 ;; in this case, so we can modify the bound
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3668 ;; to leave the point at the right position
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3669 ;; upon return.
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3670 (setq bound (1- (point)))
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3671 nil)
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3672 (signal 'search-failed (list regexp)))))
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3673
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3674 ((setq tmp (elt check-state 3))
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3675 ;; Match inside a string.
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3676 (if (or lookbehind-submatch
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3677 (not (integerp tmp)))
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3678 ;; See the NOTE above.
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3679 (progn (goto-char state-pos) t)
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3680 ;; Skip to the end of the string before continuing.
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3681 (let ((ender (make-string 1 tmp)) (continue t))
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3682 (while (if (search-forward ender bound noerror)
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3683 (progn
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3684 (setq state (parse-partial-sexp
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3685 state-pos (point) nil nil state)
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3686 state-pos (point))
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3687 (elt state 3))
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3688 (setq continue nil)))
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3689 continue)))
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3690
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3691 ((save-excursion
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3692 (save-match-data
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3693 (c-beginning-of-macro start)))
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3694 ;; Match inside a macro. Skip to the end of it.
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3695 (c-end-of-macro)
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3696 (cond ((<= (point) bound) t)
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3697 (noerror nil)
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3698 (t (signal 'search-failed (list regexp)))))
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3699
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3700 ((and not-inside-token
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3701 (or (< check-pos last-token-end-pos)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3702 (< check-pos
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3703 (save-excursion
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3704 (goto-char check-pos)
53073
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
3705 (save-match-data
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
3706 (c-end-of-current-token last-token-end-pos))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3707 (setq last-token-end-pos (point))))))
56646
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3708 ;; Inside a token.
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3709 (if lookbehind-submatch
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3710 ;; See the NOTE above.
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3711 (goto-char state-pos)
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3712 (goto-char (min last-token-end-pos bound))))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3713
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3714 (t
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3715 ;; A real match.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3716 (setq found t)
56646
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3717 nil)))
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3718
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3719 ;; Should loop to search again, but take care to avoid
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3720 ;; looping on the same spot.
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3721 (or (/= search-pos (point))
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3722 (if (= (point) bound)
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3723 (if noerror
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3724 nil
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3725 (signal 'search-failed (list regexp)))
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3726 (forward-char)
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3727 t))))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3728
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3729 (error
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3730 (goto-char start)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3731 (signal (car err) (cdr err))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3732
56646
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3733 ;;(message "c-syntactic-re-search-forward done %s" (or (match-end 0) (point)))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3734
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3735 (if found
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3736 (progn
56646
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3737 (goto-char (match-end 0))
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3738 (match-end 0))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3739
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3740 ;; Search failed. Set point as appropriate.
56646
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3741 (if (eq noerror t)
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3742 (goto-char start)
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
3743 (goto-char bound))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3744 nil)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3745
106522
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3746 (defsubst c-ssb-lit-begin ()
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3747 ;; Return the start of the literal point is in, or nil.
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3748 ;; We read and write the variables `safe-pos', `safe-pos-list', `state'
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3749 ;; bound in the caller.
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3750
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3751 ;; Use `parse-partial-sexp' from a safe position down to the point to check
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3752 ;; if it's outside comments and strings.
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3753 (save-excursion
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3754 (let ((pos (point)) safe-pos state pps-end-pos)
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3755 ;; Pick a safe position as close to the point as possible.
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3756 ;;
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3757 ;; FIXME: Consult `syntax-ppss' here if our cache doesn't give a good
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3758 ;; position.
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3759
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3760 (while (and safe-pos-list
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3761 (> (car safe-pos-list) (point)))
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3762 (setq safe-pos-list (cdr safe-pos-list)))
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3763 (unless (setq safe-pos (car-safe safe-pos-list))
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3764 (setq safe-pos (max (or (c-safe-position
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3765 (point) (or c-state-cache
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3766 (c-parse-state)))
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3767 0)
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3768 (point-min))
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3769 safe-pos-list (list safe-pos)))
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3770
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3771 ;; Cache positions along the way to use if we have to back up more. We
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3772 ;; cache every closing paren on the same level. If the paren cache is
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3773 ;; relevant in this region then we're typically already on the same
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3774 ;; level as the target position. Note that we might cache positions
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3775 ;; after opening parens in case safe-pos is in a nested list. That's
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3776 ;; both uncommon and harmless.
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3777 (while (progn
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3778 (setq state (parse-partial-sexp
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3779 safe-pos pos 0))
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3780 (< (point) pos))
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3781 (setq safe-pos (point)
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3782 safe-pos-list (cons safe-pos safe-pos-list)))
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3783
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3784 ;; If the state contains the start of the containing sexp we cache that
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3785 ;; position too, so that parse-partial-sexp in the next run has a bigger
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3786 ;; chance of starting at the same level as the target position and thus
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3787 ;; will get more good safe positions into the list.
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3788 (if (elt state 1)
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3789 (setq safe-pos (1+ (elt state 1))
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3790 safe-pos-list (cons safe-pos safe-pos-list)))
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3791
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3792 (if (or (elt state 3) (elt state 4))
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3793 ;; Inside string or comment. Continue search at the
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3794 ;; beginning of it.
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3795 (elt state 8)))))
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3796
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3797 (defun c-syntactic-skip-backward (skip-chars &optional limit paren-level)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3798 "Like `skip-chars-backward' but only look at syntactically relevant chars,
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3799 i.e. don't stop at positions inside syntactic whitespace or string
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3800 literals. Preprocessor directives are also ignored, with the exception
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3801 of the one that the point starts within, if any. If LIMIT is given,
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3802 it's assumed to be at a syntactically relevant position.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3803
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3804 If PAREN-LEVEL is non-nil, the function won't stop in nested paren
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3805 sexps, and the search will also not go outside the current paren sexp.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3806 However, if LIMIT or the buffer limit is reached inside a nested paren
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3807 then the point will be left at the limit.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3808
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3809 Non-nil is returned if the point moved, nil otherwise.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3810
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3811 Note that this function might do hidden buffer changes. See the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3812 comment at the start of cc-engine.el for more info."
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3813
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3814 (let ((start (point))
106522
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3815 state-2
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3816 ;; A list of syntactically relevant positions in descending
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3817 ;; order. It's used to avoid scanning repeatedly over
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3818 ;; potentially large regions with `parse-partial-sexp' to verify
106522
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3819 ;; each position. Used in `c-ssb-lit-begin'
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3820 safe-pos-list
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3821 ;; The result from `c-beginning-of-macro' at the start position or the
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3822 ;; start position itself if it isn't within a macro. Evaluated on
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3823 ;; demand.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3824 start-macro-beg
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3825 ;; The earliest position after the current one with the same paren
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3826 ;; level. Used only when `paren-level' is set.
106522
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3827 lit-beg
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3828 (paren-level-pos (point)))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3829
106522
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3830 (while
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3831 (progn
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3832 ;; The next loop "tries" to find the end point each time round,
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3833 ;; loops when it hasn't succeeded.
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3834 (while
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3835 (and
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3836 (< (skip-chars-backward skip-chars limit) 0)
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3837
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3838 (let ((pos (point)) state-2 pps-end-pos)
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3839
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3840 (cond
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3841 ;; Don't stop inside a literal
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3842 ((setq lit-beg (c-ssb-lit-begin))
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3843 (goto-char lit-beg)
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3844 t)
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3845
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3846 ((and paren-level
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3847 (save-excursion
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3848 (setq state-2 (parse-partial-sexp
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3849 pos paren-level-pos -1)
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3850 pps-end-pos (point))
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3851 (/= (car state-2) 0)))
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3852 ;; Not at the right level.
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3853
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3854 (if (and (< (car state-2) 0)
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3855 ;; We stop above if we go out of a paren.
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3856 ;; Now check whether it precedes or is
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3857 ;; nested in the starting sexp.
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3858 (save-excursion
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3859 (setq state-2
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3860 (parse-partial-sexp
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3861 pps-end-pos paren-level-pos
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3862 nil nil state-2))
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3863 (< (car state-2) 0)))
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3864
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3865 ;; We've stopped short of the starting position
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3866 ;; so the hit was inside a nested list. Go up
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3867 ;; until we are at the right level.
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3868 (condition-case nil
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3869 (progn
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3870 (goto-char (scan-lists pos -1
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3871 (- (car state-2))))
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3872 (setq paren-level-pos (point))
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3873 (if (and limit (>= limit paren-level-pos))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3874 (progn
106522
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3875 (goto-char limit)
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3876 nil)
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3877 t))
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3878 (error
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3879 (goto-char (or limit (point-min)))
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3880 nil))
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3881
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3882 ;; The hit was outside the list at the start
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3883 ;; position. Go to the start of the list and exit.
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3884 (goto-char (1+ (elt state-2 1)))
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3885 nil))
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3886
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3887 ((c-beginning-of-macro limit)
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3888 ;; Inside a macro.
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3889 (if (< (point)
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3890 (or start-macro-beg
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3891 (setq start-macro-beg
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3892 (save-excursion
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3893 (goto-char start)
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3894 (c-beginning-of-macro limit)
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3895 (point)))))
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3896 t
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3897
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3898 ;; It's inside the same macro we started in so it's
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3899 ;; a relevant match.
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3900 (goto-char pos)
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3901 nil))))))
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3902
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3903 (> (point)
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3904 (progn
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3905 ;; Skip syntactic ws afterwards so that we don't stop at the
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3906 ;; end of a comment if `skip-chars' is something like "^/".
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3907 (c-backward-syntactic-ws)
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
3908 (point)))))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
3909
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3910 ;; We might want to extend this with more useful return values in
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3911 ;; the future.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3912 (/= (point) start)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3913
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3914 ;; The following is an alternative implementation of
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3915 ;; `c-syntactic-skip-backward' that uses backward movement to keep
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3916 ;; track of the syntactic context. It turned out to be generally
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3917 ;; slower than the one above which uses forward checks from earlier
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3918 ;; safe positions.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3919 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3920 ;;(defconst c-ssb-stop-re
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3921 ;; ;; The regexp matching chars `c-syntactic-skip-backward' needs to
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3922 ;; ;; stop at to avoid going into comments and literals.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3923 ;; (concat
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3924 ;; ;; Match comment end syntax and string literal syntax. Also match
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3925 ;; ;; '/' for block comment endings (not covered by comment end
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3926 ;; ;; syntax).
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3927 ;; "\\s>\\|/\\|\\s\""
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3928 ;; (if (memq 'gen-string-delim c-emacs-features)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3929 ;; "\\|\\s|"
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3930 ;; "")
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3931 ;; (if (memq 'gen-comment-delim c-emacs-features)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3932 ;; "\\|\\s!"
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3933 ;; "")))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3934 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3935 ;;(defconst c-ssb-stop-paren-re
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3936 ;; ;; Like `c-ssb-stop-re' but also stops at paren chars.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3937 ;; (concat c-ssb-stop-re "\\|\\s(\\|\\s)"))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3938 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3939 ;;(defconst c-ssb-sexp-end-re
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3940 ;; ;; Regexp matching the ending syntax of a complex sexp.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3941 ;; (concat c-string-limit-regexp "\\|\\s)"))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3942 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3943 ;;(defun c-syntactic-skip-backward (skip-chars &optional limit paren-level)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3944 ;; "Like `skip-chars-backward' but only look at syntactically relevant chars,
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3945 ;;i.e. don't stop at positions inside syntactic whitespace or string
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3946 ;;literals. Preprocessor directives are also ignored. However, if the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3947 ;;point is within a comment, string literal or preprocessor directory to
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3948 ;;begin with, its contents is treated as syntactically relevant chars.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3949 ;;If LIMIT is given, it limits the backward search and the point will be
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3950 ;;left there if no earlier position is found.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3951 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3952 ;;If PAREN-LEVEL is non-nil, the function won't stop in nested paren
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3953 ;;sexps, and the search will also not go outside the current paren sexp.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3954 ;;However, if LIMIT or the buffer limit is reached inside a nested paren
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3955 ;;then the point will be left at the limit.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3956 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3957 ;;Non-nil is returned if the point moved, nil otherwise.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3958 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3959 ;;Note that this function might do hidden buffer changes. See the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3960 ;;comment at the start of cc-engine.el for more info."
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3961 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3962 ;; (save-restriction
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3963 ;; (when limit
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3964 ;; (narrow-to-region limit (point-max)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3965 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3966 ;; (let ((start (point)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3967 ;; (catch 'done
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3968 ;; (while (let ((last-pos (point))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3969 ;; (stop-pos (progn
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3970 ;; (skip-chars-backward skip-chars)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3971 ;; (point))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3972 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3973 ;; ;; Skip back over the same region as
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3974 ;; ;; `skip-chars-backward' above, but keep to
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3975 ;; ;; syntactically relevant positions.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3976 ;; (goto-char last-pos)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3977 ;; (while (and
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3978 ;; ;; `re-search-backward' with a single char regexp
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3979 ;; ;; should be fast.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3980 ;; (re-search-backward
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3981 ;; (if paren-level c-ssb-stop-paren-re c-ssb-stop-re)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3982 ;; stop-pos 'move)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3983 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3984 ;; (progn
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3985 ;; (cond
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3986 ;; ((looking-at "\\s(")
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3987 ;; ;; `paren-level' is set and we've found the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3988 ;; ;; start of the containing paren.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3989 ;; (forward-char)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3990 ;; (throw 'done t))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3991 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3992 ;; ((looking-at c-ssb-sexp-end-re)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3993 ;; ;; We're at the end of a string literal or paren
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3994 ;; ;; sexp (if `paren-level' is set).
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3995 ;; (forward-char)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3996 ;; (condition-case nil
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3997 ;; (c-backward-sexp)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3998 ;; (error
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
3999 ;; (goto-char limit)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4000 ;; (throw 'done t))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4001 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4002 ;; (t
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4003 ;; (forward-char)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4004 ;; ;; At the end of some syntactic ws or possibly
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4005 ;; ;; after a plain '/' operator.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4006 ;; (let ((pos (point)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4007 ;; (c-backward-syntactic-ws)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4008 ;; (if (= pos (point))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4009 ;; ;; Was a plain '/' operator. Go past it.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4010 ;; (backward-char)))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4011 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4012 ;; (> (point) stop-pos))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4013 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4014 ;; ;; Now the point is either at `stop-pos' or at some
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4015 ;; ;; position further back if `stop-pos' was at a
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4016 ;; ;; syntactically irrelevant place.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4017 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4018 ;; ;; Skip additional syntactic ws so that we don't stop
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4019 ;; ;; at the end of a comment if `skip-chars' is
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4020 ;; ;; something like "^/".
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4021 ;; (c-backward-syntactic-ws)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4022 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4023 ;; (< (point) stop-pos))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4024 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4025 ;; ;; We might want to extend this with more useful return values
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4026 ;; ;; in the future.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4027 ;; (/= (point) start))))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4028
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4029
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4030 ;; Tools for handling comments and string literals.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4031
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4032 (defun c-slow-in-literal (&optional lim detect-cpp)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4033 "Return the type of literal point is in, if any.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4034 The return value is `c' if in a C-style comment, `c++' if in a C++
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4035 style comment, `string' if in a string literal, `pound' if DETECT-CPP
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4036 is non-nil and in a preprocessor line, or nil if somewhere else.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4037 Optional LIM is used as the backward limit of the search. If omitted,
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4038 or nil, `c-beginning-of-defun' is used.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4039
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4040 The last point calculated is cached if the cache is enabled, i.e. if
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4041 `c-in-literal-cache' is bound to a two element vector.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4042
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4043 Note that this function might do hidden buffer changes. See the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4044 comment at the start of cc-engine.el for more info."
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4045
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4046 (if (and (vectorp c-in-literal-cache)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4047 (= (point) (aref c-in-literal-cache 0)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4048 (aref c-in-literal-cache 1)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4049 (let ((rtn (save-excursion
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4050 (let* ((pos (point))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4051 (lim (or lim (progn
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4052 (c-beginning-of-syntax)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4053 (point))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4054 (state (parse-partial-sexp lim pos)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4055 (cond
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4056 ((elt state 3) 'string)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4057 ((elt state 4) (if (elt state 7) 'c++ 'c))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4058 ((and detect-cpp (c-beginning-of-macro lim)) 'pound)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4059 (t nil))))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4060 ;; cache this result if the cache is enabled
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4061 (if (not c-in-literal-cache)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4062 (setq c-in-literal-cache (vector (point) rtn)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4063 rtn)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4064
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4065 ;; XEmacs has a built-in function that should make this much quicker.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4066 ;; I don't think we even need the cache, which makes our lives more
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4067 ;; complicated anyway. In this case, lim is only used to detect
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4068 ;; cpp directives.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4069 ;;
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4070 ;; Note that there is a bug in Xemacs's buffer-syntactic-context when used in
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4071 ;; conjunction with syntax-table-properties. The bug is present in, e.g.,
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4072 ;; Xemacs 21.4.4. It manifested itself thus:
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4073 ;;
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4074 ;; Starting with an empty AWK Mode buffer, type
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4075 ;; /regexp/ {<C-j>
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4076 ;; Point gets wrongly left at column 0, rather than being indented to tab-width.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4077 ;;
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4078 ;; AWK Mode is designed such that when the first / is typed, it gets the
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4079 ;; syntax-table property "string fence". When the second / is typed, BOTH /s
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4080 ;; are given the s-t property "string". However, buffer-syntactic-context
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4081 ;; fails to take account of the change of the s-t property on the opening / to
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4082 ;; "string", and reports that the { is within a string started by the second /.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4083 ;;
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4084 ;; The workaround for this is for the AWK Mode initialisation to switch the
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4085 ;; defalias for c-in-literal to c-slow-in-literal. This will slow down other
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4086 ;; cc-modes in Xemacs whenever an awk-buffer has been initialised.
79408
a29ca195b71e (c-crosses-statement-barrier-p): Fix typo in docstring.
Juanma Barranquero <lekktu@gmail.com>
parents: 78656
diff changeset
4087 ;;
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4088 ;; (Alan Mackenzie, 2003/4/30).
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4089
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4090 (defun c-fast-in-literal (&optional lim detect-cpp)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4091 ;; This function might do hidden buffer changes.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4092 (let ((context (buffer-syntactic-context)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4093 (cond
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4094 ((eq context 'string) 'string)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4095 ((eq context 'comment) 'c++)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4096 ((eq context 'block-comment) 'c)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4097 ((and detect-cpp (save-excursion (c-beginning-of-macro lim))) 'pound))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4098
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4099 (defalias 'c-in-literal
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4100 (if (fboundp 'buffer-syntactic-context)
51829
d508ffa43505 2003-07-08 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 51714
diff changeset
4101 'c-fast-in-literal ; XEmacs
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4102 'c-slow-in-literal)) ; GNU Emacs
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4103
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4104 ;; The defalias above isn't enough to shut up the byte compiler.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4105 (cc-bytecomp-defun c-in-literal)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4106
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4107 (defun c-literal-limits (&optional lim near not-in-delimiter)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4108 "Return a cons of the beginning and end positions of the comment or
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4109 string surrounding point (including both delimiters), or nil if point
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4110 isn't in one. If LIM is non-nil, it's used as the \"safe\" position
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4111 to start parsing from. If NEAR is non-nil, then the limits of any
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4112 literal next to point is returned. \"Next to\" means there's only
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4113 spaces and tabs between point and the literal. The search for such a
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4114 literal is done first in forward direction. If NOT-IN-DELIMITER is
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4115 non-nil, the case when point is inside a starting delimiter won't be
98693
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
4116 recognized. This only has effect for comments which have starting
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4117 delimiters with more than one character.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4118
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4119 Note that this function might do hidden buffer changes. See the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4120 comment at the start of cc-engine.el for more info."
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4121
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4122 (save-excursion
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4123 (let* ((pos (point))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4124 (lim (or lim (progn
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4125 (c-beginning-of-syntax)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4126 (point))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4127 (state (parse-partial-sexp lim pos)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4128
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4129 (cond ((elt state 3) ; String.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4130 (goto-char (elt state 8))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4131 (cons (point) (or (c-safe (c-forward-sexp 1) (point))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4132 (point-max))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4133
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4134 ((elt state 4) ; Comment.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4135 (goto-char (elt state 8))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4136 (cons (point) (progn (c-forward-single-comment) (point))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4137
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4138 ((and (not not-in-delimiter)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4139 (not (elt state 5))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4140 (eq (char-before) ?/)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4141 (looking-at "[/*]"))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4142 ;; We're standing in a comment starter.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4143 (backward-char 1)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4144 (cons (point) (progn (c-forward-single-comment) (point))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4145
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4146 (near
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4147 (goto-char pos)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4148
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4149 ;; Search forward for a literal.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4150 (skip-chars-forward " \t")
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4151
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4152 (cond
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4153 ((looking-at c-string-limit-regexp) ; String.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4154 (cons (point) (or (c-safe (c-forward-sexp 1) (point))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4155 (point-max))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4156
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4157 ((looking-at c-comment-start-regexp) ; Line or block comment.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4158 (cons (point) (progn (c-forward-single-comment) (point))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4159
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4160 (t
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4161 ;; Search backward.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4162 (skip-chars-backward " \t")
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4163
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4164 (let ((end (point)) beg)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4165 (cond
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4166 ((save-excursion
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4167 (< (skip-syntax-backward c-string-syntax) 0)) ; String.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4168 (setq beg (c-safe (c-backward-sexp 1) (point))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4169
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4170 ((and (c-safe (forward-char -2) t)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4171 (looking-at "*/"))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4172 ;; Block comment. Due to the nature of line
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4173 ;; comments, they will always be covered by the
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4174 ;; normal case above.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4175 (goto-char end)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4176 (c-backward-single-comment)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4177 ;; If LIM is bogus, beg will be bogus.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4178 (setq beg (point))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4179
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4180 (if beg (cons beg end))))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4181 ))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4182
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4183 ;; In case external callers use this; it did have a docstring.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4184 (defalias 'c-literal-limits-fast 'c-literal-limits)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4185
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4186 (defun c-collect-line-comments (range)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4187 "If the argument is a cons of two buffer positions (such as returned by
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4188 `c-literal-limits'), and that range contains a C++ style line comment,
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4189 then an extended range is returned that contains all adjacent line
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4190 comments (i.e. all comments that starts in the same column with no
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4191 empty lines or non-whitespace characters between them). Otherwise the
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4192 argument is returned.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4193
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4194 Note that this function might do hidden buffer changes. See the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4195 comment at the start of cc-engine.el for more info."
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4196
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4197 (save-excursion
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4198 (condition-case nil
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4199 (if (and (consp range) (progn
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4200 (goto-char (car range))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4201 (looking-at c-line-comment-starter)))
79408
a29ca195b71e (c-crosses-statement-barrier-p): Fix typo in docstring.
Juanma Barranquero <lekktu@gmail.com>
parents: 78656
diff changeset
4202 (let ((col (current-column))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4203 (beg (point))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4204 (bopl (c-point 'bopl))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4205 (end (cdr range)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4206 ;; Got to take care in the backward direction to handle
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4207 ;; comments which are preceded by code.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4208 (while (and (c-backward-single-comment)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4209 (>= (point) bopl)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4210 (looking-at c-line-comment-starter)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4211 (= col (current-column)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4212 (setq beg (point)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4213 bopl (c-point 'bopl)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4214 (goto-char end)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4215 (while (and (progn (skip-chars-forward " \t")
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4216 (looking-at c-line-comment-starter))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4217 (= col (current-column))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4218 (prog1 (zerop (forward-line 1))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4219 (setq end (point)))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4220 (cons beg end))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4221 range)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4222 (error range))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4223
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4224 (defun c-literal-type (range)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4225 "Convenience function that given the result of `c-literal-limits',
98693
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
4226 returns nil or the type of literal that the range surrounds, one
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
4227 of the symbols 'c, 'c++ or 'string. It's much faster than using
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
4228 `c-in-literal' and is intended to be used when you need both the
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
4229 type of a literal and its limits.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4230
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4231 Note that this function might do hidden buffer changes. See the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4232 comment at the start of cc-engine.el for more info."
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4233
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4234 (if (consp range)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4235 (save-excursion
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4236 (goto-char (car range))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4237 (cond ((looking-at c-string-limit-regexp) 'string)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4238 ((or (looking-at "//") ; c++ line comment
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4239 (and (looking-at "\\s<") ; comment starter
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4240 (looking-at "#"))) ; awk comment.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4241 'c++)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4242 (t 'c))) ; Assuming the range is valid.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4243 range))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4244
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4245
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4246 ;; `c-find-decl-spots' and accompanying stuff.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4247
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4248 ;; Variables used in `c-find-decl-spots' to cache the search done for
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4249 ;; the first declaration in the last call. When that function starts,
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4250 ;; it needs to back up over syntactic whitespace to look at the last
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4251 ;; token before the region being searched. That can sometimes cause
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4252 ;; moves back and forth over a quite large region of comments and
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4253 ;; macros, which would be repeated for each changed character when
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4254 ;; we're called during fontification, since font-lock refontifies the
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4255 ;; current line for each change. Thus it's worthwhile to cache the
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4256 ;; first match.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4257 ;;
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4258 ;; `c-find-decl-syntactic-pos' is a syntactically relevant position in
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4259 ;; the syntactic whitespace less or equal to some start position.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4260 ;; There's no cached value if it's nil.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4261 ;;
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4262 ;; `c-find-decl-match-pos' is the match position if
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4263 ;; `c-find-decl-prefix-search' matched before the syntactic whitespace
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4264 ;; at `c-find-decl-syntactic-pos', or nil if there's no such match.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4265 (defvar c-find-decl-syntactic-pos nil)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4266 (make-variable-buffer-local 'c-find-decl-syntactic-pos)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4267 (defvar c-find-decl-match-pos nil)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4268 (make-variable-buffer-local 'c-find-decl-match-pos)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4269
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4270 (defsubst c-invalidate-find-decl-cache (change-min-pos)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4271 (and c-find-decl-syntactic-pos
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4272 (< change-min-pos c-find-decl-syntactic-pos)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4273 (setq c-find-decl-syntactic-pos nil)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4274
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4275 ; (defface c-debug-decl-spot-face
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4276 ; '((t (:background "Turquoise")))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4277 ; "Debug face to mark the spots where `c-find-decl-spots' stopped.")
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4278 ; (defface c-debug-decl-sws-face
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4279 ; '((t (:background "Khaki")))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4280 ; "Debug face to mark the syntactic whitespace between the declaration
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4281 ; spots and the preceding token end.")
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4282
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4283 (defmacro c-debug-put-decl-spot-faces (match-pos decl-pos)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4284 (when (facep 'c-debug-decl-spot-face)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4285 `(c-save-buffer-state ((match-pos ,match-pos) (decl-pos ,decl-pos))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4286 (c-debug-add-face (max match-pos (point-min)) decl-pos
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4287 'c-debug-decl-sws-face)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4288 (c-debug-add-face decl-pos (min (1+ decl-pos) (point-max))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4289 'c-debug-decl-spot-face))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4290 (defmacro c-debug-remove-decl-spot-faces (beg end)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4291 (when (facep 'c-debug-decl-spot-face)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4292 `(c-save-buffer-state ()
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4293 (c-debug-remove-face ,beg ,end 'c-debug-decl-spot-face)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4294 (c-debug-remove-face ,beg ,end 'c-debug-decl-sws-face))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4295
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4296 (defmacro c-find-decl-prefix-search ()
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4297 ;; Macro used inside `c-find-decl-spots'. It ought to be a defun,
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4298 ;; but it contains lots of free variables that refer to things
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4299 ;; inside `c-find-decl-spots'. The point is left at `cfd-match-pos'
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4300 ;; if there is a match, otherwise at `cfd-limit'.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4301 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4302 ;; This macro might do hidden buffer changes.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4303
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4304 '(progn
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4305 ;; Find the next property match position if we haven't got one already.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4306 (unless cfd-prop-match
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4307 (save-excursion
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4308 (while (progn
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4309 (goto-char (next-single-property-change
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4310 (point) 'c-type nil cfd-limit))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4311 (and (< (point) cfd-limit)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4312 (not (eq (c-get-char-property (1- (point)) 'c-type)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4313 'c-decl-end)))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4314 (setq cfd-prop-match (point))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4315
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4316 ;; Find the next `c-decl-prefix-or-start-re' match if we haven't
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4317 ;; got one already.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4318 (unless cfd-re-match
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4319
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4320 (if (> cfd-re-match-end (point))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4321 (goto-char cfd-re-match-end))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4322
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4323 (while (if (setq cfd-re-match-end
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4324 (re-search-forward c-decl-prefix-or-start-re
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4325 cfd-limit 'move))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4326
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4327 ;; Match. Check if it's inside a comment or string literal.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4328 (c-got-face-at
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4329 (if (setq cfd-re-match (match-end 1))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4330 ;; Matched the end of a token preceding a decl spot.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4331 (progn
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4332 (goto-char cfd-re-match)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4333 (1- cfd-re-match))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4334 ;; Matched a token that start a decl spot.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4335 (goto-char (match-beginning 0))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4336 (point))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4337 c-literal-faces)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4338
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4339 ;; No match. Finish up and exit the loop.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4340 (setq cfd-re-match cfd-limit)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4341 nil)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4342
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4343 ;; Skip out of comments and string literals.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4344 (while (progn
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4345 (goto-char (next-single-property-change
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4346 (point) 'face nil cfd-limit))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4347 (and (< (point) cfd-limit)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4348 (c-got-face-at (point) c-literal-faces)))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4349
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4350 ;; If we matched at the decl start, we have to back up over the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4351 ;; preceding syntactic ws to set `cfd-match-pos' and to catch
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4352 ;; any decl spots in the syntactic ws.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4353 (unless cfd-re-match
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4354 (c-backward-syntactic-ws)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4355 (setq cfd-re-match (point))))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4356
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4357 ;; Choose whichever match is closer to the start.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4358 (if (< cfd-re-match cfd-prop-match)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4359 (setq cfd-match-pos cfd-re-match
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4360 cfd-re-match nil)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4361 (setq cfd-match-pos cfd-prop-match
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4362 cfd-prop-match nil))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4363
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4364 (goto-char cfd-match-pos)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4365
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4366 (when (< cfd-match-pos cfd-limit)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4367 ;; Skip forward past comments only so we don't skip macros.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4368 (c-forward-comments)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4369 ;; Set the position to continue at. We can avoid going over
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4370 ;; the comments skipped above a second time, but it's possible
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4371 ;; that the comment skipping has taken us past `cfd-prop-match'
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4372 ;; since the property might be used inside comments.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4373 (setq cfd-continue-pos (if cfd-prop-match
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4374 (min cfd-prop-match (point))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4375 (point))))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4376
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4377 (defun c-find-decl-spots (cfd-limit cfd-decl-re cfd-face-checklist cfd-fun)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4378 ;; Call CFD-FUN for each possible spot for a declaration, cast or
98693
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
4379 ;; label from the point to CFD-LIMIT.
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
4380 ;;
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
4381 ;; CFD-FUN is called with point at the start of the spot. It's
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
4382 ;; passed two arguments: The first is the end position of the token
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
4383 ;; preceding the spot, or 0 for the implicit match at bob. The
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
4384 ;; second is a flag that is t when the match is inside a macro. If
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
4385 ;; CFD-FUN adds `c-decl-end' properties somewhere below the current
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
4386 ;; spot, it should return non-nil to ensure that the next search
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
4387 ;; will find them.
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
4388 ;;
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
4389 ;; Such a spot is:
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4390 ;; o The first token after bob.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4391 ;; o The first token after the end of submatch 1 in
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4392 ;; `c-decl-prefix-or-start-re' when that submatch matches.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4393 ;; o The start of each `c-decl-prefix-or-start-re' match when
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4394 ;; submatch 1 doesn't match.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4395 ;; o The first token after the end of each occurence of the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4396 ;; `c-type' text property with the value `c-decl-end', provided
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4397 ;; `c-type-decl-end-used' is set.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4398 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4399 ;; Only a spot that match CFD-DECL-RE and whose face is in the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4400 ;; CFD-FACE-CHECKLIST list causes CFD-FUN to be called. The face
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4401 ;; check is disabled if CFD-FACE-CHECKLIST is nil.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4402 ;;
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4403 ;; If the match is inside a macro then the buffer is narrowed to the
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4404 ;; end of it, so that CFD-FUN can investigate the following tokens
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4405 ;; without matching something that begins inside a macro and ends
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4406 ;; outside it. It's to avoid this work that the CFD-DECL-RE and
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4407 ;; CFD-FACE-CHECKLIST checks exist.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4408 ;;
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4409 ;; The spots are visited approximately in order from top to bottom.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4410 ;; It's however the positions where `c-decl-prefix-or-start-re'
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4411 ;; matches and where `c-decl-end' properties are found that are in
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4412 ;; order. Since the spots often are at the following token, they
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4413 ;; might be visited out of order insofar as more spots are reported
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4414 ;; later on within the syntactic whitespace between the match
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4415 ;; positions and their spots.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4416 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4417 ;; It's assumed that comments and strings are fontified in the
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4418 ;; searched range.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4419 ;;
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4420 ;; This is mainly used in fontification, and so has an elaborate
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4421 ;; cache to handle repeated calls from the same start position; see
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4422 ;; the variables above.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4423 ;;
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4424 ;; All variables in this function begin with `cfd-' to avoid name
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4425 ;; collision with the (dynamically bound) variables used in CFD-FUN.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4426 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4427 ;; This function might do hidden buffer changes.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4428
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4429 (let ((cfd-start-pos (point))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4430 (cfd-buffer-end (point-max))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4431 ;; The end of the token preceding the decl spot last found
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4432 ;; with `c-decl-prefix-or-start-re'. `cfd-limit' if there's
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4433 ;; no match.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4434 cfd-re-match
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4435 ;; The end position of the last `c-decl-prefix-or-start-re'
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4436 ;; match. If this is greater than `cfd-continue-pos', the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4437 ;; next regexp search is started here instead.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4438 (cfd-re-match-end (point-min))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4439 ;; The end of the last `c-decl-end' found by
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4440 ;; `c-find-decl-prefix-search'. `cfd-limit' if there's no
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4441 ;; match. If searching for the property isn't needed then we
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4442 ;; disable it by setting it to `cfd-limit' directly.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4443 (cfd-prop-match (unless c-type-decl-end-used cfd-limit))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4444 ;; The end of the token preceding the decl spot last found by
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4445 ;; `c-find-decl-prefix-search'. 0 for the implicit match at
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4446 ;; bob. `cfd-limit' if there's no match. In other words,
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4447 ;; this is the minimum of `cfd-re-match' and `cfd-prop-match'.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4448 (cfd-match-pos cfd-limit)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4449 ;; The position to continue searching at.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4450 cfd-continue-pos
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4451 ;; The position of the last "real" token we've stopped at.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4452 ;; This can be greater than `cfd-continue-pos' when we get
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4453 ;; hits inside macros or at `c-decl-end' positions inside
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4454 ;; comments.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4455 (cfd-token-pos 0)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4456 ;; The end position of the last entered macro.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4457 (cfd-macro-end 0))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4458
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4459 ;; Initialize by finding a syntactically relevant start position
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4460 ;; before the point, and do the first `c-decl-prefix-or-start-re'
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4461 ;; search unless we're at bob.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4462
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4463 (let (start-in-literal start-in-macro syntactic-pos)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4464 ;; Must back up a bit since we look for the end of the previous
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4465 ;; statement or declaration, which is earlier than the first
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4466 ;; returned match.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4467
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4468 (cond
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4469 ;; First we need to move to a syntactically relevant position.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4470 ;; Begin by backing out of comment or string literals.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4471 ((and
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4472 (when (c-got-face-at (point) c-literal-faces)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4473 ;; Try to use the faces to back up to the start of the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4474 ;; literal. FIXME: What if the point is on a declaration
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4475 ;; inside a comment?
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4476 (while (and (not (bobp))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4477 (c-got-face-at (1- (point)) c-literal-faces))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4478 (goto-char (previous-single-property-change
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4479 (point) 'face nil (point-min))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4480
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4481 ;; XEmacs doesn't fontify the quotes surrounding string
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4482 ;; literals.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4483 (and (featurep 'xemacs)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4484 (eq (get-text-property (point) 'face)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4485 'font-lock-string-face)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4486 (not (bobp))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4487 (progn (backward-char)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4488 (not (looking-at c-string-limit-regexp)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4489 (forward-char))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4490
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4491 ;; Don't trust the literal to contain only literal faces
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4492 ;; (the font lock package might not have fontified the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4493 ;; start of it at all, for instance) so check that we have
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4494 ;; arrived at something that looks like a start or else
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4495 ;; resort to `c-literal-limits'.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4496 (unless (looking-at c-literal-start-regexp)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4497 (let ((range (c-literal-limits)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4498 (if range (goto-char (car range)))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4499
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4500 (setq start-in-literal (point)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4501
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4502 ;; The start is in a literal. If the limit is in the same
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4503 ;; one we don't have to find a syntactic position etc. We
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4504 ;; only check that if the limit is at or before bonl to save
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4505 ;; time; it covers the by far most common case when font-lock
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4506 ;; refontifies the current line only.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4507 (<= cfd-limit (c-point 'bonl cfd-start-pos))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4508 (save-excursion
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4509 (goto-char cfd-start-pos)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4510 (while (progn
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4511 (goto-char (next-single-property-change
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4512 (point) 'face nil cfd-limit))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4513 (and (< (point) cfd-limit)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4514 (c-got-face-at (point) c-literal-faces))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4515 (= (point) cfd-limit)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4516
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4517 ;; Completely inside a literal. Set up variables to trig the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4518 ;; (< cfd-continue-pos cfd-start-pos) case below and it'll
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4519 ;; find a suitable start position.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4520 (setq cfd-continue-pos start-in-literal))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4521
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4522 ;; Check if the region might be completely inside a macro, to
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4523 ;; optimize that like the completely-inside-literal above.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4524 ((save-excursion
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4525 (and (= (forward-line 1) 0)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4526 (bolp) ; forward-line has funny behavior at eob.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4527 (>= (point) cfd-limit)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4528 (progn (backward-char)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4529 (eq (char-before) ?\\))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4530 ;; (Maybe) completely inside a macro. Only need to trig the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4531 ;; (< cfd-continue-pos cfd-start-pos) case below to make it
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4532 ;; set things up.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4533 (setq cfd-continue-pos (1- cfd-start-pos)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4534 start-in-macro t))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4535
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4536 (t
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4537 ;; Back out of any macro so we don't miss any declaration
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4538 ;; that could follow after it.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4539 (when (c-beginning-of-macro)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4540 (setq start-in-macro t))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4541
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4542 ;; Now we're at a proper syntactically relevant position so we
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4543 ;; can use the cache. But first clear it if it applied
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4544 ;; further down.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4545 (c-invalidate-find-decl-cache cfd-start-pos)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4546
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4547 (setq syntactic-pos (point))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4548 (unless (eq syntactic-pos c-find-decl-syntactic-pos)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4549 ;; Don't have to do this if the cache is relevant here,
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4550 ;; typically if the same line is refontified again. If
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4551 ;; we're just some syntactic whitespace further down we can
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4552 ;; still use the cache to limit the skipping.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4553 (c-backward-syntactic-ws c-find-decl-syntactic-pos))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4554
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4555 ;; If we hit `c-find-decl-syntactic-pos' and
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4556 ;; `c-find-decl-match-pos' is set then we install the cached
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4557 ;; values. If we hit `c-find-decl-syntactic-pos' and
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4558 ;; `c-find-decl-match-pos' is nil then we know there's no decl
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4559 ;; prefix in the whitespace before `c-find-decl-syntactic-pos'
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4560 ;; and so we can continue the search from this point. If we
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4561 ;; didn't hit `c-find-decl-syntactic-pos' then we're now in
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4562 ;; the right spot to begin searching anyway.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4563 (if (and (eq (point) c-find-decl-syntactic-pos)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4564 c-find-decl-match-pos)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4565 (setq cfd-match-pos c-find-decl-match-pos
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4566 cfd-continue-pos syntactic-pos)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4567
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4568 (setq c-find-decl-syntactic-pos syntactic-pos)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4569
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4570 (when (if (bobp)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4571 ;; Always consider bob a match to get the first
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4572 ;; declaration in the file. Do this separately instead of
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4573 ;; letting `c-decl-prefix-or-start-re' match bob, so that
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4574 ;; regexp always can consume at least one character to
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4575 ;; ensure that we won't get stuck in an infinite loop.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4576 (setq cfd-re-match 0)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4577 (backward-char)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4578 (c-beginning-of-current-token)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4579 (< (point) cfd-limit))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4580 ;; Do an initial search now. In the bob case above it's
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4581 ;; only done to search for a `c-decl-end' spot.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4582 (c-find-decl-prefix-search))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4583
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4584 (setq c-find-decl-match-pos (and (< cfd-match-pos cfd-start-pos)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4585 cfd-match-pos)))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4586
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4587 ;; Advance `cfd-continue-pos' if it's before the start position.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4588 ;; The closest continue position that might have effect at or
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4589 ;; after the start depends on what we started in. This also
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4590 ;; finds a suitable start position in the special cases when the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4591 ;; region is completely within a literal or macro.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4592 (when (and cfd-continue-pos (< cfd-continue-pos cfd-start-pos))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4593
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4594 (cond
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4595 (start-in-macro
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4596 ;; If we're in a macro then it's the closest preceding token
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4597 ;; in the macro. Check this before `start-in-literal',
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4598 ;; since if we're inside a literal in a macro, the preceding
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4599 ;; token is earlier than any `c-decl-end' spot inside the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4600 ;; literal (comment).
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4601 (goto-char (or start-in-literal cfd-start-pos))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4602 ;; The only syntactic ws in macros are comments.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4603 (c-backward-comments)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4604 (backward-char)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4605 (c-beginning-of-current-token))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4606
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4607 (start-in-literal
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4608 ;; If we're in a comment it can only be the closest
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4609 ;; preceding `c-decl-end' position within that comment, if
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4610 ;; any. Go back to the beginning of such a property so that
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4611 ;; `c-find-decl-prefix-search' will find the end of it.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4612 ;; (Can't stop at the end and install it directly on
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4613 ;; `cfd-prop-match' since that variable might be cleared
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4614 ;; after `cfd-fun' below.)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4615 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4616 ;; Note that if the literal is a string then the property
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4617 ;; search will simply skip to the beginning of it right
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4618 ;; away.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4619 (if (not c-type-decl-end-used)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4620 (goto-char start-in-literal)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4621 (goto-char cfd-start-pos)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4622 (while (progn
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4623 (goto-char (previous-single-property-change
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4624 (point) 'c-type nil start-in-literal))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4625 (and (> (point) start-in-literal)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4626 (not (eq (c-get-char-property (point) 'c-type)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4627 'c-decl-end))))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4628
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4629 (when (= (point) start-in-literal)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4630 ;; Didn't find any property inside the comment, so we can
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4631 ;; skip it entirely. (This won't skip past a string, but
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4632 ;; that'll be handled quickly by the next
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4633 ;; `c-find-decl-prefix-search' anyway.)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4634 (c-forward-single-comment)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4635 (if (> (point) cfd-limit)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4636 (goto-char cfd-limit))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4637
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4638 (t
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4639 ;; If we started in normal code, the only match that might
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4640 ;; apply before the start is what we already got in
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4641 ;; `cfd-match-pos' so we can continue at the start position.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4642 ;; (Note that we don't get here if the first match is below
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4643 ;; it.)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4644 (goto-char cfd-start-pos)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4645
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4646 ;; Delete found matches if they are before our new continue
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4647 ;; position, so that `c-find-decl-prefix-search' won't back up
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4648 ;; to them later on.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4649 (setq cfd-continue-pos (point))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4650 (when (and cfd-re-match (< cfd-re-match cfd-continue-pos))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4651 (setq cfd-re-match nil))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4652 (when (and cfd-prop-match (< cfd-prop-match cfd-continue-pos))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4653 (setq cfd-prop-match nil)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4654
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4655 (if syntactic-pos
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4656 ;; This is the normal case and we got a proper syntactic
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4657 ;; position. If there's a match then it's always outside
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4658 ;; macros and comments, so advance to the next token and set
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4659 ;; `cfd-token-pos'. The loop below will later go back using
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4660 ;; `cfd-continue-pos' to fix declarations inside the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4661 ;; syntactic ws.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4662 (when (and cfd-match-pos (< cfd-match-pos syntactic-pos))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4663 (goto-char syntactic-pos)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4664 (c-forward-syntactic-ws)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4665 (and cfd-continue-pos
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4666 (< cfd-continue-pos (point))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4667 (setq cfd-token-pos (point))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4668
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4669 ;; Have one of the special cases when the region is completely
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4670 ;; within a literal or macro. `cfd-continue-pos' is set to a
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4671 ;; good start position for the search, so do it.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4672 (c-find-decl-prefix-search)))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4673
75027
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
4674 ;; Now loop. Round what? (ACM, 2006/7/5). We already got the first match.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4675
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4676 (while (progn
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4677 (while (and
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4678 (< cfd-match-pos cfd-limit)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4679
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4680 (or
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4681 ;; Kludge to filter out matches on the "<" that
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4682 ;; aren't open parens, for the sake of languages
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4683 ;; that got `c-recognize-<>-arglists' set.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4684 (and (eq (char-before cfd-match-pos) ?<)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4685 (not (c-get-char-property (1- cfd-match-pos)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4686 'syntax-table)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4687
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4688 ;; If `cfd-continue-pos' is less or equal to
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4689 ;; `cfd-token-pos', we've got a hit inside a macro
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4690 ;; that's in the syntactic whitespace before the last
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4691 ;; "real" declaration we've checked. If they're equal
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4692 ;; we've arrived at the declaration a second time, so
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4693 ;; there's nothing to do.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4694 (= cfd-continue-pos cfd-token-pos)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4695
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4696 (progn
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4697 ;; If `cfd-continue-pos' is less than `cfd-token-pos'
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4698 ;; we're still searching for declarations embedded in
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4699 ;; the syntactic whitespace. In that case we need
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4700 ;; only to skip comments and not macros, since they
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4701 ;; can't be nested, and that's already been done in
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4702 ;; `c-find-decl-prefix-search'.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4703 (when (> cfd-continue-pos cfd-token-pos)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4704 (c-forward-syntactic-ws)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4705 (setq cfd-token-pos (point)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4706
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4707 ;; Continue if the following token fails the
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4708 ;; CFD-DECL-RE and CFD-FACE-CHECKLIST checks.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4709 (when (or (>= (point) cfd-limit)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4710 (not (looking-at cfd-decl-re))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4711 (and cfd-face-checklist
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4712 (not (c-got-face-at
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4713 (point) cfd-face-checklist))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4714 (goto-char cfd-continue-pos)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4715 t)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4716
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4717 (< (point) cfd-limit))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4718 (c-find-decl-prefix-search))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4719
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4720 (< (point) cfd-limit))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4721
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4722 (when (and
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4723 (>= (point) cfd-start-pos)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4724
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4725 (progn
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4726 ;; Narrow to the end of the macro if we got a hit inside
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4727 ;; one, to avoid recognizing things that start inside the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4728 ;; macro and end outside it.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4729 (when (> cfd-match-pos cfd-macro-end)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4730 ;; Not in the same macro as in the previous round.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4731 (save-excursion
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4732 (goto-char cfd-match-pos)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4733 (setq cfd-macro-end
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4734 (if (save-excursion (and (c-beginning-of-macro)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4735 (< (point) cfd-match-pos)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4736 (progn (c-end-of-macro)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4737 (point))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4738 0))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4739
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4740 (if (zerop cfd-macro-end)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4741 t
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4742 (if (> cfd-macro-end (point))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4743 (progn (narrow-to-region (point-min) cfd-macro-end)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4744 t)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4745 ;; The matched token was the last thing in the macro,
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4746 ;; so the whole match is bogus.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4747 (setq cfd-macro-end 0)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4748 nil))))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4749
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4750 (c-debug-put-decl-spot-faces cfd-match-pos (point))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4751 (if (funcall cfd-fun cfd-match-pos (/= cfd-macro-end 0))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4752 (setq cfd-prop-match nil))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4753
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4754 (when (/= cfd-macro-end 0)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4755 ;; Restore limits if we did macro narrowment above.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4756 (narrow-to-region (point-min) cfd-buffer-end)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4757
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4758 (goto-char cfd-continue-pos)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4759 (if (= cfd-continue-pos cfd-limit)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4760 (setq cfd-match-pos cfd-limit)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4761 (c-find-decl-prefix-search)))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4762
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4763
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4764 ;; A cache for found types.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4765
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4766 ;; Buffer local variable that contains an obarray with the types we've
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4767 ;; found. If a declaration is recognized somewhere we record the
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4768 ;; fully qualified identifier in it to recognize it as a type
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4769 ;; elsewhere in the file too. This is not accurate since we do not
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4770 ;; bother with the scoping rules of the languages, but in practice the
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4771 ;; same name is seldom used as both a type and something else in a
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4772 ;; file, and we only use this as a last resort in ambiguous cases (see
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4773 ;; `c-forward-decl-or-cast-1').
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4774 ;;
76400
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
4775 ;; Not every type need be in this cache. However, things which have
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
4776 ;; ceased to be types must be removed from it.
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
4777 ;;
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4778 ;; Template types in C++ are added here too but with the template
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4779 ;; arglist replaced with "<>" in references or "<" for the one in the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4780 ;; primary type. E.g. the type "Foo<A,B>::Bar<C>" is stored as
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4781 ;; "Foo<>::Bar<". This avoids storing very long strings (since C++
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4782 ;; template specs can be fairly sized programs in themselves) and
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4783 ;; improves the hit ratio (it's a type regardless of the template
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4784 ;; args; it's just not the same type, but we're only interested in
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4785 ;; recognizing types, not telling distinct types apart). Note that
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4786 ;; template types in references are added here too; from the example
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4787 ;; above there will also be an entry "Foo<".
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4788 (defvar c-found-types nil)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4789 (make-variable-buffer-local 'c-found-types)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4790
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4791 (defsubst c-clear-found-types ()
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4792 ;; Clears `c-found-types'.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4793 (setq c-found-types (make-vector 53 0)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4794
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4795 (defun c-add-type (from to)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4796 ;; Add the given region as a type in `c-found-types'. If the region
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4797 ;; doesn't match an existing type but there is a type which is equal
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4798 ;; to the given one except that the last character is missing, then
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4799 ;; the shorter type is removed. That's done to avoid adding all
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4800 ;; prefixes of a type as it's being entered and font locked. This
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4801 ;; doesn't cover cases like when characters are removed from a type
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4802 ;; or added in the middle. We'd need the position of point when the
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4803 ;; font locking is invoked to solve this well.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4804 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4805 ;; This function might do hidden buffer changes.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4806 (let ((type (c-syntactic-content from to c-recognize-<>-arglists)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4807 (unless (intern-soft type c-found-types)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4808 (unintern (substring type 0 -1) c-found-types)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4809 (intern type c-found-types))))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4810
76400
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
4811 (defun c-unfind-type (name)
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
4812 ;; Remove the "NAME" from c-found-types, if present.
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
4813 (unintern name c-found-types))
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
4814
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4815 (defsubst c-check-type (from to)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4816 ;; Return non-nil if the given region contains a type in
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4817 ;; `c-found-types'.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4818 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4819 ;; This function might do hidden buffer changes.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4820 (intern-soft (c-syntactic-content from to c-recognize-<>-arglists)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4821 c-found-types))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4822
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4823 (defun c-list-found-types ()
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4824 ;; Return all the types in `c-found-types' as a sorted list of
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4825 ;; strings.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4826 (let (type-list)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4827 (mapatoms (lambda (type)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4828 (setq type-list (cons (symbol-name type)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4829 type-list)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4830 c-found-types)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4831 (sort type-list 'string-lessp)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4832
85503
59ee4068f60b * progmodes/gud.el (gud-target-name): Move definition before use.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78656
diff changeset
4833 ;; Shut up the byte compiler.
59ee4068f60b * progmodes/gud.el (gud-target-name): Move definition before use.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78656
diff changeset
4834 (defvar c-maybe-stale-found-type)
59ee4068f60b * progmodes/gud.el (gud-target-name): Move definition before use.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78656
diff changeset
4835
76400
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
4836 (defun c-trim-found-types (beg end old-len)
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
4837 ;; An after change function which, in conjunction with the info in
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
4838 ;; c-maybe-stale-found-type (set in c-before-change), removes a type
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
4839 ;; from `c-found-types', should this type have become stale. For
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
4840 ;; example, this happens to "foo" when "foo \n bar();" becomes
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
4841 ;; "foo(); \n bar();". Such stale types, if not removed, foul up
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
4842 ;; the fontification.
79408
a29ca195b71e (c-crosses-statement-barrier-p): Fix typo in docstring.
Juanma Barranquero <lekktu@gmail.com>
parents: 78656
diff changeset
4843 ;;
76400
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
4844 ;; Have we, perhaps, added non-ws characters to the front/back of a found
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
4845 ;; type?
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
4846 (when (> end beg)
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
4847 (save-excursion
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
4848 (when (< end (point-max))
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
4849 (goto-char end)
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
4850 (if (and (c-beginning-of-current-token) ; only moves when we started in the middle
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
4851 (progn (goto-char end)
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
4852 (c-end-of-current-token)))
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
4853 (c-unfind-type (buffer-substring-no-properties
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
4854 end (point)))))
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
4855 (when (> beg (point-min))
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
4856 (goto-char beg)
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
4857 (if (and (c-end-of-current-token) ; only moves when we started in the middle
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
4858 (progn (goto-char beg)
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
4859 (c-beginning-of-current-token)))
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
4860 (c-unfind-type (buffer-substring-no-properties
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
4861 (point) beg))))))
79408
a29ca195b71e (c-crosses-statement-barrier-p): Fix typo in docstring.
Juanma Barranquero <lekktu@gmail.com>
parents: 78656
diff changeset
4862
76400
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
4863 (if c-maybe-stale-found-type ; e.g. (c-decl-id-start "foo" 97 107 " (* ooka) " "o")
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
4864 (cond
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
4865 ;; Changing the amount of (already existing) whitespace - don't do anything.
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
4866 ((and (c-partial-ws-p beg end)
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
4867 (or (= beg end) ; removal of WS
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
4868 (string-match "^[ \t\n\r\f\v]*$" (nth 5 c-maybe-stale-found-type)))))
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
4869
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
4870 ;; The syntactic relationship which defined a "found type" has been
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
4871 ;; destroyed.
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
4872 ((eq (car c-maybe-stale-found-type) 'c-decl-id-start)
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
4873 (c-unfind-type (cadr c-maybe-stale-found-type)))
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
4874 ;; ((eq (car c-maybe-stale-found-type) 'c-decl-type-start) FIXME!!!
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
4875 )))
4dc5b2641221 (c-partial-ws-p, c-unfind-type, c-trim-found-types): new functions.
Alan Mackenzie <acm@muc.de>
parents: 75623
diff changeset
4876
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4877
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4878 ;; Handling of small scale constructs like types and names.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4879
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4880 (defun c-after-change-check-<>-operators (beg end)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4881 ;; This is called from `after-change-functions' when
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4882 ;; c-recognize-<>-arglists' is set. It ensures that no "<" or ">"
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4883 ;; chars with paren syntax become part of another operator like "<<"
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4884 ;; or ">=".
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4885 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4886 ;; This function might do hidden buffer changes.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4887
69140
3d8b060d10fb cc-align.el, cc-awk.el, cc-bytecomp.el, cc-cmds.el, cc-compat.el,
Alan Mackenzie <acm@muc.de>
parents: 68773
diff changeset
4888 (save-excursion
3d8b060d10fb cc-align.el, cc-awk.el, cc-bytecomp.el, cc-cmds.el, cc-compat.el,
Alan Mackenzie <acm@muc.de>
parents: 68773
diff changeset
4889 (goto-char beg)
3d8b060d10fb cc-align.el, cc-awk.el, cc-bytecomp.el, cc-cmds.el, cc-compat.el,
Alan Mackenzie <acm@muc.de>
parents: 68773
diff changeset
4890 (when (or (looking-at "[<>]")
3d8b060d10fb cc-align.el, cc-awk.el, cc-bytecomp.el, cc-cmds.el, cc-compat.el,
Alan Mackenzie <acm@muc.de>
parents: 68773
diff changeset
4891 (< (skip-chars-backward "<>") 0))
3d8b060d10fb cc-align.el, cc-awk.el, cc-bytecomp.el, cc-cmds.el, cc-compat.el,
Alan Mackenzie <acm@muc.de>
parents: 68773
diff changeset
4892
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4893 (goto-char beg)
69140
3d8b060d10fb cc-align.el, cc-awk.el, cc-bytecomp.el, cc-cmds.el, cc-compat.el,
Alan Mackenzie <acm@muc.de>
parents: 68773
diff changeset
4894 (c-beginning-of-current-token)
3d8b060d10fb cc-align.el, cc-awk.el, cc-bytecomp.el, cc-cmds.el, cc-compat.el,
Alan Mackenzie <acm@muc.de>
parents: 68773
diff changeset
4895 (when (and (< (point) beg)
3d8b060d10fb cc-align.el, cc-awk.el, cc-bytecomp.el, cc-cmds.el, cc-compat.el,
Alan Mackenzie <acm@muc.de>
parents: 68773
diff changeset
4896 (looking-at c-<>-multichar-token-regexp)
3d8b060d10fb cc-align.el, cc-awk.el, cc-bytecomp.el, cc-cmds.el, cc-compat.el,
Alan Mackenzie <acm@muc.de>
parents: 68773
diff changeset
4897 (< beg (setq beg (match-end 0))))
3d8b060d10fb cc-align.el, cc-awk.el, cc-bytecomp.el, cc-cmds.el, cc-compat.el,
Alan Mackenzie <acm@muc.de>
parents: 68773
diff changeset
4898 (while (progn (skip-chars-forward "^<>" beg)
3d8b060d10fb cc-align.el, cc-awk.el, cc-bytecomp.el, cc-cmds.el, cc-compat.el,
Alan Mackenzie <acm@muc.de>
parents: 68773
diff changeset
4899 (< (point) beg))
3d8b060d10fb cc-align.el, cc-awk.el, cc-bytecomp.el, cc-cmds.el, cc-compat.el,
Alan Mackenzie <acm@muc.de>
parents: 68773
diff changeset
4900 (c-clear-char-property (point) 'syntax-table)
3d8b060d10fb cc-align.el, cc-awk.el, cc-bytecomp.el, cc-cmds.el, cc-compat.el,
Alan Mackenzie <acm@muc.de>
parents: 68773
diff changeset
4901 (forward-char))))
3d8b060d10fb cc-align.el, cc-awk.el, cc-bytecomp.el, cc-cmds.el, cc-compat.el,
Alan Mackenzie <acm@muc.de>
parents: 68773
diff changeset
4902
3d8b060d10fb cc-align.el, cc-awk.el, cc-bytecomp.el, cc-cmds.el, cc-compat.el,
Alan Mackenzie <acm@muc.de>
parents: 68773
diff changeset
4903 (when (< beg end)
3d8b060d10fb cc-align.el, cc-awk.el, cc-bytecomp.el, cc-cmds.el, cc-compat.el,
Alan Mackenzie <acm@muc.de>
parents: 68773
diff changeset
4904 (goto-char end)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4905 (when (or (looking-at "[<>]")
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4906 (< (skip-chars-backward "<>") 0))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4907
69140
3d8b060d10fb cc-align.el, cc-awk.el, cc-bytecomp.el, cc-cmds.el, cc-compat.el,
Alan Mackenzie <acm@muc.de>
parents: 68773
diff changeset
4908 (goto-char end)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4909 (c-beginning-of-current-token)
69140
3d8b060d10fb cc-align.el, cc-awk.el, cc-bytecomp.el, cc-cmds.el, cc-compat.el,
Alan Mackenzie <acm@muc.de>
parents: 68773
diff changeset
4910 (when (and (< (point) end)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4911 (looking-at c-<>-multichar-token-regexp)
69140
3d8b060d10fb cc-align.el, cc-awk.el, cc-bytecomp.el, cc-cmds.el, cc-compat.el,
Alan Mackenzie <acm@muc.de>
parents: 68773
diff changeset
4912 (< end (setq end (match-end 0))))
3d8b060d10fb cc-align.el, cc-awk.el, cc-bytecomp.el, cc-cmds.el, cc-compat.el,
Alan Mackenzie <acm@muc.de>
parents: 68773
diff changeset
4913 (while (progn (skip-chars-forward "^<>" end)
3d8b060d10fb cc-align.el, cc-awk.el, cc-bytecomp.el, cc-cmds.el, cc-compat.el,
Alan Mackenzie <acm@muc.de>
parents: 68773
diff changeset
4914 (< (point) end))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4915 (c-clear-char-property (point) 'syntax-table)
69140
3d8b060d10fb cc-align.el, cc-awk.el, cc-bytecomp.el, cc-cmds.el, cc-compat.el,
Alan Mackenzie <acm@muc.de>
parents: 68773
diff changeset
4916 (forward-char)))))))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4917
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4918 ;; Dynamically bound variable that instructs `c-forward-type' to also
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4919 ;; treat possible types (i.e. those that it normally returns 'maybe or
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4920 ;; 'found for) as actual types (and always return 'found for them).
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4921 ;; This means that it records them in `c-record-type-identifiers' if
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4922 ;; that is set, and that it adds them to `c-found-types'.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4923 (defvar c-promote-possible-types nil)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4924
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4925 ;; Dynamically bound variable that instructs `c-forward-<>-arglist' to
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4926 ;; mark up successfully parsed arglists with paren syntax properties on
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4927 ;; the surrounding angle brackets and with `c-<>-arg-sep' in the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4928 ;; `c-type' property of each argument separating comma.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4929 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4930 ;; Setting this variable also makes `c-forward-<>-arglist' recurse into
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4931 ;; all arglists for side effects (i.e. recording types), otherwise it
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4932 ;; exploits any existing paren syntax properties to quickly jump to the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4933 ;; end of already parsed arglists.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4934 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4935 ;; Marking up the arglists is not the default since doing that correctly
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4936 ;; depends on a proper value for `c-restricted-<>-arglists'.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4937 (defvar c-parse-and-markup-<>-arglists nil)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4938
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4939 ;; Dynamically bound variable that instructs `c-forward-<>-arglist' to
53073
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
4940 ;; not accept arglists that contain binary operators.
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
4941 ;;
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
4942 ;; This is primarily used to handle C++ template arglists. C++
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
4943 ;; disambiguates them by checking whether the preceding name is a
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
4944 ;; template or not. We can't do that, so we assume it is a template
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
4945 ;; if it can be parsed as one. That usually works well since
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
4946 ;; comparison expressions on the forms "a < b > c" or "a < b, c > d"
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
4947 ;; in almost all cases would be pointless.
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
4948 ;;
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
4949 ;; However, in function arglists, e.g. in "foo (a < b, c > d)", we
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
4950 ;; should let the comma separate the function arguments instead. And
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
4951 ;; in a context where the value of the expression is taken, e.g. in
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
4952 ;; "if (a < b || c > d)", it's probably not a template.
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
4953 (defvar c-restricted-<>-arglists nil)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4954
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4955 ;; Dynamically bound variables that instructs
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4956 ;; `c-forward-keyword-clause', `c-forward-<>-arglist',
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4957 ;; `c-forward-name', `c-forward-type', `c-forward-decl-or-cast-1', and
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4958 ;; `c-forward-label' to record the ranges of all the type and
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4959 ;; reference identifiers they encounter. They will build lists on
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4960 ;; these variables where each element is a cons of the buffer
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4961 ;; positions surrounding each identifier. This recording is only
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4962 ;; activated when `c-record-type-identifiers' is non-nil.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4963 ;;
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4964 ;; All known types that can't be identifiers are recorded, and also
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4965 ;; other possible types if `c-promote-possible-types' is set.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4966 ;; Recording is however disabled inside angle bracket arglists that
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4967 ;; are encountered inside names and other angle bracket arglists.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4968 ;; Such occurrences are taken care of by `c-font-lock-<>-arglists'
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4969 ;; instead.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4970 ;;
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4971 ;; Only the names in C++ template style references (e.g. "tmpl" in
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4972 ;; "tmpl<a,b>::foo") are recorded as references, other references
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4973 ;; aren't handled here.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4974 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4975 ;; `c-forward-label' records the label identifier(s) on
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4976 ;; `c-record-ref-identifiers'.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4977 (defvar c-record-type-identifiers nil)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4978 (defvar c-record-ref-identifiers nil)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4979
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4980 ;; This variable will receive a cons cell of the range of the last
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4981 ;; single identifier symbol stepped over by `c-forward-name' if it's
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4982 ;; successful. This is the range that should be put on one of the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4983 ;; record lists above by the caller. It's assigned nil if there's no
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
4984 ;; such symbol in the name.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4985 (defvar c-last-identifier-range nil)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4986
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4987 (defmacro c-record-type-id (range)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4988 (if (eq (car-safe range) 'cons)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4989 ;; Always true.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4990 `(setq c-record-type-identifiers
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4991 (cons ,range c-record-type-identifiers))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4992 `(let ((range ,range))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4993 (if range
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4994 (setq c-record-type-identifiers
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4995 (cons range c-record-type-identifiers))))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4996
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4997 (defmacro c-record-ref-id (range)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4998 (if (eq (car-safe range) 'cons)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
4999 ;; Always true.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5000 `(setq c-record-ref-identifiers
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5001 (cons ,range c-record-ref-identifiers))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5002 `(let ((range ,range))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5003 (if range
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5004 (setq c-record-ref-identifiers
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5005 (cons range c-record-ref-identifiers))))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5006
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5007 ;; Dynamically bound variable that instructs `c-forward-type' to
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5008 ;; record the ranges of types that only are found. Behaves otherwise
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5009 ;; like `c-record-type-identifiers'.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5010 (defvar c-record-found-types nil)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5011
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5012 (defmacro c-forward-keyword-prefixed-id (type)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5013 ;; Used internally in `c-forward-keyword-clause' to move forward
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5014 ;; over a type (if TYPE is 'type) or a name (otherwise) which
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5015 ;; possibly is prefixed by keywords and their associated clauses.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5016 ;; Try with a type/name first to not trip up on those that begin
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5017 ;; with a keyword. Return t if a known or found type is moved
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5018 ;; over. The point is clobbered if nil is returned. If range
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5019 ;; recording is enabled, the identifier is recorded on as a type
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5020 ;; if TYPE is 'type or as a reference if TYPE is 'ref.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5021 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5022 ;; This macro might do hidden buffer changes.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5023 `(let (res)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5024 (while (if (setq res ,(if (eq type 'type)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5025 `(c-forward-type)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5026 `(c-forward-name)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5027 nil
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5028 (and (looking-at c-keywords-regexp)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5029 (c-forward-keyword-clause 1))))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5030 (when (memq res '(t known found prefix))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5031 ,(when (eq type 'ref)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5032 `(when c-record-type-identifiers
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5033 (c-record-ref-id c-last-identifier-range)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5034 t)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5035
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5036 (defmacro c-forward-id-comma-list (type update-safe-pos)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5037 ;; Used internally in `c-forward-keyword-clause' to move forward
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5038 ;; over a comma separated list of types or names using
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5039 ;; `c-forward-keyword-prefixed-id'.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5040 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5041 ;; This macro might do hidden buffer changes.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5042 `(while (and (progn
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5043 ,(when update-safe-pos
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5044 `(setq safe-pos (point)))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5045 (eq (char-after) ?,))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5046 (progn
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5047 (forward-char)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5048 (c-forward-syntactic-ws)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5049 (c-forward-keyword-prefixed-id ,type)))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5050
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5051 (defun c-forward-keyword-clause (match)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5052 ;; Submatch MATCH in the current match data is assumed to surround a
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5053 ;; token. If it's a keyword, move over it and any immediately
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5054 ;; following clauses associated with it, stopping at the start of
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5055 ;; the next token. t is returned in that case, otherwise the point
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5056 ;; stays and nil is returned. The kind of clauses that are
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5057 ;; recognized are those specified by `c-type-list-kwds',
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5058 ;; `c-ref-list-kwds', `c-colon-type-list-kwds',
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5059 ;; `c-paren-nontype-kwds', `c-paren-type-kwds', `c-<>-type-kwds',
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5060 ;; and `c-<>-arglist-kwds'.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5061 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5062 ;; This function records identifier ranges on
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5063 ;; `c-record-type-identifiers' and `c-record-ref-identifiers' if
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5064 ;; `c-record-type-identifiers' is non-nil.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5065 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5066 ;; Note that for `c-colon-type-list-kwds', which doesn't necessary
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5067 ;; apply directly after the keyword, the type list is moved over
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5068 ;; only when there is no unaccounted token before it (i.e. a token
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5069 ;; that isn't moved over due to some other keyword list). The
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5070 ;; identifier ranges in the list are still recorded if that should
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5071 ;; be done, though.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5072 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5073 ;; This function might do hidden buffer changes.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5074
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5075 (let ((kwd-sym (c-keyword-sym (match-string match))) safe-pos pos
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5076 ;; The call to `c-forward-<>-arglist' below is made after
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5077 ;; `c-<>-sexp-kwds' keywords, so we're certain they actually
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5078 ;; are angle bracket arglists and `c-restricted-<>-arglists'
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5079 ;; should therefore be nil.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5080 (c-parse-and-markup-<>-arglists t)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5081 c-restricted-<>-arglists)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5082
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5083 (when kwd-sym
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5084 (goto-char (match-end match))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5085 (c-forward-syntactic-ws)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5086 (setq safe-pos (point))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5087
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5088 (cond
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5089 ((and (c-keyword-member kwd-sym 'c-type-list-kwds)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5090 (c-forward-keyword-prefixed-id type))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5091 ;; There's a type directly after a keyword in `c-type-list-kwds'.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5092 (c-forward-id-comma-list type t))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5093
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5094 ((and (c-keyword-member kwd-sym 'c-ref-list-kwds)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5095 (c-forward-keyword-prefixed-id ref))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5096 ;; There's a name directly after a keyword in `c-ref-list-kwds'.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5097 (c-forward-id-comma-list ref t))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5098
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5099 ((and (c-keyword-member kwd-sym 'c-paren-any-kwds)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5100 (eq (char-after) ?\())
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5101 ;; There's an open paren after a keyword in `c-paren-any-kwds'.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5102
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5103 (forward-char)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5104 (when (and (setq pos (c-up-list-forward))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5105 (eq (char-before pos) ?\)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5106 (when (and c-record-type-identifiers
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5107 (c-keyword-member kwd-sym 'c-paren-type-kwds))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5108 ;; Use `c-forward-type' on every identifier we can find
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5109 ;; inside the paren, to record the types.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5110 (while (c-syntactic-re-search-forward c-symbol-start pos t)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5111 (goto-char (match-beginning 0))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5112 (unless (c-forward-type)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5113 (looking-at c-symbol-key) ; Always matches.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5114 (goto-char (match-end 0)))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5115
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5116 (goto-char pos)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5117 (c-forward-syntactic-ws)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5118 (setq safe-pos (point))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5119
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5120 ((and (c-keyword-member kwd-sym 'c-<>-sexp-kwds)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5121 (eq (char-after) ?<)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5122 (c-forward-<>-arglist (c-keyword-member kwd-sym 'c-<>-type-kwds)))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5123 (c-forward-syntactic-ws)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5124 (setq safe-pos (point)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5125
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5126 ((and (c-keyword-member kwd-sym 'c-nonsymbol-sexp-kwds)
52605
50c6e94a91cb (c-parse-state): Fixed bug that could cause errors when the state
Martin Stjernholm <mast@lysator.liu.se>
parents: 52401
diff changeset
5127 (not (looking-at c-symbol-start))
50c6e94a91cb (c-parse-state): Fixed bug that could cause errors when the state
Martin Stjernholm <mast@lysator.liu.se>
parents: 52401
diff changeset
5128 (c-safe (c-forward-sexp) t))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5129 (c-forward-syntactic-ws)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5130 (setq safe-pos (point))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5131
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5132 (when (c-keyword-member kwd-sym 'c-colon-type-list-kwds)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5133 (if (eq (char-after) ?:)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5134 ;; If we are at the colon already, we move over the type
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5135 ;; list after it.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5136 (progn
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5137 (forward-char)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5138 (c-forward-syntactic-ws)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5139 (when (c-forward-keyword-prefixed-id type)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5140 (c-forward-id-comma-list type t)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5141 ;; Not at the colon, so stop here. But the identifier
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5142 ;; ranges in the type list later on should still be
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5143 ;; recorded.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5144 (and c-record-type-identifiers
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5145 (progn
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5146 ;; If a keyword matched both one of the types above and
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5147 ;; this one, we match `c-colon-type-list-re' after the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5148 ;; clause matched above.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5149 (goto-char safe-pos)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5150 (looking-at c-colon-type-list-re))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5151 (progn
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5152 (goto-char (match-end 0))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5153 (c-forward-syntactic-ws)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5154 (c-forward-keyword-prefixed-id type))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5155 ;; There's a type after the `c-colon-type-list-re' match
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5156 ;; after a keyword in `c-colon-type-list-kwds'.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5157 (c-forward-id-comma-list type nil))))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5158
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5159 (goto-char safe-pos)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5160 t)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5161
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5162 (defun c-forward-<>-arglist (all-types)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5163 ;; The point is assumed to be at a "<". Try to treat it as the open
105424
098f8a47a308 Fix typos in comments.
Juanma Barranquero <lekktu@gmail.com>
parents: 105206
diff changeset
5164 ;; paren of an angle bracket arglist and move forward to the
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5165 ;; corresponding ">". If successful, the point is left after the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5166 ;; ">" and t is returned, otherwise the point isn't moved and nil is
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5167 ;; returned. If ALL-TYPES is t then all encountered arguments in
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5168 ;; the arglist that might be types are treated as found types.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5169 ;;
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5170 ;; The variable `c-parse-and-markup-<>-arglists' controls how this
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5171 ;; function handles text properties on the angle brackets and argument
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5172 ;; separating commas.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5173 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5174 ;; `c-restricted-<>-arglists' controls how lenient the template
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5175 ;; arglist recognition should be.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5176 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5177 ;; This function records identifier ranges on
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5178 ;; `c-record-type-identifiers' and `c-record-ref-identifiers' if
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5179 ;; `c-record-type-identifiers' is non-nil.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5180 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5181 ;; This function might do hidden buffer changes.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5182
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5183 (let ((start (point))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5184 ;; If `c-record-type-identifiers' is set then activate
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5185 ;; recording of any found types that constitute an argument in
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5186 ;; the arglist.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5187 (c-record-found-types (if c-record-type-identifiers t)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5188 (if (catch 'angle-bracket-arglist-escape
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5189 (setq c-record-found-types
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5190 (c-forward-<>-arglist-recur all-types)))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5191 (progn
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5192 (when (consp c-record-found-types)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5193 (setq c-record-type-identifiers
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5194 ;; `nconc' doesn't mind that the tail of
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5195 ;; `c-record-found-types' is t.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5196 (nconc c-record-found-types c-record-type-identifiers)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5197 t)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5198
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5199 (goto-char start)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5200 nil)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5201
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5202 (defun c-forward-<>-arglist-recur (all-types)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5203 ;; Recursive part of `c-forward-<>-arglist'.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5204 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5205 ;; This function might do hidden buffer changes.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5206
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5207 (let ((start (point)) res pos tmp
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5208 ;; Cover this so that any recorded found type ranges are
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5209 ;; automatically lost if it turns out to not be an angle
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5210 ;; bracket arglist. It's propagated through the return value
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5211 ;; on successful completion.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5212 (c-record-found-types c-record-found-types)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5213 ;; List that collects the positions after the argument
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5214 ;; separating ',' in the arglist.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5215 arg-start-pos)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5216
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5217 ;; If the '<' has paren open syntax then we've marked it as an angle
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5218 ;; bracket arglist before, so skip to the end.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5219 (if (and (not c-parse-and-markup-<>-arglists)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5220 (c-get-char-property (point) 'syntax-table))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5221
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5222 (progn
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5223 (forward-char)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5224 (if (and (c-go-up-list-forward)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5225 (eq (char-before) ?>))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5226 t
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5227
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5228 ;; Got unmatched paren angle brackets. We don't clear the paren
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5229 ;; syntax properties and retry, on the basis that it's very
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5230 ;; unlikely that paren angle brackets become operators by code
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5231 ;; manipulation. It's far more likely that it doesn't match due
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5232 ;; to narrowing or some temporary change.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5233 (goto-char start)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5234 nil))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5235
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5236 (forward-char)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5237 (unless (looking-at c-<-op-cont-regexp)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5238 (while (and
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5239 (progn
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5240
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5241 (when c-record-type-identifiers
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5242 (if all-types
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5243
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5244 ;; All encountered identifiers are types, so set the
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5245 ;; promote flag and parse the type.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5246 (progn
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5247 (c-forward-syntactic-ws)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5248 (when (looking-at c-identifier-start)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5249 (let ((c-promote-possible-types t))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5250 (c-forward-type))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5251
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5252 ;; Check if this arglist argument is a sole type. If
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5253 ;; it's known then it's recorded in
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5254 ;; `c-record-type-identifiers'. If it only is found
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5255 ;; then it's recorded in `c-record-found-types' which we
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5256 ;; might roll back if it turns out that this isn't an
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5257 ;; angle bracket arglist afterall.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5258 (when (memq (char-before) '(?, ?<))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5259 (let ((orig-record-found-types c-record-found-types))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5260 (c-forward-syntactic-ws)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5261 (and (memq (c-forward-type) '(known found))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5262 (not (looking-at "[,>]"))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5263 ;; A found type was recorded but it's not the
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5264 ;; only thing in the arglist argument, so reset
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5265 ;; `c-record-found-types'.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5266 (setq c-record-found-types
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5267 orig-record-found-types))))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5268
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5269 (setq pos (point))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5270 (or (when (eq (char-after) ?>)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5271 ;; Must check for '>' at the very start separately,
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5272 ;; since the regexp below has to avoid ">>" without
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5273 ;; using \\=.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5274 (forward-char)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5275 t)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5276
53073
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
5277 ;; Note: These regexps exploit the match order in \| so
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
5278 ;; that "<>" is matched by "<" rather than "[^>:-]>".
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5279 (c-syntactic-re-search-forward
53073
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
5280 (if c-restricted-<>-arglists
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
5281 ;; Stop on ',', '|', '&', '+' and '-' to catch
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
5282 ;; common binary operators that could be between
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
5283 ;; two comparison expressions "a<b" and "c>d".
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
5284 "[<;{},|&+-]\\|\\([^>:-]>\\)"
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
5285 ;; Otherwise we still stop on ',' to find the
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
5286 ;; argument start positions.
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
5287 "[<;{},]\\|\\([^>:-]>\\)")
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
5288 nil 'move t t 1)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5289
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5290 ;; If the arglist starter has lost its open paren
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5291 ;; syntax but not the closer, we won't find the
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5292 ;; closer above since we only search in the
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5293 ;; balanced sexp. In that case we stop just short
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5294 ;; of it so check if the following char is the closer.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5295 (when (eq (char-after) ?>)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5296 (forward-char)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5297 t)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5298
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5299 (cond
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5300 ((eq (char-before) ?>)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5301 ;; Either an operator starting with '>' or the end of
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5302 ;; the angle bracket arglist.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5303
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5304 (if (looking-at c->-op-cont-regexp)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5305 (progn
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5306 (goto-char (match-end 0))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5307 t) ; Continue the loop.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5308
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5309 ;; The angle bracket arglist is finished.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5310 (when c-parse-and-markup-<>-arglists
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5311 (while arg-start-pos
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5312 (c-put-c-type-property (1- (car arg-start-pos))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5313 'c-<>-arg-sep)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5314 (setq arg-start-pos (cdr arg-start-pos)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5315 (c-mark-<-as-paren start)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5316 (c-mark->-as-paren (1- (point))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5317 (setq res t)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5318 nil)) ; Exit the loop.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5319
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5320 ((eq (char-before) ?<)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5321 ;; Either an operator starting with '<' or a nested arglist.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5322
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5323 (setq pos (point))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5324 (let (id-start id-end subres keyword-match)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5325 (if (if (looking-at c-<-op-cont-regexp)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5326 (setq tmp (match-end 0))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5327 (setq tmp pos)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5328 (backward-char)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5329 (not
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5330 (and
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5331
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5332 (save-excursion
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5333 ;; There's always an identifier before an angle
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5334 ;; bracket arglist, or a keyword in
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5335 ;; `c-<>-type-kwds' or `c-<>-arglist-kwds'.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5336 (c-backward-syntactic-ws)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5337 (setq id-end (point))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5338 (c-simple-skip-symbol-backward)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5339 (when (or (setq keyword-match
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5340 (looking-at c-opt-<>-sexp-key))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5341 (not (looking-at c-keywords-regexp)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5342 (setq id-start (point))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5343
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5344 (setq subres
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5345 (let ((c-record-type-identifiers nil)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5346 (c-record-found-types nil))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5347 (c-forward-<>-arglist-recur
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5348 (and keyword-match
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5349 (c-keyword-member
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5350 (c-keyword-sym (match-string 1))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5351 'c-<>-type-kwds)))))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5352 )))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5353
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5354 ;; It was not an angle bracket arglist.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5355 (goto-char tmp)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5356
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5357 ;; It was an angle bracket arglist.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5358 (setq c-record-found-types subres)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5359
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5360 ;; Record the identifier before the template as a type
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5361 ;; or reference depending on whether the arglist is last
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5362 ;; in a qualified identifier.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5363 (when (and c-record-type-identifiers
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5364 (not keyword-match))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5365 (if (and c-opt-identifier-concat-key
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5366 (progn
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5367 (c-forward-syntactic-ws)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5368 (looking-at c-opt-identifier-concat-key)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5369 (c-record-ref-id (cons id-start id-end))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5370 (c-record-type-id (cons id-start id-end))))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5371 t)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5372
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5373 ((and (eq (char-before) ?,)
53073
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
5374 (not c-restricted-<>-arglists))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5375 ;; Just another argument. Record the position. The
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5376 ;; type check stuff that made us stop at it is at
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5377 ;; the top of the loop.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5378 (setq arg-start-pos (cons (point) arg-start-pos)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5379
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5380 (t
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5381 ;; Got a character that can't be in an angle bracket
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5382 ;; arglist argument. Abort using `throw', since
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5383 ;; it's useless to try to find a surrounding arglist
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5384 ;; if we're nested.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5385 (throw 'angle-bracket-arglist-escape nil))))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5386
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5387 (if res
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5388 (or c-record-found-types t)))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5389
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5390 (defun c-backward-<>-arglist (all-types &optional limit)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5391 ;; The point is assumed to be directly after a ">". Try to treat it
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5392 ;; as the close paren of an angle bracket arglist and move back to
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5393 ;; the corresponding "<". If successful, the point is left at
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5394 ;; the "<" and t is returned, otherwise the point isn't moved and
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5395 ;; nil is returned. ALL-TYPES is passed on to
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5396 ;; `c-forward-<>-arglist'.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5397 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5398 ;; If the optional LIMIT is given, it bounds the backward search.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5399 ;; It's then assumed to be at a syntactically relevant position.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5400 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5401 ;; This is a wrapper around `c-forward-<>-arglist'. See that
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5402 ;; function for more details.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5403
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5404 (let ((start (point)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5405 (backward-char)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5406 (if (and (not c-parse-and-markup-<>-arglists)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5407 (c-get-char-property (point) 'syntax-table))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5408
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5409 (if (and (c-go-up-list-backward)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5410 (eq (char-after) ?<))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5411 t
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5412 ;; See corresponding note in `c-forward-<>-arglist'.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5413 (goto-char start)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5414 nil)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5415
75027
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
5416 (while (progn
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5417 (c-syntactic-skip-backward "^<;{}" limit t)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5418
75027
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
5419 (and
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
5420 (if (eq (char-before) ?<)
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
5421 t
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
5422 ;; Stopped at bob or a char that isn't allowed in an
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
5423 ;; arglist, so we've failed.
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
5424 (goto-char start)
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
5425 nil)
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
5426
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
5427 (if (> (point)
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
5428 (progn (c-beginning-of-current-token)
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
5429 (point)))
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
5430 ;; If we moved then the "<" was part of some
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
5431 ;; multicharacter token.
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
5432 t
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
5433
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
5434 (backward-char)
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
5435 (let ((beg-pos (point)))
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
5436 (if (c-forward-<>-arglist all-types)
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
5437 (cond ((= (point) start)
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
5438 ;; Matched the arglist. Break the while.
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
5439 (goto-char beg-pos)
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
5440 nil)
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
5441 ((> (point) start)
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
5442 ;; We started from a non-paren ">" inside an
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
5443 ;; arglist.
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
5444 (goto-char start)
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
5445 nil)
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
5446 (t
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
5447 ;; Matched a shorter arglist. Can be a nested
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
5448 ;; one so continue looking.
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
5449 (goto-char beg-pos)
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
5450 t))
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
5451 t))))))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5452
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5453 (/= (point) start))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5454
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5455 (defun c-forward-name ()
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5456 ;; Move forward over a complete name if at the beginning of one,
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5457 ;; stopping at the next following token. If the point is not at
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5458 ;; something that are recognized as name then it stays put. A name
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5459 ;; could be something as simple as "foo" in C or something as
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5460 ;; complex as "X<Y<class A<int>::B, BIT_MAX >> b>, ::operator<> ::
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5461 ;; Z<(a>b)> :: operator const X<&foo>::T Q::G<unsigned short
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5462 ;; int>::*volatile const" in C++ (this function is actually little
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5463 ;; more than a `looking-at' call in all modes except those that,
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5464 ;; like C++, have `c-recognize-<>-arglists' set). Return nil if no
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5465 ;; name is found, 'template if it's an identifier ending with an
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5466 ;; angle bracket arglist, 'operator of it's an operator identifier,
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5467 ;; or t if it's some other kind of name.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5468 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5469 ;; This function records identifier ranges on
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5470 ;; `c-record-type-identifiers' and `c-record-ref-identifiers' if
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5471 ;; `c-record-type-identifiers' is non-nil.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5472 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5473 ;; This function might do hidden buffer changes.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5474
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5475 (let ((pos (point)) (start (point)) res id-start id-end
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5476 ;; Turn off `c-promote-possible-types' here since we might
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5477 ;; call `c-forward-<>-arglist' and we don't want it to promote
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5478 ;; every suspect thing in the arglist to a type. We're
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5479 ;; typically called from `c-forward-type' in this case, and
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5480 ;; the caller only wants the top level type that it finds to
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5481 ;; be promoted.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5482 c-promote-possible-types)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5483 (while
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5484 (and
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5485 (looking-at c-identifier-key)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5486
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5487 (progn
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5488 ;; Check for keyword. We go to the last symbol in
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5489 ;; `c-identifier-key' first.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5490 (goto-char (setq id-end (match-end 0)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5491 (c-simple-skip-symbol-backward)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5492 (setq id-start (point))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5493
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5494 (if (looking-at c-keywords-regexp)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5495 (when (and (c-major-mode-is 'c++-mode)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5496 (looking-at
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5497 (cc-eval-when-compile
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5498 (concat "\\(operator\\|\\(template\\)\\)"
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5499 "\\(" (c-lang-const c-nonsymbol-key c++)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5500 "\\|$\\)")))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5501 (if (match-beginning 2)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5502 ;; "template" is only valid inside an
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5503 ;; identifier if preceded by "::".
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5504 (save-excursion
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5505 (c-backward-syntactic-ws)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5506 (and (c-safe (backward-char 2) t)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5507 (looking-at "::")))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5508 t))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5509
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5510 ;; Handle a C++ operator or template identifier.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5511 (goto-char id-end)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5512 (c-forward-syntactic-ws)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5513 (cond ((eq (char-before id-end) ?e)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5514 ;; Got "... ::template".
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5515 (let ((subres (c-forward-name)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5516 (when subres
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5517 (setq pos (point)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5518 res subres))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5519
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5520 ((looking-at c-identifier-start)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5521 ;; Got a cast operator.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5522 (when (c-forward-type)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5523 (setq pos (point)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5524 res 'operator)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5525 ;; Now we should match a sequence of either
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5526 ;; '*', '&' or a name followed by ":: *",
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5527 ;; where each can be followed by a sequence
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5528 ;; of `c-opt-type-modifier-key'.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5529 (while (cond ((looking-at "[*&]")
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5530 (goto-char (match-end 0))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5531 t)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5532 ((looking-at c-identifier-start)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5533 (and (c-forward-name)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5534 (looking-at "::")
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5535 (progn
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5536 (goto-char (match-end 0))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5537 (c-forward-syntactic-ws)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5538 (eq (char-after) ?*))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5539 (progn
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5540 (forward-char)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5541 t))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5542 (while (progn
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5543 (c-forward-syntactic-ws)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5544 (setq pos (point))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5545 (looking-at c-opt-type-modifier-key))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5546 (goto-char (match-end 1))))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5547
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5548 ((looking-at c-overloadable-operators-regexp)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5549 ;; Got some other operator.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5550 (setq c-last-identifier-range
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5551 (cons (point) (match-end 0)))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5552 (goto-char (match-end 0))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5553 (c-forward-syntactic-ws)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5554 (setq pos (point)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5555 res 'operator)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5556
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5557 nil)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5558
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5559 ;; `id-start' is equal to `id-end' if we've jumped over
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5560 ;; an identifier that doesn't end with a symbol token.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5561 ;; That can occur e.g. for Java import directives on the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5562 ;; form "foo.bar.*".
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5563 (when (and id-start (/= id-start id-end))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5564 (setq c-last-identifier-range
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5565 (cons id-start id-end)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5566 (goto-char id-end)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5567 (c-forward-syntactic-ws)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5568 (setq pos (point)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5569 res t)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5570
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5571 (progn
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5572 (goto-char pos)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5573 (when (or c-opt-identifier-concat-key
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5574 c-recognize-<>-arglists)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5575
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5576 (cond
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5577 ((and c-opt-identifier-concat-key
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5578 (looking-at c-opt-identifier-concat-key))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5579 ;; Got a concatenated identifier. This handles the
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5580 ;; cases with tricky syntactic whitespace that aren't
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5581 ;; covered in `c-identifier-key'.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5582 (goto-char (match-end 0))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5583 (c-forward-syntactic-ws)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5584 t)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5585
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5586 ((and c-recognize-<>-arglists
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5587 (eq (char-after) ?<))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5588 ;; Maybe an angle bracket arglist.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5589
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5590 (when (let (c-record-type-identifiers
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5591 c-record-found-types)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5592 (c-forward-<>-arglist nil))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5593
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5594 (c-add-type start (1+ pos))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5595 (c-forward-syntactic-ws)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5596 (setq pos (point)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5597 c-last-identifier-range nil)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5598
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5599 (if (and c-opt-identifier-concat-key
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5600 (looking-at c-opt-identifier-concat-key))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5601
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5602 ;; Continue if there's an identifier concatenation
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5603 ;; operator after the template argument.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5604 (progn
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5605 (when (and c-record-type-identifiers id-start)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5606 (c-record-ref-id (cons id-start id-end)))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5607 (forward-char 2)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5608 (c-forward-syntactic-ws)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5609 t)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5610
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5611 (when (and c-record-type-identifiers id-start)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5612 (c-record-type-id (cons id-start id-end)))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5613 (setq res 'template)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5614 nil)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5615 )))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5616
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5617 (goto-char pos)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5618 res))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5619
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5620 (defun c-forward-type ()
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5621 ;; Move forward over a type spec if at the beginning of one,
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5622 ;; stopping at the next following token. Return t if it's a known
56646
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
5623 ;; type that can't be a name or other expression, 'known if it's an
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
5624 ;; otherwise known type (according to `*-font-lock-extra-types'),
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
5625 ;; 'prefix if it's a known prefix of a type, 'found if it's a type
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
5626 ;; that matches one in `c-found-types', 'maybe if it's an identfier
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
5627 ;; that might be a type, or nil if it can't be a type (the point
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
5628 ;; isn't moved then). The point is assumed to be at the beginning
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
5629 ;; of a token.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5630 ;;
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5631 ;; Note that this function doesn't skip past the brace definition
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5632 ;; that might be considered part of the type, e.g.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5633 ;; "enum {a, b, c} foo".
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5634 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5635 ;; This function records identifier ranges on
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5636 ;; `c-record-type-identifiers' and `c-record-ref-identifiers' if
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5637 ;; `c-record-type-identifiers' is non-nil.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5638 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5639 ;; This function might do hidden buffer changes.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5640
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5641 (let ((start (point)) pos res name-res id-start id-end id-range)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5642
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5643 ;; Skip leading type modifiers. If any are found we know it's a
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5644 ;; prefix of a type.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5645 (when c-opt-type-modifier-key
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5646 (while (looking-at c-opt-type-modifier-key)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5647 (goto-char (match-end 1))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5648 (c-forward-syntactic-ws)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5649 (setq res 'prefix)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5650
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5651 (cond
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5652 ((looking-at c-type-prefix-key)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5653 ;; Looking at a keyword that prefixes a type identifier,
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5654 ;; e.g. "class".
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5655 (goto-char (match-end 1))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5656 (c-forward-syntactic-ws)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5657 (setq pos (point))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5658 (if (memq (setq name-res (c-forward-name)) '(t template))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5659 (progn
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5660 (when (eq name-res t)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5661 ;; In many languages the name can be used without the
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5662 ;; prefix, so we add it to `c-found-types'.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5663 (c-add-type pos (point))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5664 (when (and c-record-type-identifiers
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5665 c-last-identifier-range)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5666 (c-record-type-id c-last-identifier-range)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5667 (setq res t))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5668 ;; Invalid syntax.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5669 (goto-char start)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5670 (setq res nil)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5671
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5672 ((progn
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5673 (setq pos nil)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5674 (if (looking-at c-identifier-start)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5675 (save-excursion
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5676 (setq id-start (point)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5677 name-res (c-forward-name))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5678 (when name-res
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5679 (setq id-end (point)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5680 id-range c-last-identifier-range))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5681 (and (cond ((looking-at c-primitive-type-key)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5682 (setq res t))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5683 ((c-with-syntax-table c-identifier-syntax-table
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5684 (looking-at c-known-type-key))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5685 (setq res 'known)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5686 (or (not id-end)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5687 (>= (save-excursion
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5688 (save-match-data
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5689 (goto-char (match-end 1))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5690 (c-forward-syntactic-ws)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5691 (setq pos (point))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5692 id-end)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5693 (setq res nil))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5694 ;; Looking at a primitive or known type identifier. We've
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5695 ;; checked for a name first so that we don't go here if the
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5696 ;; known type match only is a prefix of another name.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5697
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5698 (setq id-end (match-end 1))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5699
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5700 (when (and c-record-type-identifiers
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5701 (or c-promote-possible-types (eq res t)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5702 (c-record-type-id (cons (match-beginning 1) (match-end 1))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5703
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5704 (if (and c-opt-type-component-key
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5705 (save-match-data
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5706 (looking-at c-opt-type-component-key)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5707 ;; There might be more keywords for the type.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5708 (let (safe-pos)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5709 (c-forward-keyword-clause 1)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5710 (while (progn
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5711 (setq safe-pos (point))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5712 (looking-at c-opt-type-component-key))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5713 (when (and c-record-type-identifiers
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5714 (looking-at c-primitive-type-key))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5715 (c-record-type-id (cons (match-beginning 1)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5716 (match-end 1))))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5717 (c-forward-keyword-clause 1))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5718 (if (looking-at c-primitive-type-key)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5719 (progn
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5720 (when c-record-type-identifiers
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5721 (c-record-type-id (cons (match-beginning 1)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5722 (match-end 1))))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5723 (c-forward-keyword-clause 1)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5724 (setq res t))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5725 (goto-char safe-pos)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5726 (setq res 'prefix)))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5727 (unless (save-match-data (c-forward-keyword-clause 1))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5728 (if pos
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5729 (goto-char pos)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5730 (goto-char (match-end 1))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5731 (c-forward-syntactic-ws)))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5732
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5733 (name-res
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5734 (cond ((eq name-res t)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5735 ;; A normal identifier.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5736 (goto-char id-end)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5737 (if (or res c-promote-possible-types)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5738 (progn
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5739 (c-add-type id-start id-end)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5740 (when (and c-record-type-identifiers id-range)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5741 (c-record-type-id id-range))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5742 (unless res
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5743 (setq res 'found)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5744 (setq res (if (c-check-type id-start id-end)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5745 ;; It's an identifier that has been used as
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5746 ;; a type somewhere else.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5747 'found
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5748 ;; It's an identifier that might be a type.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5749 'maybe))))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5750 ((eq name-res 'template)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5751 ;; A template is a type.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5752 (goto-char id-end)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5753 (setq res t))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5754 (t
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5755 ;; Otherwise it's an operator identifier, which is not a type.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5756 (goto-char start)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5757 (setq res nil)))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5758
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5759 (when res
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5760 ;; Skip trailing type modifiers. If any are found we know it's
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5761 ;; a type.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5762 (when c-opt-type-modifier-key
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5763 (while (looking-at c-opt-type-modifier-key)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5764 (goto-char (match-end 1))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5765 (c-forward-syntactic-ws)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5766 (setq res t)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5767
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5768 ;; Step over any type suffix operator. Do not let the existence
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5769 ;; of these alter the classification of the found type, since
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5770 ;; these operators typically are allowed in normal expressions
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5771 ;; too.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5772 (when c-opt-type-suffix-key
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5773 (while (looking-at c-opt-type-suffix-key)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5774 (goto-char (match-end 1))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5775 (c-forward-syntactic-ws)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5776
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5777 (when c-opt-type-concat-key
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5778 ;; Look for a trailing operator that concatenates the type
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5779 ;; with a following one, and if so step past that one through
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5780 ;; a recursive call. Note that we don't record concatenated
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5781 ;; types in `c-found-types' - it's the component types that
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5782 ;; are recorded when appropriate.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5783 (setq pos (point))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5784 (let* ((c-promote-possible-types (or (memq res '(t known))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5785 c-promote-possible-types))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5786 ;; If we can't promote then set `c-record-found-types' so that
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5787 ;; we can merge in the types from the second part afterwards if
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5788 ;; it turns out to be a known type there.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5789 (c-record-found-types (and c-record-type-identifiers
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5790 (not c-promote-possible-types)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5791 subres)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5792 (if (and (looking-at c-opt-type-concat-key)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5793
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5794 (progn
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5795 (goto-char (match-end 1))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5796 (c-forward-syntactic-ws)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5797 (setq subres (c-forward-type))))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5798
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5799 (progn
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5800 ;; If either operand certainly is a type then both are, but we
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5801 ;; don't let the existence of the operator itself promote two
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5802 ;; uncertain types to a certain one.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5803 (cond ((eq res t))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5804 ((eq subres t)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5805 (unless (eq name-res 'template)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5806 (c-add-type id-start id-end))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5807 (when (and c-record-type-identifiers id-range)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5808 (c-record-type-id id-range))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5809 (setq res t))
56646
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
5810 ((eq res 'known))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5811 ((eq subres 'known)
56646
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
5812 (setq res 'known))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5813 ((eq res 'found))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5814 ((eq subres 'found)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5815 (setq res 'found))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5816 (t
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5817 (setq res 'maybe)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5818
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5819 (when (and (eq res t)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5820 (consp c-record-found-types))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5821 ;; Merge in the ranges of any types found by the second
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5822 ;; `c-forward-type'.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5823 (setq c-record-type-identifiers
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5824 ;; `nconc' doesn't mind that the tail of
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5825 ;; `c-record-found-types' is t.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5826 (nconc c-record-found-types
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5827 c-record-type-identifiers))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5828
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5829 (goto-char pos))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5830
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5831 (when (and c-record-found-types (memq res '(known found)) id-range)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5832 (setq c-record-found-types
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5833 (cons id-range c-record-found-types))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5834
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5835 ;;(message "c-forward-type %s -> %s: %s" start (point) res)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5836
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5837 res))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5838
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5839
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5840 ;; Handling of large scale constructs like statements and declarations.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
5841
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5842 ;; Macro used inside `c-forward-decl-or-cast-1'. It ought to be a
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5843 ;; defsubst or perhaps even a defun, but it contains lots of free
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5844 ;; variables that refer to things inside `c-forward-decl-or-cast-1'.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5845 (defmacro c-fdoc-shift-type-backward (&optional short)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5846 ;; `c-forward-decl-or-cast-1' can consume an arbitrary length list
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5847 ;; of types when parsing a declaration, which means that it
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5848 ;; sometimes consumes the identifier in the declaration as a type.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5849 ;; This is used to "backtrack" and make the last type be treated as
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5850 ;; an identifier instead.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5851 `(progn
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5852 ,(unless short
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5853 ;; These identifiers are bound only in the inner let.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5854 '(setq identifier-type at-type
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5855 identifier-start type-start
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5856 got-parens nil
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5857 got-identifier t
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5858 got-suffix t
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5859 got-suffix-after-parens id-start
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5860 paren-depth 0))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5861
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5862 (if (setq at-type (if (eq backup-at-type 'prefix)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5863 t
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5864 backup-at-type))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5865 (setq type-start backup-type-start
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5866 id-start backup-id-start)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5867 (setq type-start start-pos
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5868 id-start start-pos))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5869
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5870 ;; When these flags already are set we've found specifiers that
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5871 ;; unconditionally signal these attributes - backtracking doesn't
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5872 ;; change that. So keep them set in that case.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5873 (or at-type-decl
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5874 (setq at-type-decl backup-at-type-decl))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5875 (or maybe-typeless
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5876 (setq maybe-typeless backup-maybe-typeless))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5877
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5878 ,(unless short
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5879 ;; This identifier is bound only in the inner let.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5880 '(setq start id-start))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5881
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5882 (defun c-forward-decl-or-cast-1 (preceding-token-end context last-cast-end)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5883 ;; Move forward over a declaration or a cast if at the start of one.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5884 ;; The point is assumed to be at the start of some token. Nil is
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5885 ;; returned if no declaration or cast is recognized, and the point
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5886 ;; is clobbered in that case.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5887 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5888 ;; If a declaration is parsed:
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5889 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5890 ;; The point is left at the first token after the first complete
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5891 ;; declarator, if there is one. The return value is a cons where
79942
99c850a55c1c Correct typos, enhance comments.
Alan Mackenzie <acm@muc.de>
parents: 79838
diff changeset
5892 ;; the car is the position of the first token in the declarator. (See
99c850a55c1c Correct typos, enhance comments.
Alan Mackenzie <acm@muc.de>
parents: 79838
diff changeset
5893 ;; below for the cdr.)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5894 ;; Some examples:
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5895 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5896 ;; void foo (int a, char *b) stuff ...
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5897 ;; car ^ ^ point
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5898 ;; float (*a)[], b;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5899 ;; car ^ ^ point
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5900 ;; unsigned int a = c_style_initializer, b;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5901 ;; car ^ ^ point
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5902 ;; unsigned int a (cplusplus_style_initializer), b;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5903 ;; car ^ ^ point (might change)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5904 ;; class Foo : public Bar {}
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5905 ;; car ^ ^ point
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5906 ;; class PikeClass (int a, string b) stuff ...
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5907 ;; car ^ ^ point
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5908 ;; enum bool;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5909 ;; car ^ ^ point
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5910 ;; enum bool flag;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5911 ;; car ^ ^ point
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5912 ;; void cplusplus_function (int x) throw (Bad);
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5913 ;; car ^ ^ point
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5914 ;; Foo::Foo (int b) : Base (b) {}
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5915 ;; car ^ ^ point
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5916 ;;
79942
99c850a55c1c Correct typos, enhance comments.
Alan Mackenzie <acm@muc.de>
parents: 79838
diff changeset
5917 ;; The cdr of the return value is non-nil iff a `c-typedef-decl-kwds'
99c850a55c1c Correct typos, enhance comments.
Alan Mackenzie <acm@muc.de>
parents: 79838
diff changeset
5918 ;; specifier (e.g. class, struct, enum, typedef) is found in the
99c850a55c1c Correct typos, enhance comments.
Alan Mackenzie <acm@muc.de>
parents: 79838
diff changeset
5919 ;; declaration, i.e. the declared identifier(s) are types.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5920 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5921 ;; If a cast is parsed:
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5922 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5923 ;; The point is left at the first token after the closing paren of
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5924 ;; the cast. The return value is `cast'. Note that the start
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5925 ;; position must be at the first token inside the cast parenthesis
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5926 ;; to recognize it.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5927 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5928 ;; PRECEDING-TOKEN-END is the first position after the preceding
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5929 ;; token, i.e. on the other side of the syntactic ws from the point.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5930 ;; Use a value less than or equal to (point-min) if the point is at
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5931 ;; the first token in (the visible part of) the buffer.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5932 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5933 ;; CONTEXT is a symbol that describes the context at the point:
79942
99c850a55c1c Correct typos, enhance comments.
Alan Mackenzie <acm@muc.de>
parents: 79838
diff changeset
5934 ;; 'decl In a comma-separated declaration context (typically
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5935 ;; inside a function declaration arglist).
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5936 ;; '<> In an angle bracket arglist.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5937 ;; 'arglist Some other type of arglist.
98693
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
5938 ;; nil Some other context or unknown context. Includes
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
5939 ;; within the parens of an if, for, ... construct.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5940 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5941 ;; LAST-CAST-END is the first token after the closing paren of a
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5942 ;; preceding cast, or nil if none is known. If
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5943 ;; `c-forward-decl-or-cast-1' is used in succession, it should be
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5944 ;; the position after the closest preceding call where a cast was
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5945 ;; matched. In that case it's used to discover chains of casts like
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5946 ;; "(a) (b) c".
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5947 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5948 ;; This function records identifier ranges on
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5949 ;; `c-record-type-identifiers' and `c-record-ref-identifiers' if
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5950 ;; `c-record-type-identifiers' is non-nil.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5951 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5952 ;; This function might do hidden buffer changes.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5953
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5954 (let (;; `start-pos' is used below to point to the start of the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5955 ;; first type, i.e. after any leading specifiers. It might
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5956 ;; also point at the beginning of the preceding syntactic
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5957 ;; whitespace.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5958 (start-pos (point))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5959 ;; Set to the result of `c-forward-type'.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5960 at-type
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5961 ;; The position of the first token in what we currently
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5962 ;; believe is the type in the declaration or cast, after any
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5963 ;; specifiers and their associated clauses.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5964 type-start
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5965 ;; The position of the first token in what we currently
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5966 ;; believe is the declarator for the first identifier. Set
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5967 ;; when the type is found, and moved forward over any
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5968 ;; `c-decl-hangon-kwds' and their associated clauses that
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5969 ;; occurs after the type.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5970 id-start
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5971 ;; These store `at-type', `type-start' and `id-start' of the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5972 ;; identifier before the one in those variables. The previous
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5973 ;; identifier might turn out to be the real type in a
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5974 ;; declaration if the last one has to be the declarator in it.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5975 ;; If `backup-at-type' is nil then the other variables have
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5976 ;; undefined values.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5977 backup-at-type backup-type-start backup-id-start
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5978 ;; Set if we've found a specifier that makes the defined
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5979 ;; identifier(s) types.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5980 at-type-decl
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5981 ;; Set if we've found a specifier that can start a declaration
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5982 ;; where there's no type.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5983 maybe-typeless
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5984 ;; If a specifier is found that also can be a type prefix,
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5985 ;; these flags are set instead of those above. If we need to
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5986 ;; back up an identifier, they are copied to the real flag
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5987 ;; variables. Thus they only take effect if we fail to
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5988 ;; interpret it as a type.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5989 backup-at-type-decl backup-maybe-typeless
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5990 ;; Whether we've found a declaration or a cast. We might know
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5991 ;; this before we've found the type in it. It's 'ids if we've
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5992 ;; found two consecutive identifiers (usually a sure sign, but
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5993 ;; we should allow that in labels too), and t if we've found a
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5994 ;; specifier keyword (a 100% sure sign).
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5995 at-decl-or-cast
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5996 ;; Set when we need to back up to parse this as a declaration
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5997 ;; but not as a cast.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5998 backup-if-not-cast
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
5999 ;; For casts, the return position.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6000 cast-end
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6001 ;; Save `c-record-type-identifiers' and
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6002 ;; `c-record-ref-identifiers' since ranges are recorded
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6003 ;; speculatively and should be thrown away if it turns out
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6004 ;; that it isn't a declaration or cast.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6005 (save-rec-type-ids c-record-type-identifiers)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6006 (save-rec-ref-ids c-record-ref-identifiers))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6007
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6008 ;; Check for a type. Unknown symbols are treated as possible
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6009 ;; types, but they could also be specifiers disguised through
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6010 ;; macros like __INLINE__, so we recognize both types and known
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6011 ;; specifiers after them too.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6012 (while
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6013 (let* ((start (point)) kwd-sym kwd-clause-end found-type)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6014
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6015 ;; Look for a specifier keyword clause.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6016 (when (looking-at c-prefix-spec-kwds-re)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6017 (setq kwd-sym (c-keyword-sym (match-string 1)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6018 (save-excursion
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6019 (c-forward-keyword-clause 1)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6020 (setq kwd-clause-end (point))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6021
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6022 (when (setq found-type (c-forward-type))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6023 ;; Found a known or possible type or a prefix of a known type.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6024
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6025 (when at-type
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6026 ;; Got two identifiers with nothing but whitespace
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6027 ;; between them. That can only happen in declarations.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6028 (setq at-decl-or-cast 'ids)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6029
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6030 (when (eq at-type 'found)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6031 ;; If the previous identifier is a found type we
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6032 ;; record it as a real one; it might be some sort of
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6033 ;; alias for a prefix like "unsigned".
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6034 (save-excursion
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6035 (goto-char type-start)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6036 (let ((c-promote-possible-types t))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6037 (c-forward-type)))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6038
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6039 (setq backup-at-type at-type
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6040 backup-type-start type-start
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6041 backup-id-start id-start
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6042 at-type found-type
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6043 type-start start
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6044 id-start (point)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6045 ;; The previous ambiguous specifier/type turned out
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6046 ;; to be a type since we've parsed another one after
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6047 ;; it, so clear these backup flags.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6048 backup-at-type-decl nil
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6049 backup-maybe-typeless nil))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6050
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6051 (if kwd-sym
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6052 (progn
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6053 ;; Handle known specifier keywords and
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6054 ;; `c-decl-hangon-kwds' which can occur after known
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6055 ;; types.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6056
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6057 (if (c-keyword-member kwd-sym 'c-decl-hangon-kwds)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6058 ;; It's a hang-on keyword that can occur anywhere.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6059 (progn
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6060 (setq at-decl-or-cast t)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6061 (if at-type
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6062 ;; Move the identifier start position if
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6063 ;; we've passed a type.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6064 (setq id-start kwd-clause-end)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6065 ;; Otherwise treat this as a specifier and
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6066 ;; move the fallback position.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6067 (setq start-pos kwd-clause-end))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6068 (goto-char kwd-clause-end))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6069
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6070 ;; It's an ordinary specifier so we know that
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6071 ;; anything before this can't be the type.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6072 (setq backup-at-type nil
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6073 start-pos kwd-clause-end)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6074
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6075 (if found-type
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6076 ;; It's ambiguous whether this keyword is a
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6077 ;; specifier or a type prefix, so set the backup
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6078 ;; flags. (It's assumed that `c-forward-type'
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6079 ;; moved further than `c-forward-keyword-clause'.)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6080 (progn
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6081 (when (c-keyword-member kwd-sym 'c-typedef-decl-kwds)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6082 (setq backup-at-type-decl t))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6083 (when (c-keyword-member kwd-sym 'c-typeless-decl-kwds)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6084 (setq backup-maybe-typeless t)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6085
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6086 (when (c-keyword-member kwd-sym 'c-typedef-decl-kwds)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6087 (setq at-type-decl t))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6088 (when (c-keyword-member kwd-sym 'c-typeless-decl-kwds)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6089 (setq maybe-typeless t))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6090
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6091 ;; Haven't matched a type so it's an umambiguous
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6092 ;; specifier keyword and we know we're in a
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6093 ;; declaration.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6094 (setq at-decl-or-cast t)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6095
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6096 (goto-char kwd-clause-end))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6097
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6098 ;; If the type isn't known we continue so that we'll jump
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6099 ;; over all specifiers and type identifiers. The reason
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6100 ;; to do this for a known type prefix is to make things
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6101 ;; like "unsigned INT16" work.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6102 (and found-type (not (eq found-type t))))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6103
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6104 (cond
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6105 ((eq at-type t)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6106 ;; If a known type was found, we still need to skip over any
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6107 ;; hangon keyword clauses after it. Otherwise it has already
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6108 ;; been done in the loop above.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6109 (while (looking-at c-decl-hangon-key)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6110 (c-forward-keyword-clause 1))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6111 (setq id-start (point)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6112
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6113 ((eq at-type 'prefix)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6114 ;; A prefix type is itself a primitive type when it's not
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6115 ;; followed by another type.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6116 (setq at-type t))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6117
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6118 ((not at-type)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6119 ;; Got no type but set things up to continue anyway to handle
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6120 ;; the various cases when a declaration doesn't start with a
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6121 ;; type.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6122 (setq id-start start-pos))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6123
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6124 ((and (eq at-type 'maybe)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6125 (c-major-mode-is 'c++-mode))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6126 ;; If it's C++ then check if the last "type" ends on the form
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6127 ;; "foo::foo" or "foo::~foo", i.e. if it's the name of a
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6128 ;; (con|de)structor.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6129 (save-excursion
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6130 (let (name end-2 end-1)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6131 (goto-char id-start)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6132 (c-backward-syntactic-ws)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6133 (setq end-2 (point))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6134 (when (and
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6135 (c-simple-skip-symbol-backward)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6136 (progn
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6137 (setq name
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6138 (buffer-substring-no-properties (point) end-2))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6139 ;; Cheating in the handling of syntactic ws below.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6140 (< (skip-chars-backward ":~ \t\n\r\v\f") 0))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6141 (progn
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6142 (setq end-1 (point))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6143 (c-simple-skip-symbol-backward))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6144 (>= (point) type-start)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6145 (equal (buffer-substring-no-properties (point) end-1)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6146 name))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6147 ;; It is a (con|de)structor name. In that case the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6148 ;; declaration is typeless so zap out any preceding
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6149 ;; identifier(s) that we might have taken as types.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6150 (goto-char type-start)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6151 (setq at-type nil
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6152 backup-at-type nil
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6153 id-start type-start))))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6154
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6155 ;; Check for and step over a type decl expression after the thing
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6156 ;; that is or might be a type. This can't be skipped since we
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6157 ;; need the correct end position of the declarator for
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6158 ;; `max-type-decl-end-*'.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6159 (let ((start (point)) (paren-depth 0) pos
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6160 ;; True if there's a non-open-paren match of
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6161 ;; `c-type-decl-prefix-key'.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6162 got-prefix
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6163 ;; True if the declarator is surrounded by a parenthesis pair.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6164 got-parens
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6165 ;; True if there is an identifier in the declarator.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6166 got-identifier
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6167 ;; True if there's a non-close-paren match of
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6168 ;; `c-type-decl-suffix-key'.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6169 got-suffix
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6170 ;; True if there's a prefix match outside the outermost
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6171 ;; paren pair that surrounds the declarator.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6172 got-prefix-before-parens
76986
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6173 ;; True if there's a suffix match outside the outermost
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6174 ;; paren pair that surrounds the declarator. The value is
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6175 ;; the position of the first suffix match.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6176 got-suffix-after-parens
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6177 ;; True if we've parsed the type decl to a token that is
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6178 ;; known to end declarations in this context.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6179 at-decl-end
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6180 ;; The earlier values of `at-type' and `type-start' if we've
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6181 ;; shifted the type backwards.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6182 identifier-type identifier-start
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6183 ;; If `c-parse-and-markup-<>-arglists' is set we need to
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6184 ;; turn it off during the name skipping below to avoid
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6185 ;; getting `c-type' properties that might be bogus. That
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6186 ;; can happen since we don't know if
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6187 ;; `c-restricted-<>-arglists' will be correct inside the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6188 ;; arglist paren that gets entered.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6189 c-parse-and-markup-<>-arglists)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6190
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6191 (goto-char id-start)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6192
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6193 ;; Skip over type decl prefix operators. (Note similar code in
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6194 ;; `c-font-lock-declarators'.)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6195 (while (and (looking-at c-type-decl-prefix-key)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6196 (if (and (c-major-mode-is 'c++-mode)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6197 (match-beginning 2))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6198 ;; If the second submatch matches in C++ then
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6199 ;; we're looking at an identifier that's a
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6200 ;; prefix only if it specifies a member pointer.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6201 (when (setq got-identifier (c-forward-name))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6202 (if (looking-at "\\(::\\)")
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6203 ;; We only check for a trailing "::" and
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6204 ;; let the "*" that should follow be
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6205 ;; matched in the next round.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6206 (progn (setq got-identifier nil) t)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6207 ;; It turned out to be the real identifier,
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6208 ;; so stop.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6209 nil))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6210 t))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6211
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6212 (if (eq (char-after) ?\()
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6213 (progn
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6214 (setq paren-depth (1+ paren-depth))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6215 (forward-char))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6216 (unless got-prefix-before-parens
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6217 (setq got-prefix-before-parens (= paren-depth 0)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6218 (setq got-prefix t)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6219 (goto-char (match-end 1)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6220 (c-forward-syntactic-ws))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6221
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6222 (setq got-parens (> paren-depth 0))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6223
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6224 ;; Skip over an identifier.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6225 (or got-identifier
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6226 (and (looking-at c-identifier-start)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6227 (setq got-identifier (c-forward-name))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6228
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6229 ;; Skip over type decl suffix operators.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6230 (while (if (looking-at c-type-decl-suffix-key)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6231
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6232 (if (eq (char-after) ?\))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6233 (when (> paren-depth 0)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6234 (setq paren-depth (1- paren-depth))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6235 (forward-char)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6236 t)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6237 (when (if (save-match-data (looking-at "\\s\("))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6238 (c-safe (c-forward-sexp 1) t)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6239 (goto-char (match-end 1))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6240 t)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6241 (when (and (not got-suffix-after-parens)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6242 (= paren-depth 0))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6243 (setq got-suffix-after-parens (match-beginning 0)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6244 (setq got-suffix t)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6245
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6246 ;; No suffix matched. We might have matched the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6247 ;; identifier as a type and the open paren of a
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6248 ;; function arglist as a type decl prefix. In that
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6249 ;; case we should "backtrack": Reinterpret the last
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6250 ;; type as the identifier, move out of the arglist and
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6251 ;; continue searching for suffix operators.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6252 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6253 ;; Do this even if there's no preceding type, to cope
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6254 ;; with old style function declarations in K&R C,
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6255 ;; (con|de)structors in C++ and `c-typeless-decl-kwds'
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6256 ;; style declarations. That isn't applicable in an
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6257 ;; arglist context, though.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6258 (when (and (= paren-depth 1)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6259 (not got-prefix-before-parens)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6260 (not (eq at-type t))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6261 (or backup-at-type
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6262 maybe-typeless
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6263 backup-maybe-typeless
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6264 (when c-recognize-typeless-decls
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6265 (not context)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6266 (setq pos (c-up-list-forward (point)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6267 (eq (char-before pos) ?\)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6268 (c-fdoc-shift-type-backward)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6269 (goto-char pos)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6270 t))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6271
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6272 (c-forward-syntactic-ws))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6273
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6274 (when (and (or maybe-typeless backup-maybe-typeless)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6275 (not got-identifier)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6276 (not got-prefix)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6277 at-type)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6278 ;; Have found no identifier but `c-typeless-decl-kwds' has
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6279 ;; matched so we know we're inside a declaration. The
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6280 ;; preceding type must be the identifier instead.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6281 (c-fdoc-shift-type-backward))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6282
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6283 (setq
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6284 at-decl-or-cast
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6285 (catch 'at-decl-or-cast
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6286
98693
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
6287 ;; CASE 1
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6288 (when (> paren-depth 0)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6289 ;; Encountered something inside parens that isn't matched by
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6290 ;; the `c-type-decl-*' regexps, so it's not a type decl
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6291 ;; expression. Try to skip out to the same paren depth to
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6292 ;; not confuse the cast check below.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6293 (c-safe (goto-char (scan-lists (point) 1 paren-depth)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6294 ;; If we've found a specifier keyword then it's a
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6295 ;; declaration regardless.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6296 (throw 'at-decl-or-cast (eq at-decl-or-cast t)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6297
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6298 (setq at-decl-end
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6299 (looking-at (cond ((eq context '<>) "[,>]")
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6300 (context "[,\)]")
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6301 (t "[,;]"))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6302
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6303 ;; Now we've collected info about various characteristics of
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6304 ;; the construct we're looking at. Below follows a decision
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6305 ;; tree based on that. It's ordered to check more certain
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6306 ;; signs before less certain ones.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6307
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6308 (if got-identifier
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6309 (progn
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6310
98693
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
6311 ;; CASE 2
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6312 (when (and (or at-type maybe-typeless)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6313 (not (or got-prefix got-parens)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6314 ;; Got another identifier directly after the type, so it's a
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6315 ;; declaration.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6316 (throw 'at-decl-or-cast t))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6317
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6318 (when (and got-parens
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6319 (not got-prefix)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6320 (not got-suffix-after-parens)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6321 (or backup-at-type
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6322 maybe-typeless
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6323 backup-maybe-typeless))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6324 ;; Got a declaration of the form "foo bar (gnu);" where we've
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6325 ;; recognized "bar" as the type and "gnu" as the declarator.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6326 ;; In this case it's however more likely that "bar" is the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6327 ;; declarator and "gnu" a function argument or initializer (if
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6328 ;; `c-recognize-paren-inits' is set), since the parens around
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6329 ;; "gnu" would be superfluous if it's a declarator. Shift the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6330 ;; type one step backward.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6331 (c-fdoc-shift-type-backward)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6332
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6333 ;; Found no identifier.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6334
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6335 (if backup-at-type
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6336 (progn
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6337
98693
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
6338 ;; CASE 3
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6339 (when (= (point) start)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6340 ;; Got a plain list of identifiers. If a colon follows it's
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6341 ;; a valid label. Otherwise the last one probably is the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6342 ;; declared identifier and we should back up to the previous
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6343 ;; type, providing it isn't a cast.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6344 (if (eq (char-after) ?:)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6345 ;; If we've found a specifier keyword then it's a
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6346 ;; declaration regardless.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6347 (throw 'at-decl-or-cast (eq at-decl-or-cast t))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6348 (setq backup-if-not-cast t)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6349 (throw 'at-decl-or-cast t)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6350
98693
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
6351 ;; CASE 4
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6352 (when (and got-suffix
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6353 (not got-prefix)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6354 (not got-parens))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6355 ;; Got a plain list of identifiers followed by some suffix.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6356 ;; If this isn't a cast then the last identifier probably is
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6357 ;; the declared one and we should back up to the previous
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6358 ;; type.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6359 (setq backup-if-not-cast t)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6360 (throw 'at-decl-or-cast t)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6361
98693
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
6362 ;; CASE 5
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6363 (when (eq at-type t)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6364 ;; If the type is known we know that there can't be any
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6365 ;; identifier somewhere else, and it's only in declarations in
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6366 ;; e.g. function prototypes and in casts that the identifier may
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6367 ;; be left out.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6368 (throw 'at-decl-or-cast t))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6369
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6370 (when (= (point) start)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6371 ;; Only got a single identifier (parsed as a type so far).
98693
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
6372 ;; CASE 6
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6373 (if (and
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6374 ;; Check that the identifier isn't at the start of an
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6375 ;; expression.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6376 at-decl-end
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6377 (cond
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6378 ((eq context 'decl)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6379 ;; Inside an arglist that contains declarations. If K&R
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6380 ;; style declarations and parenthesis style initializers
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6381 ;; aren't allowed then the single identifier must be a
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6382 ;; type, else we require that it's known or found
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6383 ;; (primitive types are handled above).
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6384 (or (and (not c-recognize-knr-p)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6385 (not c-recognize-paren-inits))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6386 (memq at-type '(known found))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6387 ((eq context '<>)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6388 ;; Inside a template arglist. Accept known and found
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6389 ;; types; other identifiers could just as well be
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6390 ;; constants in C++.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6391 (memq at-type '(known found)))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6392 (throw 'at-decl-or-cast t)
98693
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
6393 ;; CASE 7
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6394 ;; Can't be a valid declaration or cast, but if we've found a
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6395 ;; specifier it can't be anything else either, so treat it as
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6396 ;; an invalid/unfinished declaration or cast.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6397 (throw 'at-decl-or-cast at-decl-or-cast))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6398
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6399 (if (and got-parens
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6400 (not got-prefix)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6401 (not context)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6402 (not (eq at-type t))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6403 (or backup-at-type
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6404 maybe-typeless
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6405 backup-maybe-typeless
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6406 (when c-recognize-typeless-decls
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6407 (or (not got-suffix)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6408 (not (looking-at
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6409 c-after-suffixed-type-maybe-decl-key))))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6410 ;; Got an empty paren pair and a preceding type that probably
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6411 ;; really is the identifier. Shift the type backwards to make
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6412 ;; the last one the identifier. This is analogous to the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6413 ;; "backtracking" done inside the `c-type-decl-suffix-key' loop
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6414 ;; above.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6415 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6416 ;; Exception: In addition to the conditions in that
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6417 ;; "backtracking" code, do not shift backward if we're not
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6418 ;; looking at either `c-after-suffixed-type-decl-key' or "[;,]".
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6419 ;; Since there's no preceding type, the shift would mean that
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6420 ;; the declaration is typeless. But if the regexp doesn't match
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6421 ;; then we will simply fall through in the tests below and not
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6422 ;; recognize it at all, so it's better to try it as an abstract
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6423 ;; declarator instead.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6424 (c-fdoc-shift-type-backward)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6425
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6426 ;; Still no identifier.
98693
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
6427 ;; CASE 8
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6428 (when (and got-prefix (or got-parens got-suffix))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6429 ;; Require `got-prefix' together with either `got-parens' or
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6430 ;; `got-suffix' to recognize it as an abstract declarator:
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6431 ;; `got-parens' only is probably an empty function call.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6432 ;; `got-suffix' only can build an ordinary expression together
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6433 ;; with the preceding identifier which we've taken as a type.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6434 ;; We could actually accept on `got-prefix' only, but that can
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6435 ;; easily occur temporarily while writing an expression so we
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6436 ;; avoid that case anyway. We could do a better job if we knew
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6437 ;; the point when the fontification was invoked.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6438 (throw 'at-decl-or-cast t))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6439
98693
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
6440 ;; CASE 9
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6441 (when (and at-type
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6442 (not got-prefix)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6443 (not got-parens)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6444 got-suffix-after-parens
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6445 (eq (char-after got-suffix-after-parens) ?\())
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6446 ;; Got a type, no declarator but a paren suffix. I.e. it's a
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6447 ;; normal function call afterall (or perhaps a C++ style object
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6448 ;; instantiation expression).
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6449 (throw 'at-decl-or-cast nil))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6450
98693
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
6451 ;; CASE 10
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6452 (when at-decl-or-cast
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6453 ;; By now we've located the type in the declaration that we know
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6454 ;; we're in.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6455 (throw 'at-decl-or-cast t))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6456
98693
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
6457 ;; CASE 11
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6458 (when (and got-identifier
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6459 (not context)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6460 (looking-at c-after-suffixed-type-decl-key)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6461 (if (and got-parens
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6462 (not got-prefix)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6463 (not got-suffix)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6464 (not (eq at-type t)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6465 ;; Shift the type backward in the case that there's a
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6466 ;; single identifier inside parens. That can only
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6467 ;; occur in K&R style function declarations so it's
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6468 ;; more likely that it really is a function call.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6469 ;; Therefore we only do this after
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6470 ;; `c-after-suffixed-type-decl-key' has matched.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6471 (progn (c-fdoc-shift-type-backward) t)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6472 got-suffix-after-parens))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6473 ;; A declaration according to `c-after-suffixed-type-decl-key'.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6474 (throw 'at-decl-or-cast t))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6475
98693
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
6476 ;; CASE 12
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6477 (when (and (or got-prefix (not got-parens))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6478 (memq at-type '(t known)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6479 ;; It's a declaration if a known type precedes it and it can't be a
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6480 ;; function call.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6481 (throw 'at-decl-or-cast t))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6482
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6483 ;; If we get here we can't tell if this is a type decl or a normal
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6484 ;; expression by looking at it alone. (That's under the assumption
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6485 ;; that normal expressions always can look like type decl expressions,
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6486 ;; which isn't really true but the cases where it doesn't hold are so
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6487 ;; uncommon (e.g. some placements of "const" in C++) it's not worth
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6488 ;; the effort to look for them.)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6489
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6490 (unless (or at-decl-end (looking-at "=[^=]"))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6491 ;; If this is a declaration it should end here or its initializer(*)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6492 ;; should start here, so check for allowed separation tokens. Note
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6493 ;; that this rule doesn't work e.g. with a K&R arglist after a
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6494 ;; function header.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6495 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6496 ;; *) Don't check for C++ style initializers using parens
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6497 ;; since those already have been matched as suffixes.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6498 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6499 ;; If `at-decl-or-cast' is then we've found some other sign that
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6500 ;; it's a declaration or cast, so then it's probably an
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6501 ;; invalid/unfinished one.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6502 (throw 'at-decl-or-cast at-decl-or-cast))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6503
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6504 ;; Below are tests that only should be applied when we're certain to
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6505 ;; not have parsed halfway through an expression.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6506
98693
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
6507 ;; CASE 14
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6508 (when (memq at-type '(t known))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6509 ;; The expression starts with a known type so treat it as a
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6510 ;; declaration.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6511 (throw 'at-decl-or-cast t))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6512
98693
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
6513 ;; CASE 15
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6514 (when (and (c-major-mode-is 'c++-mode)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6515 ;; In C++ we check if the identifier is a known type, since
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6516 ;; (con|de)structors use the class name as identifier.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6517 ;; We've always shifted over the identifier as a type and
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6518 ;; then backed up again in this case.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6519 identifier-type
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6520 (or (memq identifier-type '(found known))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6521 (and (eq (char-after identifier-start) ?~)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6522 ;; `at-type' probably won't be 'found for
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6523 ;; destructors since the "~" is then part of the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6524 ;; type name being checked against the list of
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6525 ;; known types, so do a check without that
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6526 ;; operator.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6527 (or (save-excursion
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6528 (goto-char (1+ identifier-start))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6529 (c-forward-syntactic-ws)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6530 (c-with-syntax-table
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6531 c-identifier-syntax-table
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6532 (looking-at c-known-type-key)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6533 (save-excursion
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6534 (goto-char (1+ identifier-start))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6535 ;; We have already parsed the type earlier,
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6536 ;; so it'd be possible to cache the end
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6537 ;; position instead of redoing it here, but
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6538 ;; then we'd need to keep track of another
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6539 ;; position everywhere.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6540 (c-check-type (point)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6541 (progn (c-forward-type)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6542 (point))))))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6543 (throw 'at-decl-or-cast t))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6544
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6545 (if got-identifier
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6546 (progn
98693
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
6547 ;; CASE 16
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6548 (when (and got-prefix-before-parens
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6549 at-type
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6550 (or at-decl-end (looking-at "=[^=]"))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6551 (not context)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6552 (not got-suffix))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6553 ;; Got something like "foo * bar;". Since we're not inside an
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6554 ;; arglist it would be a meaningless expression because the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6555 ;; result isn't used. We therefore choose to recognize it as
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6556 ;; a declaration. Do not allow a suffix since it could then
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6557 ;; be a function call.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6558 (throw 'at-decl-or-cast t))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6559
98693
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
6560 ;; CASE 17
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6561 (when (and (or got-suffix-after-parens
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6562 (looking-at "=[^=]"))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6563 (eq at-type 'found)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6564 (not (eq context 'arglist)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6565 ;; Got something like "a (*b) (c);" or "a (b) = c;". It could
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6566 ;; be an odd expression or it could be a declaration. Treat
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6567 ;; it as a declaration if "a" has been used as a type
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6568 ;; somewhere else (if it's a known type we won't get here).
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6569 (throw 'at-decl-or-cast t)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6570
98693
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
6571 ;; CASE 18
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6572 (when (and context
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6573 (or got-prefix
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6574 (and (eq context 'decl)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6575 (not c-recognize-paren-inits)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6576 (or got-parens got-suffix))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6577 ;; Got a type followed by an abstract declarator. If `got-prefix'
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6578 ;; is set it's something like "a *" without anything after it. If
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6579 ;; `got-parens' or `got-suffix' is set it's "a()", "a[]", "a()[]",
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6580 ;; or similar, which we accept only if the context rules out
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6581 ;; expressions.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6582 (throw 'at-decl-or-cast t)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6583
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6584 ;; If we had a complete symbol table here (which rules out
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6585 ;; `c-found-types') we should return t due to the disambiguation rule
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6586 ;; (in at least C++) that anything that can be parsed as a declaration
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6587 ;; is a declaration. Now we're being more defensive and prefer to
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6588 ;; highlight things like "foo (bar);" as a declaration only if we're
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6589 ;; inside an arglist that contains declarations.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6590 (eq context 'decl))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6591
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6592 ;; The point is now after the type decl expression.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6593
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6594 (cond
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6595 ;; Check for a cast.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6596 ((save-excursion
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6597 (and
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6598 c-cast-parens
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6599
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6600 ;; Should be the first type/identifier in a cast paren.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6601 (> preceding-token-end (point-min))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6602 (memq (char-before preceding-token-end) c-cast-parens)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6603
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6604 ;; The closing paren should follow.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6605 (progn
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6606 (c-forward-syntactic-ws)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6607 (looking-at "\\s\)"))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6608
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6609 ;; There should be a primary expression after it.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6610 (let (pos)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6611 (forward-char)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6612 (c-forward-syntactic-ws)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6613 (setq cast-end (point))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6614 (and (looking-at c-primary-expr-regexp)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6615 (progn
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6616 (setq pos (match-end 0))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6617 (or
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6618 ;; Check if the expression begins with a prefix keyword.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6619 (match-beginning 2)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6620 (if (match-beginning 1)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6621 ;; Expression begins with an ambiguous operator. Treat
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6622 ;; it as a cast if it's a type decl or if we've
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6623 ;; recognized the type somewhere else.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6624 (or at-decl-or-cast
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6625 (memq at-type '(t known found)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6626 ;; Unless it's a keyword, it's the beginning of a primary
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6627 ;; expression.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6628 (not (looking-at c-keywords-regexp)))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6629 ;; If `c-primary-expr-regexp' matched a nonsymbol token, check
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6630 ;; that it matched a whole one so that we don't e.g. confuse
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6631 ;; the operator '-' with '->'. It's ok if it matches further,
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6632 ;; though, since it e.g. can match the float '.5' while the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6633 ;; operator regexp only matches '.'.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6634 (or (not (looking-at c-nonsymbol-token-regexp))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6635 (<= (match-end 0) pos))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6636
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6637 ;; There should either be a cast before it or something that isn't an
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6638 ;; identifier or close paren.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6639 (> preceding-token-end (point-min))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6640 (progn
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6641 (goto-char (1- preceding-token-end))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6642 (or (eq (point) last-cast-end)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6643 (progn
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6644 (c-backward-syntactic-ws)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6645 (if (< (skip-syntax-backward "w_") 0)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6646 ;; It's a symbol. Accept it only if it's one of the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6647 ;; keywords that can precede an expression (without
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6648 ;; surrounding parens).
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6649 (looking-at c-simple-stmt-key)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6650 (and
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6651 ;; Check that it isn't a close paren (block close is ok,
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6652 ;; though).
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6653 (not (memq (char-before) '(?\) ?\])))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6654 ;; Check that it isn't a nonsymbol identifier.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6655 (not (c-on-identifier)))))))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6656
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6657 ;; Handle the cast.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6658 (when (and c-record-type-identifiers at-type (not (eq at-type t)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6659 (let ((c-promote-possible-types t))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6660 (goto-char type-start)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6661 (c-forward-type)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6662
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6663 (goto-char cast-end)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6664 'cast)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6665
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6666 (at-decl-or-cast
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6667 ;; We're at a declaration. Highlight the type and the following
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6668 ;; declarators.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6669
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6670 (when backup-if-not-cast
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6671 (c-fdoc-shift-type-backward t))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6672
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6673 (when (and (eq context 'decl) (looking-at ","))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6674 ;; Make sure to propagate the `c-decl-arg-start' property to
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6675 ;; the next argument if it's set in this one, to cope with
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6676 ;; interactive refontification.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6677 (c-put-c-type-property (point) 'c-decl-arg-start))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6678
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6679 (when (and c-record-type-identifiers at-type (not (eq at-type t)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6680 (let ((c-promote-possible-types t))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6681 (save-excursion
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6682 (goto-char type-start)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6683 (c-forward-type))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6684
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6685 (cons id-start at-type-decl))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6686
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6687 (t
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6688 ;; False alarm. Restore the recorded ranges.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6689 (setq c-record-type-identifiers save-rec-type-ids
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6690 c-record-ref-identifiers save-rec-ref-ids)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6691 nil))))
79943
c87032622eda Correct typos, enhance comments.
Alan Mackenzie <acm@muc.de>
parents: 79942
diff changeset
6692
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6693 (defun c-forward-label (&optional assume-markup preceding-token-end limit)
75027
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6694 ;; Assuming that point is at the beginning of a token, check if it starts a
76986
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6695 ;; label and if so move over it and return non-nil (t in default situations,
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6696 ;; specific symbols (see below) for interesting situations), otherwise don't
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6697 ;; move and return nil. "Label" here means "most things with a colon".
75027
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6698 ;;
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6699 ;; More precisely, a "label" is regarded as one of:
76986
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6700 ;; (i) a goto target like "foo:" - returns the symbol `goto-target';
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6701 ;; (ii) A case label - either the entire construct "case FOO:", or just the
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6702 ;; bare "case", should the colon be missing. We return t;
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6703 ;; (iii) a keyword which needs a colon, like "default:" or "private:"; We
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6704 ;; return t;
75027
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6705 ;; (iv) One of QT's "extended" C++ variants of
76986
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6706 ;; "private:"/"protected:"/"public:"/"more:" looking like "public slots:".
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6707 ;; Returns the symbol `qt-2kwds-colon'.
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6708 ;; (v) QT's construct "signals:". Returns the symbol `qt-1kwd-colon'.
78656
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
6709 ;; (vi) One of the keywords matched by `c-opt-extra-label-key' (without any
75027
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6710 ;; colon). Currently (2006-03), this applies only to Objective C's
76986
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6711 ;; keywords "@private", "@protected", and "@public". Returns t.
75027
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6712 ;;
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6713 ;; One of the things which will NOT be recognised as a label is a bit-field
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6714 ;; element of a struct, something like "int foo:5".
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6715 ;;
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6716 ;; The end of the label is taken to be just after the colon, or the end of
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6717 ;; the first submatch in `c-opt-extra-label-key'. The point is directly
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6718 ;; after the end on return. The terminating char gets marked with
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6719 ;; `c-decl-end' to improve recognition of the following declaration or
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6720 ;; statement.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6721 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6722 ;; If ASSUME-MARKUP is non-nil, it's assumed that the preceding
75027
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6723 ;; label, if any, has already been marked up like that.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6724 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6725 ;; If PRECEDING-TOKEN-END is given, it should be the first position
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6726 ;; after the preceding token, i.e. on the other side of the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6727 ;; syntactic ws from the point. Use a value less than or equal to
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6728 ;; (point-min) if the point is at the first token in (the visible
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6729 ;; part of) the buffer.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6730 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6731 ;; The optional LIMIT limits the forward scan for the colon.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6732 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6733 ;; This function records the ranges of the label symbols on
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6734 ;; `c-record-ref-identifiers' if `c-record-type-identifiers' (!) is
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6735 ;; non-nil.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6736 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6737 ;; This function might do hidden buffer changes.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6738
75027
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6739 (let ((start (point))
76986
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6740 label-end
75027
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6741 qt-symbol-idx
76986
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6742 macro-start ; if we're in one.
99350
c6c533f20c51 (c-forward-label): Fix for QT macros.
Alan Mackenzie <acm@muc.de>
parents: 98693
diff changeset
6743 label-type
c6c533f20c51 (c-forward-label): Fix for QT macros.
Alan Mackenzie <acm@muc.de>
parents: 98693
diff changeset
6744 kwd)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6745 (cond
79408
a29ca195b71e (c-crosses-statement-barrier-p): Fix typo in docstring.
Juanma Barranquero <lekktu@gmail.com>
parents: 78656
diff changeset
6746 ;; "case" or "default" (Doesn't apply to AWK).
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6747 ((looking-at c-label-kwds-regexp)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6748 (let ((kwd-end (match-end 1)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6749 ;; Record only the keyword itself for fontification, since in
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6750 ;; case labels the following is a constant expression and not
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6751 ;; a label.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6752 (when c-record-type-identifiers
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6753 (c-record-ref-id (cons (match-beginning 1) kwd-end)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6754
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6755 ;; Find the label end.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6756 (goto-char kwd-end)
76986
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6757 (setq label-type
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6758 (if (and (c-syntactic-re-search-forward
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6759 ;; Stop on chars that aren't allowed in expressions,
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6760 ;; and on operator chars that would be meaningless
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6761 ;; there. FIXME: This doesn't cope with ?: operators.
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6762 "[;{=,@]\\|\\(\\=\\|[^:]\\):\\([^:]\\|\\'\\)"
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6763 limit t t nil 1)
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6764 (match-beginning 2))
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6765
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6766 (progn ; there's a proper :
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6767 (goto-char (match-beginning 2)) ; just after the :
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6768 (c-put-c-type-property (1- (point)) 'c-decl-end)
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6769 t)
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6770
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6771 ;; It's an unfinished label. We consider the keyword enough
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6772 ;; to recognize it as a label, so that it gets fontified.
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6773 ;; Leave the point at the end of it, but don't put any
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6774 ;; `c-decl-end' marker.
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6775 (goto-char kwd-end)
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6776 t))))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6777
75027
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6778 ;; @private, @protected, @public, in Objective C, or similar.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6779 ((and c-opt-extra-label-key
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6780 (looking-at c-opt-extra-label-key))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6781 ;; For a `c-opt-extra-label-key' match, we record the whole
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6782 ;; thing for fontification. That's to get the leading '@' in
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6783 ;; Objective-C protection labels fontified.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6784 (goto-char (match-end 1))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6785 (when c-record-type-identifiers
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6786 (c-record-ref-id (cons (match-beginning 1) (point))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6787 (c-put-c-type-property (1- (point)) 'c-decl-end)
76986
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6788 (setq label-type t))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6789
75027
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6790 ;; All other cases of labels.
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6791 ((and c-recognize-colon-labels ; nil for AWK and IDL, otherwise t.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6792
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6793 ;; A colon label must have something before the colon.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6794 (not (eq (char-after) ?:))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6795
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6796 ;; Check that we're not after a token that can't precede a label.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6797 (or
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6798 ;; Trivially succeeds when there's no preceding token.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6799 (if preceding-token-end
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6800 (<= preceding-token-end (point-min))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6801 (save-excursion
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6802 (c-backward-syntactic-ws)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6803 (setq preceding-token-end (point))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6804 (bobp)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6805
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6806 ;; Check if we're after a label, if we're after a closing
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6807 ;; paren that belong to statement, and with
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6808 ;; `c-label-prefix-re'. It's done in different order
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6809 ;; depending on `assume-markup' since the checks have
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6810 ;; different expensiveness.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6811 (if assume-markup
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6812 (or
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6813 (eq (c-get-char-property (1- preceding-token-end) 'c-type)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6814 'c-decl-end)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6815
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6816 (save-excursion
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6817 (goto-char (1- preceding-token-end))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6818 (c-beginning-of-current-token)
75027
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6819 (or (looking-at c-label-prefix-re)
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6820 (looking-at c-block-stmt-1-key)))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6821
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6822 (and (eq (char-before preceding-token-end) ?\))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6823 (c-after-conditional)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6824
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6825 (or
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6826 (save-excursion
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6827 (goto-char (1- preceding-token-end))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6828 (c-beginning-of-current-token)
75027
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6829 (or (looking-at c-label-prefix-re)
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6830 (looking-at c-block-stmt-1-key)))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6831
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6832 (cond
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6833 ((eq (char-before preceding-token-end) ?\))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6834 (c-after-conditional))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6835
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6836 ((eq (char-before preceding-token-end) ?:)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6837 ;; Might be after another label, so check it recursively.
75027
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6838 (save-restriction
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6839 (save-excursion
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6840 (goto-char (1- preceding-token-end))
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6841 ;; Essentially the same as the
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6842 ;; `c-syntactic-re-search-forward' regexp below.
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6843 (setq macro-start
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6844 (save-excursion (and (c-beginning-of-macro)
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6845 (point))))
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6846 (if macro-start (narrow-to-region macro-start (point-max)))
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6847 (c-syntactic-skip-backward "^-]:?;}=*/%&|,<>!@+" nil t)
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6848 ;; Note: the following should work instead of the
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6849 ;; narrow-to-region above. Investigate why not,
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6850 ;; sometime. ACM, 2006-03-31.
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6851 ;; (c-syntactic-skip-backward "^-]:?;}=*/%&|,<>!@+"
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6852 ;; macro-start t)
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6853 (let ((pte (point))
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6854 ;; If the caller turned on recording for us,
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6855 ;; it shouldn't apply when we check the
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6856 ;; preceding label.
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6857 c-record-type-identifiers)
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6858 ;; A label can't start at a cpp directive. Check for
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6859 ;; this, since c-forward-syntactic-ws would foul up on it.
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6860 (unless (and c-opt-cpp-prefix (looking-at c-opt-cpp-prefix))
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6861 (c-forward-syntactic-ws)
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6862 (c-forward-label nil pte start))))))))))
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6863
76986
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6864 ;; Point is still at the beginning of the possible label construct.
79408
a29ca195b71e (c-crosses-statement-barrier-p): Fix typo in docstring.
Juanma Barranquero <lekktu@gmail.com>
parents: 78656
diff changeset
6865 ;;
75027
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6866 ;; Check that the next nonsymbol token is ":", or that we're in one
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6867 ;; of QT's "slots" declarations. Allow '(' for the sake of macro
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6868 ;; arguments. FIXME: Should build this regexp from the language
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
6869 ;; constants.
76986
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6870 (cond
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6871 ;; public: protected: private:
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6872 ((and
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6873 (c-major-mode-is 'c++-mode)
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6874 (search-forward-regexp
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6875 "\\=p\\(r\\(ivate\\|otected\\)\\|ublic\\)\\>[^_]" nil t)
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6876 (progn (backward-char)
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6877 (c-forward-syntactic-ws limit)
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6878 (looking-at ":\\([^:]\\|\\'\\)"))) ; A single colon.
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6879 (forward-char)
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6880 (setq label-type t))
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6881 ;; QT double keyword like "protected slots:" or goto target.
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6882 ((progn (goto-char start) nil))
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6883 ((when (c-syntactic-re-search-forward
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6884 "[ \t\n[:?;{=*/%&|,<>!@+-]" limit t t) ; not at EOB
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6885 (backward-char)
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6886 (setq label-end (point))
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6887 (setq qt-symbol-idx
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6888 (and (c-major-mode-is 'c++-mode)
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6889 (string-match
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6890 "\\(p\\(r\\(ivate\\|otected\\)\\|ublic\\)\\|more\\)\\>"
79408
a29ca195b71e (c-crosses-statement-barrier-p): Fix typo in docstring.
Juanma Barranquero <lekktu@gmail.com>
parents: 78656
diff changeset
6891 (buffer-substring start (point)))))
76986
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6892 (c-forward-syntactic-ws limit)
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6893 (cond
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6894 ((looking-at ":\\([^:]\\|\\'\\)") ; A single colon.
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6895 (forward-char)
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6896 (setq label-type
99350
c6c533f20c51 (c-forward-label): Fix for QT macros.
Alan Mackenzie <acm@muc.de>
parents: 98693
diff changeset
6897 (if (or (string= "signals" ; Special QT macro
c6c533f20c51 (c-forward-label): Fix for QT macros.
Alan Mackenzie <acm@muc.de>
parents: 98693
diff changeset
6898 (setq kwd (buffer-substring-no-properties start label-end)))
c6c533f20c51 (c-forward-label): Fix for QT macros.
Alan Mackenzie <acm@muc.de>
parents: 98693
diff changeset
6899 (string= "Q_SIGNALS" kwd))
76986
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6900 'qt-1kwd-colon
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6901 'goto-target)))
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6902 ((and qt-symbol-idx
99350
c6c533f20c51 (c-forward-label): Fix for QT macros.
Alan Mackenzie <acm@muc.de>
parents: 98693
diff changeset
6903 (search-forward-regexp "\\=\\(slots\\|Q_SLOTS\\)\\>" limit t)
76986
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6904 (progn (c-forward-syntactic-ws limit)
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6905 (looking-at ":\\([^:]\\|\\'\\)"))) ; A single colon
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6906 (forward-char)
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6907 (setq label-type 'qt-2kwds-colon)))))))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6908
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6909 (save-restriction
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6910 (narrow-to-region start (point))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6911
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6912 ;; Check that `c-nonlabel-token-key' doesn't match anywhere.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6913 (catch 'check-label
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6914 (goto-char start)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6915 (while (progn
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6916 (when (looking-at c-nonlabel-token-key)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6917 (goto-char start)
76986
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6918 (setq label-type nil)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6919 (throw 'check-label nil))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6920 (and (c-safe (c-forward-sexp)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6921 (c-forward-syntactic-ws)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6922 t)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6923 (not (eobp)))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6924
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6925 ;; Record the identifiers in the label for fontification, unless
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6926 ;; it begins with `c-label-kwds' in which case the following
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6927 ;; identifiers are part of a (constant) expression that
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6928 ;; shouldn't be fontified.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6929 (when (and c-record-type-identifiers
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6930 (progn (goto-char start)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6931 (not (looking-at c-label-kwds-regexp))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6932 (while (c-syntactic-re-search-forward c-symbol-key nil t)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6933 (c-record-ref-id (cons (match-beginning 0)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6934 (match-end 0)))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6935
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6936 (c-put-c-type-property (1- (point-max)) 'c-decl-end)
78656
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
6937 (goto-char (point-max)))))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6938
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6939 (t
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6940 ;; Not a label.
76986
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6941 (goto-char start)))
469570420bff Fix fontification of labels, and other things with ":".
Alan Mackenzie <acm@muc.de>
parents: 76723
diff changeset
6942 label-type))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6943
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6944 (defun c-forward-objc-directive ()
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6945 ;; Assuming the point is at the beginning of a token, try to move
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6946 ;; forward to the end of the Objective-C directive that starts
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6947 ;; there. Return t if a directive was fully recognized, otherwise
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6948 ;; the point is moved as far as one could be successfully parsed and
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6949 ;; nil is returned.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6950 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6951 ;; This function records identifier ranges on
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6952 ;; `c-record-type-identifiers' and `c-record-ref-identifiers' if
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6953 ;; `c-record-type-identifiers' is non-nil.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6954 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6955 ;; This function might do hidden buffer changes.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6956
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6957 (let ((start (point))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6958 start-char
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6959 (c-promote-possible-types t)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6960 ;; Turn off recognition of angle bracket arglists while parsing
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6961 ;; types here since the protocol reference list might then be
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6962 ;; considered part of the preceding name or superclass-name.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6963 c-recognize-<>-arglists)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6964
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6965 (if (or
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6966 (when (looking-at
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6967 (eval-when-compile
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6968 (c-make-keywords-re t
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6969 (append (c-lang-const c-protection-kwds objc)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6970 '("@end"))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6971 'objc-mode)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6972 (goto-char (match-end 1))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6973 t)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6974
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6975 (and
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6976 (looking-at
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6977 (eval-when-compile
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6978 (c-make-keywords-re t
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6979 '("@interface" "@implementation" "@protocol")
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6980 'objc-mode)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6981
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6982 ;; Handle the name of the class itself.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6983 (progn
69140
3d8b060d10fb cc-align.el, cc-awk.el, cc-bytecomp.el, cc-cmds.el, cc-compat.el,
Alan Mackenzie <acm@muc.de>
parents: 68773
diff changeset
6984 ; (c-forward-token-2) ; 2006/1/13 This doesn't move if the token's
3d8b060d10fb cc-align.el, cc-awk.el, cc-bytecomp.el, cc-cmds.el, cc-compat.el,
Alan Mackenzie <acm@muc.de>
parents: 68773
diff changeset
6985 ; at EOB.
3d8b060d10fb cc-align.el, cc-awk.el, cc-bytecomp.el, cc-cmds.el, cc-compat.el,
Alan Mackenzie <acm@muc.de>
parents: 68773
diff changeset
6986 (goto-char (match-end 0))
3d8b060d10fb cc-align.el, cc-awk.el, cc-bytecomp.el, cc-cmds.el, cc-compat.el,
Alan Mackenzie <acm@muc.de>
parents: 68773
diff changeset
6987 (c-skip-ws-forward)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6988 (c-forward-type))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6989
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6990 (catch 'break
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6991 ;; Look for ": superclass-name" or "( category-name )".
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6992 (when (looking-at "[:\(]")
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6993 (setq start-char (char-after))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6994 (forward-char)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6995 (c-forward-syntactic-ws)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6996 (unless (c-forward-type) (throw 'break nil))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6997 (when (eq start-char ?\()
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6998 (unless (eq (char-after) ?\)) (throw 'break nil))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
6999 (forward-char)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7000 (c-forward-syntactic-ws)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7001
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7002 ;; Look for a protocol reference list.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7003 (if (eq (char-after) ?<)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7004 (let ((c-recognize-<>-arglists t)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7005 (c-parse-and-markup-<>-arglists t)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7006 c-restricted-<>-arglists)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7007 (c-forward-<>-arglist t))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7008 t))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7009
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7010 (progn
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7011 (c-backward-syntactic-ws)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7012 (c-clear-c-type-property start (1- (point)) 'c-decl-end)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7013 (c-put-c-type-property (1- (point)) 'c-decl-end)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7014 t)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7015
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7016 (c-clear-c-type-property start (point) 'c-decl-end)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7017 nil)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7018
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7019 (defun c-beginning-of-inheritance-list (&optional lim)
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7020 ;; Go to the first non-whitespace after the colon that starts a
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7021 ;; multiple inheritance introduction. Optional LIM is the farthest
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7022 ;; back we should search.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7023 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7024 ;; This function might do hidden buffer changes.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7025 (c-with-syntax-table c++-template-syntax-table
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7026 (c-backward-token-2 0 t lim)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7027 (while (and (or (looking-at c-symbol-start)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7028 (looking-at "[<,]\\|::"))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7029 (zerop (c-backward-token-2 1 t lim))))))
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7030
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7031 (defun c-in-method-def-p ()
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7032 ;; Return nil if we aren't in a method definition, otherwise the
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7033 ;; position of the initial [+-].
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7034 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7035 ;; This function might do hidden buffer changes.
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7036 (save-excursion
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7037 (beginning-of-line)
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7038 (and c-opt-method-key
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7039 (looking-at c-opt-method-key)
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7040 (point))
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7041 ))
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7042
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7043 ;; Contributed by Kevin Ryde <user42@zip.com.au>.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7044 (defun c-in-gcc-asm-p ()
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7045 ;; Return non-nil if point is within a gcc \"asm\" block.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7046 ;;
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7047 ;; This should be called with point inside an argument list.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7048 ;;
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7049 ;; Only one level of enclosing parentheses is considered, so for
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7050 ;; instance `nil' is returned when in a function call within an asm
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7051 ;; operand.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7052 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7053 ;; This function might do hidden buffer changes.
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7054
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7055 (and c-opt-asm-stmt-key
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7056 (save-excursion
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7057 (beginning-of-line)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7058 (backward-up-list 1)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7059 (c-beginning-of-statement-1 (point-min) nil t)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7060 (looking-at c-opt-asm-stmt-key))))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7061
24335
0c4688f9a396 Added c-at-toplevel-p for font-lock.el.
Simon Marshall <simon@gnu.org>
parents: 24282
diff changeset
7062 (defun c-at-toplevel-p ()
98693
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
7063 "Return a determination as to whether point is \"at the top level\".
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
7064 Informally, \"at the top level\" is anywhere where you can write
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
7065 a function.
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
7066
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
7067 More precisely, being at the top-level means that point is either
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
7068 outside any enclosing block (such as a function definition), or
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
7069 directly inside a class, namespace or other block that contains
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
7070 another declaration level.
24335
0c4688f9a396 Added c-at-toplevel-p for font-lock.el.
Simon Marshall <simon@gnu.org>
parents: 24282
diff changeset
7071
0c4688f9a396 Added c-at-toplevel-p for font-lock.el.
Simon Marshall <simon@gnu.org>
parents: 24282
diff changeset
7072 If point is not at the top-level (e.g. it is inside a method
0c4688f9a396 Added c-at-toplevel-p for font-lock.el.
Simon Marshall <simon@gnu.org>
parents: 24282
diff changeset
7073 definition), then nil is returned. Otherwise, if point is at a
0c4688f9a396 Added c-at-toplevel-p for font-lock.el.
Simon Marshall <simon@gnu.org>
parents: 24282
diff changeset
7074 top-level not enclosed within a class definition, t is returned.
0c4688f9a396 Added c-at-toplevel-p for font-lock.el.
Simon Marshall <simon@gnu.org>
parents: 24282
diff changeset
7075 Otherwise, a 2-vector is returned where the zeroth element is the
0c4688f9a396 Added c-at-toplevel-p for font-lock.el.
Simon Marshall <simon@gnu.org>
parents: 24282
diff changeset
7076 buffer position of the start of the class declaration, and the first
0c4688f9a396 Added c-at-toplevel-p for font-lock.el.
Simon Marshall <simon@gnu.org>
parents: 24282
diff changeset
7077 element is the buffer position of the enclosing class's opening
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7078 brace.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7079
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7080 Note that this function might do hidden buffer changes. See the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7081 comment at the start of cc-engine.el for more info."
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7082 (let ((paren-state (c-parse-state)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7083 (or (not (c-most-enclosing-brace paren-state))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7084 (c-search-uplist-for-classkey paren-state))))
24335
0c4688f9a396 Added c-at-toplevel-p for font-lock.el.
Simon Marshall <simon@gnu.org>
parents: 24282
diff changeset
7085
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7086 (defun c-just-after-func-arglist-p (&optional lim)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7087 ;; Return non-nil if the point is in the region after the argument
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7088 ;; list of a function and its opening brace (or semicolon in case it
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7089 ;; got no body). If there are K&R style argument declarations in
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7090 ;; that region, the point has to be inside the first one for this
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7091 ;; function to recognize it.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7092 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7093 ;; If successful, the point is moved to the first token after the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7094 ;; function header (see `c-forward-decl-or-cast-1' for details) and
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7095 ;; the position of the opening paren of the function arglist is
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7096 ;; returned.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7097 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7098 ;; The point is clobbered if not successful.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7099 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7100 ;; LIM is used as bound for backward buffer searches.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7101 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7102 ;; This function might do hidden buffer changes.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7103
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7104 (let ((beg (point)) end id-start)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7105 (and
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7106 (eq (c-beginning-of-statement-1 lim) 'same)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7107
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7108 (not (or (c-major-mode-is 'objc-mode)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7109 (c-forward-objc-directive)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7110
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7111 (setq id-start
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7112 (car-safe (c-forward-decl-or-cast-1 (c-point 'bosws) nil nil)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7113 (< id-start beg)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7114
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7115 ;; There should not be a '=' or ',' between beg and the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7116 ;; start of the declaration since that means we were in the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7117 ;; "expression part" of the declaration.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7118 (or (> (point) beg)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7119 (not (looking-at "[=,]")))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7120
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7121 (save-excursion
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7122 ;; Check that there's an arglist paren in the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7123 ;; declaration.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7124 (goto-char id-start)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7125 (cond ((eq (char-after) ?\()
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7126 ;; The declarator is a paren expression, so skip past it
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7127 ;; so that we don't get stuck on that instead of the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7128 ;; function arglist.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7129 (c-forward-sexp))
75027
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
7130 ((and c-opt-op-identifier-prefix
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
7131 (looking-at c-opt-op-identifier-prefix))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7132 ;; Don't trip up on "operator ()".
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7133 (c-forward-token-2 2 t)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7134 (and (< (point) beg)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7135 (c-syntactic-re-search-forward "(" beg t t)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7136 (1- (point)))))))
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7137
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7138 (defun c-in-knr-argdecl (&optional lim)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7139 ;; Return the position of the first argument declaration if point is
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7140 ;; inside a K&R style argument declaration list, nil otherwise.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7141 ;; `c-recognize-knr-p' is not checked. If LIM is non-nil, it's a
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7142 ;; position that bounds the backward search for the argument list.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7143 ;;
75315
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7144 ;; Point must be within a possible K&R region, e.g. just before a top-level
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7145 ;; "{". It must be outside of parens and brackets. The test can return
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7146 ;; false positives otherwise.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7147 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7148 ;; This function might do hidden buffer changes.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7149
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7150 (save-excursion
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7151 (save-restriction
75315
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7152 ;; If we're in a macro, our search range is restricted to it. Narrow to
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7153 ;; the searchable range.
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7154 (let* ((macro-start (c-query-macro-start))
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7155 (lim (max (or lim (point-min)) (or macro-start (point-min))))
92572
897b09fb6e10 (c-in-knr-argdecl): Limit number of paren/bracket pairs parsed, to solve
Alan Mackenzie <acm@muc.de>
parents: 92148
diff changeset
7156 before-lparen after-rparen
897b09fb6e10 (c-in-knr-argdecl): Limit number of paren/bracket pairs parsed, to solve
Alan Mackenzie <acm@muc.de>
parents: 92148
diff changeset
7157 (pp-count-out 20)) ; Max number of paren/brace constructs before we give up
75315
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7158 (narrow-to-region lim (c-point 'eol))
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7159
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7160 ;; Search backwards for the defun's argument list. We give up if we
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7161 ;; encounter a "}" (end of a previous defun) or BOB.
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7162 ;;
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7163 ;; The criterion for a paren structure being the arg list is:
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7164 ;; o - there is non-WS stuff after it but before any "{"; AND
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7165 ;; o - the token after it isn't a ";" AND
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7166 ;; o - it is preceded by either an identifier (the function name) or
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7167 ;; a macro expansion like "DEFUN (...)"; AND
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7168 ;; o - its content is a non-empty comma-separated list of identifiers
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7169 ;; (an empty arg list won't have a knr region).
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7170 ;;
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7171 ;; The following snippet illustrates these rules:
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7172 ;; int foo (bar, baz, yuk)
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7173 ;; int bar [] ;
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7174 ;; int (*baz) (my_type) ;
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7175 ;; int (*) (void) (*yuk) (void) ;
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7176 ;; {
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7177
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7178 (catch 'knr
92572
897b09fb6e10 (c-in-knr-argdecl): Limit number of paren/bracket pairs parsed, to solve
Alan Mackenzie <acm@muc.de>
parents: 92148
diff changeset
7179 (while (> pp-count-out 0) ; go back one paren/bracket pair each time.
897b09fb6e10 (c-in-knr-argdecl): Limit number of paren/bracket pairs parsed, to solve
Alan Mackenzie <acm@muc.de>
parents: 92148
diff changeset
7180 (setq pp-count-out (1- pp-count-out))
75623
33cf1027eb42 (c-in-knr-argdecl): Slight correction for, e.g. "void (*hdone)();" in a
Alan Mackenzie <acm@muc.de>
parents: 75347
diff changeset
7181 (c-syntactic-skip-backward "^)]}")
75315
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7182 (cond ((eq (char-before) ?\))
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7183 (setq after-rparen (point)))
75623
33cf1027eb42 (c-in-knr-argdecl): Slight correction for, e.g. "void (*hdone)();" in a
Alan Mackenzie <acm@muc.de>
parents: 75347
diff changeset
7184 ((eq (char-before) ?\])
33cf1027eb42 (c-in-knr-argdecl): Slight correction for, e.g. "void (*hdone)();" in a
Alan Mackenzie <acm@muc.de>
parents: 75347
diff changeset
7185 (setq after-rparen nil))
33cf1027eb42 (c-in-knr-argdecl): Slight correction for, e.g. "void (*hdone)();" in a
Alan Mackenzie <acm@muc.de>
parents: 75347
diff changeset
7186 (t ; either } (hit previous defun) or no more parens/brackets
33cf1027eb42 (c-in-knr-argdecl): Slight correction for, e.g. "void (*hdone)();" in a
Alan Mackenzie <acm@muc.de>
parents: 75347
diff changeset
7187 (throw 'knr nil)))
75315
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7188
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7189 (if after-rparen
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7190 ;; We're inside a paren. Could it be our argument list....?
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7191 (if
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7192 (and
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7193 (progn
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7194 (goto-char after-rparen)
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7195 (unless (c-go-list-backward) (throw 'knr nil)) ;
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7196 ;; FIXME!!! What about macros between the parens? 2007/01/20
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7197 (setq before-lparen (point)))
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7198
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7199 ;; It can't be the arg list if next token is ; or {
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7200 (progn (goto-char after-rparen)
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7201 (c-forward-syntactic-ws)
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7202 (not (memq (char-after) '(?\; ?\{))))
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7203
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7204 ;; Is the thing preceding the list an identifier (the
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7205 ;; function name), or a macro expansion?
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7206 (progn
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7207 (goto-char before-lparen)
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7208 (eq (c-backward-token-2) 0)
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7209 (or (c-on-identifier)
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7210 (and (eq (char-after) ?\))
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7211 (c-go-up-list-backward)
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7212 (eq (c-backward-token-2) 0)
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7213 (c-on-identifier))))
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7214
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7215 ;; Have we got a non-empty list of comma-separated
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7216 ;; identifiers?
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7217 (progn
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7218 (goto-char before-lparen)
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7219 (c-forward-token-2) ; to first token inside parens
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7220 (and
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7221 (c-on-identifier)
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7222 (c-forward-token-2)
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7223 (catch 'id-list
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7224 (while (eq (char-after) ?\,)
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7225 (c-forward-token-2)
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7226 (unless (c-on-identifier) (throw 'id-list nil))
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7227 (c-forward-token-2))
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7228 (eq (char-after) ?\))))))
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7229
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7230 ;; ...Yes. We've identified the function's argument list.
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7231 (throw 'knr
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7232 (progn (goto-char after-rparen)
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7233 (c-forward-syntactic-ws)
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7234 (point)))
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7235
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7236 ;; ...No. The current parens aren't the function's arg list.
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7237 (goto-char before-lparen))
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7238
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7239 (or (c-go-list-backward) ; backwards over [ .... ]
656ff90fee33 Reformulate c-in-knr-argdecl to do much more rigorous analysis of
Alan Mackenzie <acm@muc.de>
parents: 75307
diff changeset
7240 (throw 'knr nil)))))))))
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7241
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7242 (defun c-skip-conditional ()
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7243 ;; skip forward over conditional at point, including any predicate
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7244 ;; statements in parentheses. No error checking is performed.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7245 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7246 ;; This function might do hidden buffer changes.
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7247 (c-forward-sexp (cond
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7248 ;; else if()
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7249 ((looking-at (concat "\\<else"
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7250 "\\([ \t\n]\\|\\\\\n\\)+"
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7251 "if\\>\\([^_]\\|$\\)"))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7252 3)
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7253 ;; do, else, try, finally
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7254 ((looking-at (concat "\\<\\("
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7255 "do\\|else\\|try\\|finally"
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7256 "\\)\\>\\([^_]\\|$\\)"))
36920
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
7257 1)
30403
68e734ab7d5d (c-looking-at-inexpr-block): Replaced a call to
Gerd Moellmann <gerd@gnu.org>
parents: 26817
diff changeset
7258 ;; for, if, while, switch, catch, synchronized, foreach
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7259 (t 2))))
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7260
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7261 (defun c-after-conditional (&optional lim)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7262 ;; If looking at the token after a conditional then return the
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7263 ;; position of its start, otherwise return nil.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7264 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7265 ;; This function might do hidden buffer changes.
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7266 (save-excursion
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7267 (and (zerop (c-backward-token-2 1 t lim))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7268 (or (looking-at c-block-stmt-1-key)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7269 (and (eq (char-after) ?\()
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7270 (zerop (c-backward-token-2 1 t lim))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7271 (looking-at c-block-stmt-2-key)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7272 (point))))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7273
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7274 (defun c-after-special-operator-id (&optional lim)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7275 ;; If the point is after an operator identifier that isn't handled
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7276 ;; like an ordinary symbol (i.e. like "operator =" in C++) then the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7277 ;; position of the start of that identifier is returned. nil is
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7278 ;; returned otherwise. The point may be anywhere in the syntactic
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7279 ;; whitespace after the last token of the operator identifier.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7280 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7281 ;; This function might do hidden buffer changes.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7282 (save-excursion
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7283 (and c-overloadable-operators-regexp
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7284 (zerop (c-backward-token-2 1 nil lim))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7285 (looking-at c-overloadable-operators-regexp)
75027
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
7286 (or (not c-opt-op-identifier-prefix)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7287 (and
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7288 (zerop (c-backward-token-2 1 nil lim))
75027
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
7289 (looking-at c-opt-op-identifier-prefix)))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7290 (point))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7291
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7292 (defsubst c-backward-to-block-anchor (&optional lim)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7293 ;; Assuming point is at a brace that opens a statement block of some
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7294 ;; kind, move to the proper anchor point for that block. It might
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7295 ;; need to be adjusted further by c-add-stmt-syntax, but the
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7296 ;; position at return is suitable as start position for that
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7297 ;; function.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7298 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7299 ;; This function might do hidden buffer changes.
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7300 (unless (= (point) (c-point 'boi))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7301 (let ((start (c-after-conditional lim)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7302 (if start
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7303 (goto-char start)))))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7304
53073
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
7305 (defsubst c-backward-to-decl-anchor (&optional lim)
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7306 ;; Assuming point is at a brace that opens the block of a top level
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7307 ;; declaration of some kind, move to the proper anchor point for
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7308 ;; that block.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7309 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7310 ;; This function might do hidden buffer changes.
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7311 (unless (= (point) (c-point 'boi))
53073
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
7312 (c-beginning-of-statement-1 lim)))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7313
52107
3a5379a0d7f3 2003-08-01 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 51947
diff changeset
7314 (defun c-search-decl-header-end ()
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7315 ;; Search forward for the end of the "header" of the current
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7316 ;; declaration. That's the position where the definition body
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7317 ;; starts, or the first variable initializer, or the ending
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7318 ;; semicolon. I.e. search forward for the closest following
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7319 ;; (syntactically relevant) '{', '=' or ';' token. Point is left
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7320 ;; _after_ the first found token, or at point-max if none is found.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7321 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7322 ;; This function might do hidden buffer changes.
52107
3a5379a0d7f3 2003-08-01 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 51947
diff changeset
7323
3a5379a0d7f3 2003-08-01 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 51947
diff changeset
7324 (let ((base (point)))
3a5379a0d7f3 2003-08-01 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 51947
diff changeset
7325 (if (c-major-mode-is 'c++-mode)
3a5379a0d7f3 2003-08-01 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 51947
diff changeset
7326
3a5379a0d7f3 2003-08-01 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 51947
diff changeset
7327 ;; In C++ we need to take special care to handle operator
3a5379a0d7f3 2003-08-01 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 51947
diff changeset
7328 ;; tokens and those pesky template brackets.
3a5379a0d7f3 2003-08-01 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 51947
diff changeset
7329 (while (and
3a5379a0d7f3 2003-08-01 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 51947
diff changeset
7330 (c-syntactic-re-search-forward "[;{<=]" nil 'move t t)
3a5379a0d7f3 2003-08-01 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 51947
diff changeset
7331 (or
3a5379a0d7f3 2003-08-01 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 51947
diff changeset
7332 (c-end-of-current-token base)
3a5379a0d7f3 2003-08-01 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 51947
diff changeset
7333 ;; Handle operator identifiers, i.e. ignore any
3a5379a0d7f3 2003-08-01 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 51947
diff changeset
7334 ;; operator token preceded by "operator".
3a5379a0d7f3 2003-08-01 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 51947
diff changeset
7335 (save-excursion
3a5379a0d7f3 2003-08-01 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 51947
diff changeset
7336 (and (c-safe (c-backward-sexp) t)
75027
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
7337 (looking-at c-opt-op-identifier-prefix)))
52107
3a5379a0d7f3 2003-08-01 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 51947
diff changeset
7338 (and (eq (char-before) ?<)
3a5379a0d7f3 2003-08-01 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 51947
diff changeset
7339 (c-with-syntax-table c++-template-syntax-table
3a5379a0d7f3 2003-08-01 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 51947
diff changeset
7340 (if (c-safe (goto-char (c-up-list-forward (point))))
3a5379a0d7f3 2003-08-01 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 51947
diff changeset
7341 t
3a5379a0d7f3 2003-08-01 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 51947
diff changeset
7342 (goto-char (point-max))
3a5379a0d7f3 2003-08-01 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 51947
diff changeset
7343 nil)))))
3a5379a0d7f3 2003-08-01 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 51947
diff changeset
7344 (setq base (point)))
3a5379a0d7f3 2003-08-01 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 51947
diff changeset
7345
3a5379a0d7f3 2003-08-01 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 51947
diff changeset
7346 (while (and
3a5379a0d7f3 2003-08-01 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 51947
diff changeset
7347 (c-syntactic-re-search-forward "[;{=]" nil 'move t t)
3a5379a0d7f3 2003-08-01 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 51947
diff changeset
7348 (c-end-of-current-token base))
3a5379a0d7f3 2003-08-01 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 51947
diff changeset
7349 (setq base (point))))))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7350
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7351 (defun c-beginning-of-decl-1 (&optional lim)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7352 ;; Go to the beginning of the current declaration, or the beginning
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7353 ;; of the previous one if already at the start of it. Point won't
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7354 ;; be moved out of any surrounding paren. Return a cons cell of the
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7355 ;; form (MOVE . KNR-POS). MOVE is like the return value from
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7356 ;; `c-beginning-of-statement-1'. If point skipped over some K&R
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7357 ;; style argument declarations (and they are to be recognized) then
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7358 ;; KNR-POS is set to the start of the first such argument
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7359 ;; declaration, otherwise KNR-POS is nil. If LIM is non-nil, it's a
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7360 ;; position that bounds the backward search.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7361 ;;
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7362 ;; NB: Cases where the declaration continues after the block, as in
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7363 ;; "struct foo { ... } bar;", are currently recognized as two
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7364 ;; declarations, e.g. "struct foo { ... }" and "bar;" in this case.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7365 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7366 ;; This function might do hidden buffer changes.
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7367 (catch 'return
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7368 (let* ((start (point))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7369 (last-stmt-start (point))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7370 (move (c-beginning-of-statement-1 lim nil t)))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7371
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7372 ;; `c-beginning-of-statement-1' stops at a block start, but we
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7373 ;; want to continue if the block doesn't begin a top level
56646
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
7374 ;; construct, i.e. if it isn't preceded by ';', '}', ':', bob,
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
7375 ;; or an open paren.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7376 (let ((beg (point)) tentative-move)
75027
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
7377 ;; Go back one "statement" each time round the loop until we're just
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
7378 ;; after a ;, }, or :, or at BOB or the start of a macro or start of
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
7379 ;; an ObjC method. This will move over a multiple declaration whose
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
7380 ;; components are comma separated.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7381 (while (and
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7382 ;; Must check with c-opt-method-key in ObjC mode.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7383 (not (and c-opt-method-key
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7384 (looking-at c-opt-method-key)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7385 (/= last-stmt-start (point))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7386 (progn
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7387 (c-backward-syntactic-ws lim)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7388 (not (memq (char-before) '(?\; ?} ?: nil))))
56646
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
7389 (save-excursion
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
7390 (backward-char)
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
7391 (not (looking-at "\\s(")))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7392 ;; Check that we don't move from the first thing in a
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7393 ;; macro to its header.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7394 (not (eq (setq tentative-move
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7395 (c-beginning-of-statement-1 lim nil t))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7396 'macro)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7397 (setq last-stmt-start beg
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7398 beg (point)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7399 move tentative-move))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7400 (goto-char beg))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7401
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7402 (when c-recognize-knr-p
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7403 (let ((fallback-pos (point)) knr-argdecl-start)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7404 ;; Handle K&R argdecls. Back up after the "statement" jumped
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7405 ;; over by `c-beginning-of-statement-1', unless it was the
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7406 ;; function body, in which case we're sitting on the opening
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7407 ;; brace now. Then test if we're in a K&R argdecl region and
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7408 ;; that we started at the other side of the first argdecl in
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7409 ;; it.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7410 (unless (eq (char-after) ?{)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7411 (goto-char last-stmt-start))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7412 (if (and (setq knr-argdecl-start (c-in-knr-argdecl lim))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7413 (< knr-argdecl-start start)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7414 (progn
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7415 (goto-char knr-argdecl-start)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7416 (not (eq (c-beginning-of-statement-1 lim nil t) 'macro))))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7417 (throw 'return
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7418 (cons (if (eq (char-after fallback-pos) ?{)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7419 'previous
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7420 'same)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7421 knr-argdecl-start))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7422 (goto-char fallback-pos))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7423
75027
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
7424 ;; `c-beginning-of-statement-1' counts each brace block as a separate
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
7425 ;; statement, so the result will be 'previous if we've moved over any.
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
7426 ;; So change our result back to 'same if necessary.
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
7427 ;;
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
7428 ;; If they were brace list initializers we might not have moved over a
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
7429 ;; declaration boundary though, so change it to 'same if we've moved
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
7430 ;; past a '=' before '{', but not ';'. (This ought to be integrated
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
7431 ;; into `c-beginning-of-statement-1', so we avoid this extra pass which
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
7432 ;; potentially can search over a large amount of text.). Take special
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
7433 ;; pains not to get mislead by C++'s "operator=", and the like.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7434 (if (and (eq move 'previous)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7435 (c-with-syntax-table (if (c-major-mode-is 'c++-mode)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7436 c++-template-syntax-table
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7437 (syntax-table))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7438 (save-excursion
75027
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
7439 (and
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
7440 (progn
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
7441 (while ; keep going back to "[;={"s until we either find
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
7442 ; no more, or get to one which isn't an "operator ="
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
7443 (and (c-syntactic-re-search-forward "[;={]" start t t t)
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
7444 (eq (char-before) ?=)
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
7445 c-overloadable-operators-regexp
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
7446 c-opt-op-identifier-prefix
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
7447 (save-excursion
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
7448 (eq (c-backward-token-2) 0)
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
7449 (looking-at c-overloadable-operators-regexp)
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
7450 (eq (c-backward-token-2) 0)
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
7451 (looking-at c-opt-op-identifier-prefix))))
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
7452 (eq (char-before) ?=))
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
7453 (c-syntactic-re-search-forward "[;{]" start t t)
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
7454 (eq (char-before) ?{)
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
7455 (c-safe (goto-char (c-up-list-forward (point))) t)
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
7456 (not (c-syntactic-re-search-forward ";" start t t))))))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7457 (cons 'same nil)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7458 (cons move nil)))))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7459
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7460 (defun c-end-of-decl-1 ()
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7461 ;; Assuming point is at the start of a declaration (as detected by
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7462 ;; e.g. `c-beginning-of-decl-1'), go to the end of it. Unlike
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7463 ;; `c-beginning-of-decl-1', this function handles the case when a
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7464 ;; block is followed by identifiers in e.g. struct declarations in C
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7465 ;; or C++. If a proper end was found then t is returned, otherwise
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7466 ;; point is moved as far as possible within the current sexp and nil
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7467 ;; is returned. This function doesn't handle macros; use
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7468 ;; `c-end-of-macro' instead in those cases.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7469 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7470 ;; This function might do hidden buffer changes.
30403
68e734ab7d5d (c-looking-at-inexpr-block): Replaced a call to
Gerd Moellmann <gerd@gnu.org>
parents: 26817
diff changeset
7471 (let ((start (point))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7472 (decl-syntax-table (if (c-major-mode-is 'c++-mode)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7473 c++-template-syntax-table
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7474 (syntax-table))))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7475 (catch 'return
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7476 (c-search-decl-header-end)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7477
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7478 (when (and c-recognize-knr-p
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7479 (eq (char-before) ?\;)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7480 (c-in-knr-argdecl start))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7481 ;; Stopped at the ';' in a K&R argdecl section which is
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7482 ;; detected using the same criteria as in
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7483 ;; `c-beginning-of-decl-1'. Move to the following block
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7484 ;; start.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7485 (c-syntactic-re-search-forward "{" nil 'move t))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7486
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7487 (when (eq (char-before) ?{)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7488 ;; Encountered a block in the declaration. Jump over it.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7489 (condition-case nil
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7490 (goto-char (c-up-list-forward (point)))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7491 (error (goto-char (point-max))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7492 (throw 'return nil)))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7493 (if (or (not c-opt-block-decls-with-vars-key)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7494 (save-excursion
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7495 (c-with-syntax-table decl-syntax-table
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7496 (let ((lim (point)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7497 (goto-char start)
45049
11c11cb2b8a8 (c-beginning-of-decl-1): Better way to handle protection labels, one
Martin Stjernholm <mast@lysator.liu.se>
parents: 44728
diff changeset
7498 (not (and
11c11cb2b8a8 (c-beginning-of-decl-1): Better way to handle protection labels, one
Martin Stjernholm <mast@lysator.liu.se>
parents: 44728
diff changeset
7499 ;; Check for `c-opt-block-decls-with-vars-key'
11c11cb2b8a8 (c-beginning-of-decl-1): Better way to handle protection labels, one
Martin Stjernholm <mast@lysator.liu.se>
parents: 44728
diff changeset
7500 ;; before the first paren.
11c11cb2b8a8 (c-beginning-of-decl-1): Better way to handle protection labels, one
Martin Stjernholm <mast@lysator.liu.se>
parents: 44728
diff changeset
7501 (c-syntactic-re-search-forward
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7502 (concat "[;=\(\[{]\\|\\("
45049
11c11cb2b8a8 (c-beginning-of-decl-1): Better way to handle protection labels, one
Martin Stjernholm <mast@lysator.liu.se>
parents: 44728
diff changeset
7503 c-opt-block-decls-with-vars-key
11c11cb2b8a8 (c-beginning-of-decl-1): Better way to handle protection labels, one
Martin Stjernholm <mast@lysator.liu.se>
parents: 44728
diff changeset
7504 "\\)")
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7505 lim t t t)
45049
11c11cb2b8a8 (c-beginning-of-decl-1): Better way to handle protection labels, one
Martin Stjernholm <mast@lysator.liu.se>
parents: 44728
diff changeset
7506 (match-beginning 1)
11c11cb2b8a8 (c-beginning-of-decl-1): Better way to handle protection labels, one
Martin Stjernholm <mast@lysator.liu.se>
parents: 44728
diff changeset
7507 (not (eq (char-before) ?_))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7508 ;; Check that the first following paren is
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7509 ;; the block.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7510 (c-syntactic-re-search-forward "[;=\(\[{]"
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7511 lim t t t)
45049
11c11cb2b8a8 (c-beginning-of-decl-1): Better way to handle protection labels, one
Martin Stjernholm <mast@lysator.liu.se>
parents: 44728
diff changeset
7512 (eq (char-before) ?{)))))))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7513 ;; The declaration doesn't have any of the
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7514 ;; `c-opt-block-decls-with-vars' keywords in the
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7515 ;; beginning, so it ends here at the end of the block.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7516 (throw 'return t)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7517
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7518 (c-with-syntax-table decl-syntax-table
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7519 (while (progn
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7520 (if (eq (char-before) ?\;)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7521 (throw 'return t))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7522 (c-syntactic-re-search-forward ";" nil 'move t))))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7523 nil)))
30403
68e734ab7d5d (c-looking-at-inexpr-block): Replaced a call to
Gerd Moellmann <gerd@gnu.org>
parents: 26817
diff changeset
7524
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7525 (defun c-looking-at-decl-block (containing-sexp goto-start &optional limit)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7526 ;; Assuming the point is at an open brace, check if it starts a
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7527 ;; block that contains another declaration level, i.e. that isn't a
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7528 ;; statement block or a brace list, and if so return non-nil.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7529 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7530 ;; If the check is successful, the return value is the start of the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7531 ;; keyword that tells what kind of construct it is, i.e. typically
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7532 ;; what `c-decl-block-key' matched. Also, if GOTO-START is set then
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7533 ;; the point will be at the start of the construct, before any
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7534 ;; leading specifiers, otherwise it's at the returned position.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7535 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7536 ;; The point is clobbered if the check is unsuccessful.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7537 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7538 ;; CONTAINING-SEXP is the position of the open of the surrounding
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7539 ;; paren, or nil if none.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7540 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7541 ;; The optional LIMIT limits the backward search for the start of
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7542 ;; the construct. It's assumed to be at a syntactically relevant
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7543 ;; position.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7544 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7545 ;; If any template arglists are found in the searched region before
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7546 ;; the open brace, they get marked with paren syntax.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7547 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7548 ;; This function might do hidden buffer changes.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7549
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7550 (let ((open-brace (point)) kwd-start first-specifier-pos)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7551 (c-syntactic-skip-backward c-block-prefix-charset limit t)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7552
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7553 (when (and c-recognize-<>-arglists
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7554 (eq (char-before) ?>))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7555 ;; Could be at the end of a template arglist.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7556 (let ((c-parse-and-markup-<>-arglists t)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7557 (c-disallow-comma-in-<>-arglists
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7558 (and containing-sexp
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7559 (not (eq (char-after containing-sexp) ?{)))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7560 (while (and
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7561 (c-backward-<>-arglist nil limit)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7562 (progn
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7563 (c-syntactic-skip-backward c-block-prefix-charset limit t)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7564 (eq (char-before) ?>))))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7565
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7566 ;; Note: Can't get bogus hits inside template arglists below since they
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7567 ;; have gotten paren syntax above.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7568 (when (and
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7569 ;; If `goto-start' is set we begin by searching for the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7570 ;; first possible position of a leading specifier list.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7571 ;; The `c-decl-block-key' search continues from there since
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7572 ;; we know it can't match earlier.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7573 (if goto-start
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7574 (when (c-syntactic-re-search-forward c-symbol-start
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7575 open-brace t t)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7576 (goto-char (setq first-specifier-pos (match-beginning 0)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7577 t)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7578 t)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7579
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7580 (cond
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7581 ((c-syntactic-re-search-forward c-decl-block-key open-brace t t t)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7582 (goto-char (setq kwd-start (match-beginning 0)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7583 (or
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7584
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7585 ;; Found a keyword that can't be a type?
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7586 (match-beginning 1)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7587
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7588 ;; Can be a type too, in which case it's the return type of a
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7589 ;; function (under the assumption that no declaration level
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7590 ;; block construct starts with a type).
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7591 (not (c-forward-type))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7592
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7593 ;; Jumped over a type, but it could be a declaration keyword
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7594 ;; followed by the declared identifier that we've jumped over
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7595 ;; instead (e.g. in "class Foo {"). If it indeed is a type
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7596 ;; then we should be at the declarator now, so check for a
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7597 ;; valid declarator start.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7598 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7599 ;; Note: This doesn't cope with the case when a declared
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7600 ;; identifier is followed by e.g. '(' in a language where '('
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7601 ;; also might be part of a declarator expression. Currently
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7602 ;; there's no such language.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7603 (not (or (looking-at c-symbol-start)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7604 (looking-at c-type-decl-prefix-key)))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7605
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7606 ;; In Pike a list of modifiers may be followed by a brace
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7607 ;; to make them apply to many identifiers. Note that the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7608 ;; match data will be empty on return in this case.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7609 ((and (c-major-mode-is 'pike-mode)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7610 (progn
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7611 (goto-char open-brace)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7612 (= (c-backward-token-2) 0))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7613 (looking-at c-specifier-key)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7614 ;; Use this variant to avoid yet another special regexp.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7615 (c-keyword-member (c-keyword-sym (match-string 1))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7616 'c-modifier-kwds))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7617 (setq kwd-start (point))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7618 t)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7619
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7620 ;; Got a match.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7621
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7622 (if goto-start
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7623 ;; Back up over any preceding specifiers and their clauses
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7624 ;; by going forward from `first-specifier-pos', which is the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7625 ;; earliest possible position where the specifier list can
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7626 ;; start.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7627 (progn
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7628 (goto-char first-specifier-pos)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7629
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7630 (while (< (point) kwd-start)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7631 (if (looking-at c-symbol-key)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7632 ;; Accept any plain symbol token on the ground that
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7633 ;; it's a specifier masked through a macro (just
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7634 ;; like `c-forward-decl-or-cast-1' skip forward over
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7635 ;; such tokens).
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7636 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7637 ;; Could be more restrictive wrt invalid keywords,
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7638 ;; but that'd only occur in invalid code so there's
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7639 ;; no use spending effort on it.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7640 (let ((end (match-end 0)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7641 (unless (c-forward-keyword-clause 0)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7642 (goto-char end)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7643 (c-forward-syntactic-ws)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7644
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7645 ;; Can't parse a declaration preamble and is still
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7646 ;; before `kwd-start'. That means `first-specifier-pos'
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7647 ;; was in some earlier construct. Search again.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7648 (if (c-syntactic-re-search-forward c-symbol-start
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7649 kwd-start 'move t)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7650 (goto-char (setq first-specifier-pos (match-beginning 0)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7651 ;; Got no preamble before the block declaration keyword.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7652 (setq first-specifier-pos kwd-start))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7653
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7654 (goto-char first-specifier-pos))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7655 (goto-char kwd-start))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7656
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7657 kwd-start)))
30403
68e734ab7d5d (c-looking-at-inexpr-block): Replaced a call to
Gerd Moellmann <gerd@gnu.org>
parents: 26817
diff changeset
7658
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7659 (defun c-search-uplist-for-classkey (paren-state)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7660 ;; Check if the closest containing paren sexp is a declaration
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7661 ;; block, returning a 2 element vector in that case. Aref 0
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7662 ;; contains the bufpos at boi of the class key line, and aref 1
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7663 ;; contains the bufpos of the open brace. This function is an
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7664 ;; obsolete wrapper for `c-looking-at-decl-block'.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7665 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7666 ;; This function might do hidden buffer changes.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7667 (let ((open-paren-pos (c-most-enclosing-brace paren-state)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7668 (when open-paren-pos
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7669 (save-excursion
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7670 (goto-char open-paren-pos)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7671 (when (and (eq (char-after) ?{)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7672 (c-looking-at-decl-block
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7673 (c-safe-position open-paren-pos paren-state)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7674 nil))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7675 (back-to-indentation)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7676 (vector (point) open-paren-pos))))))
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7677
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7678 (defun c-inside-bracelist-p (containing-sexp paren-state)
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7679 ;; return the buffer position of the beginning of the brace list
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7680 ;; statement if we're inside a brace list, otherwise return nil.
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7681 ;; CONTAINING-SEXP is the buffer pos of the innermost containing
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7682 ;; paren. PAREN-STATE is the remainder of the state of enclosing
36920
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
7683 ;; braces
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7684 ;;
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7685 ;; N.B.: This algorithm can potentially get confused by cpp macros
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7686 ;; placed in inconvenient locations. It's a trade-off we make for
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7687 ;; speed.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7688 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7689 ;; This function might do hidden buffer changes.
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7690 (or
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7691 ;; This will pick up brace list declarations.
21106
5e5fa0a34cb0 (c-inside-bracelist-p): Fix for enum test.
Richard M. Stallman <rms@gnu.org>
parents: 20914
diff changeset
7692 (c-safe
5e5fa0a34cb0 (c-inside-bracelist-p): Fix for enum test.
Richard M. Stallman <rms@gnu.org>
parents: 20914
diff changeset
7693 (save-excursion
5e5fa0a34cb0 (c-inside-bracelist-p): Fix for enum test.
Richard M. Stallman <rms@gnu.org>
parents: 20914
diff changeset
7694 (goto-char containing-sexp)
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7695 (c-forward-sexp -1)
21106
5e5fa0a34cb0 (c-inside-bracelist-p): Fix for enum test.
Richard M. Stallman <rms@gnu.org>
parents: 20914
diff changeset
7696 (let (bracepos)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7697 (if (and (or (looking-at c-brace-list-key)
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7698 (progn (c-forward-sexp -1)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7699 (looking-at c-brace-list-key)))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7700 (setq bracepos (c-down-list-forward (point)))
21106
5e5fa0a34cb0 (c-inside-bracelist-p): Fix for enum test.
Richard M. Stallman <rms@gnu.org>
parents: 20914
diff changeset
7701 (not (c-crosses-statement-barrier-p (point)
5e5fa0a34cb0 (c-inside-bracelist-p): Fix for enum test.
Richard M. Stallman <rms@gnu.org>
parents: 20914
diff changeset
7702 (- bracepos 2))))
5e5fa0a34cb0 (c-inside-bracelist-p): Fix for enum test.
Richard M. Stallman <rms@gnu.org>
parents: 20914
diff changeset
7703 (point)))))
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7704 ;; this will pick up array/aggregate init lists, even if they are nested.
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7705 (save-excursion
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7706 (let ((class-key
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7707 ;; Pike can have class definitions anywhere, so we must
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7708 ;; check for the class key here.
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7709 (and (c-major-mode-is 'pike-mode)
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7710 c-decl-block-key))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7711 bufpos braceassignp lim next-containing)
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7712 (while (and (not bufpos)
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7713 containing-sexp)
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7714 (when paren-state
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7715 (if (consp (car paren-state))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7716 (setq lim (cdr (car paren-state))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7717 paren-state (cdr paren-state))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7718 (setq lim (car paren-state)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7719 (when paren-state
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7720 (setq next-containing (car paren-state)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7721 paren-state (cdr paren-state))))
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7722 (goto-char containing-sexp)
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7723 (if (c-looking-at-inexpr-block next-containing next-containing)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7724 ;; We're in an in-expression block of some kind. Do not
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7725 ;; check nesting. We deliberately set the limit to the
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7726 ;; containing sexp, so that c-looking-at-inexpr-block
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7727 ;; doesn't check for an identifier before it.
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7728 (setq containing-sexp nil)
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7729 ;; see if the open brace is preceded by = or [...] in
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7730 ;; this statement, but watch out for operator=
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7731 (setq braceassignp 'dontknow)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7732 (c-backward-token-2 1 t lim)
25178
1dc57e616e8d (c-inside-bracelist-p): Tighter test for
Richard M. Stallman <rms@gnu.org>
parents: 24335
diff changeset
7733 ;; Checks to do only on the first sexp before the brace.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7734 (when (and c-opt-inexpr-brace-list-key
25178
1dc57e616e8d (c-inside-bracelist-p): Tighter test for
Richard M. Stallman <rms@gnu.org>
parents: 24335
diff changeset
7735 (eq (char-after) ?\[))
1dc57e616e8d (c-inside-bracelist-p): Tighter test for
Richard M. Stallman <rms@gnu.org>
parents: 24335
diff changeset
7736 ;; In Java, an initialization brace list may follow
1dc57e616e8d (c-inside-bracelist-p): Tighter test for
Richard M. Stallman <rms@gnu.org>
parents: 24335
diff changeset
7737 ;; directly after "new Foo[]", so check for a "new"
1dc57e616e8d (c-inside-bracelist-p): Tighter test for
Richard M. Stallman <rms@gnu.org>
parents: 24335
diff changeset
7738 ;; earlier.
1dc57e616e8d (c-inside-bracelist-p): Tighter test for
Richard M. Stallman <rms@gnu.org>
parents: 24335
diff changeset
7739 (while (eq braceassignp 'dontknow)
1dc57e616e8d (c-inside-bracelist-p): Tighter test for
Richard M. Stallman <rms@gnu.org>
parents: 24335
diff changeset
7740 (setq braceassignp
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7741 (cond ((/= (c-backward-token-2 1 t lim) 0) nil)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7742 ((looking-at c-opt-inexpr-brace-list-key) t)
25178
1dc57e616e8d (c-inside-bracelist-p): Tighter test for
Richard M. Stallman <rms@gnu.org>
parents: 24335
diff changeset
7743 ((looking-at "\\sw\\|\\s_\\|[.[]")
1dc57e616e8d (c-inside-bracelist-p): Tighter test for
Richard M. Stallman <rms@gnu.org>
parents: 24335
diff changeset
7744 ;; Carry on looking if this is an
1dc57e616e8d (c-inside-bracelist-p): Tighter test for
Richard M. Stallman <rms@gnu.org>
parents: 24335
diff changeset
7745 ;; identifier (may contain "." in Java)
1dc57e616e8d (c-inside-bracelist-p): Tighter test for
Richard M. Stallman <rms@gnu.org>
parents: 24335
diff changeset
7746 ;; or another "[]" sexp.
1dc57e616e8d (c-inside-bracelist-p): Tighter test for
Richard M. Stallman <rms@gnu.org>
parents: 24335
diff changeset
7747 'dontknow)
1dc57e616e8d (c-inside-bracelist-p): Tighter test for
Richard M. Stallman <rms@gnu.org>
parents: 24335
diff changeset
7748 (t nil)))))
1dc57e616e8d (c-inside-bracelist-p): Tighter test for
Richard M. Stallman <rms@gnu.org>
parents: 24335
diff changeset
7749 ;; Checks to do on all sexps before the brace, up to the
1dc57e616e8d (c-inside-bracelist-p): Tighter test for
Richard M. Stallman <rms@gnu.org>
parents: 24335
diff changeset
7750 ;; beginning of the statement.
1dc57e616e8d (c-inside-bracelist-p): Tighter test for
Richard M. Stallman <rms@gnu.org>
parents: 24335
diff changeset
7751 (while (eq braceassignp 'dontknow)
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7752 (cond ((eq (char-after) ?\;)
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7753 (setq braceassignp nil))
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7754 ((and class-key
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7755 (looking-at class-key))
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7756 (setq braceassignp nil))
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7757 ((eq (char-after) ?=)
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7758 ;; We've seen a =, but must check earlier tokens so
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7759 ;; that it isn't something that should be ignored.
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7760 (setq braceassignp 'maybe)
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7761 (while (and (eq braceassignp 'maybe)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7762 (zerop (c-backward-token-2 1 t lim)))
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7763 (setq braceassignp
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7764 (cond
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7765 ;; Check for operator =
75027
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
7766 ((and c-opt-op-identifier-prefix
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
7767 (looking-at c-opt-op-identifier-prefix))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7768 nil)
36920
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
7769 ;; Check for `<opchar>= in Pike.
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
7770 ((and (c-major-mode-is 'pike-mode)
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
7771 (or (eq (char-after) ?`)
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
7772 ;; Special case for Pikes
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
7773 ;; `[]=, since '[' is not in
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
7774 ;; the punctuation class.
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
7775 (and (eq (char-after) ?\[)
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
7776 (eq (char-before) ?`))))
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
7777 nil)
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7778 ((looking-at "\\s.") 'maybe)
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7779 ;; make sure we're not in a C++ template
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7780 ;; argument assignment
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7781 ((and
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7782 (c-major-mode-is 'c++-mode)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7783 (save-excursion
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7784 (let ((here (point))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7785 (pos< (progn
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7786 (skip-chars-backward "^<>")
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7787 (point))))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7788 (and (eq (char-before) ?<)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7789 (not (c-crosses-statement-barrier-p
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7790 pos< here))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7791 (not (c-in-literal))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7792 ))))
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7793 nil)
25178
1dc57e616e8d (c-inside-bracelist-p): Tighter test for
Richard M. Stallman <rms@gnu.org>
parents: 24335
diff changeset
7794 (t t))))))
1dc57e616e8d (c-inside-bracelist-p): Tighter test for
Richard M. Stallman <rms@gnu.org>
parents: 24335
diff changeset
7795 (if (and (eq braceassignp 'dontknow)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
7796 (/= (c-backward-token-2 1 t lim) 0))
25178
1dc57e616e8d (c-inside-bracelist-p): Tighter test for
Richard M. Stallman <rms@gnu.org>
parents: 24335
diff changeset
7797 (setq braceassignp nil)))
1dc57e616e8d (c-inside-bracelist-p): Tighter test for
Richard M. Stallman <rms@gnu.org>
parents: 24335
diff changeset
7798 (if (not braceassignp)
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7799 (if (eq (char-after) ?\;)
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7800 ;; Brace lists can't contain a semicolon, so we're done.
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7801 (setq containing-sexp nil)
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7802 ;; Go up one level.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7803 (setq containing-sexp next-containing
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7804 lim nil
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7805 next-containing nil))
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7806 ;; we've hit the beginning of the aggregate list
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7807 (c-beginning-of-statement-1
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7808 (c-most-enclosing-brace paren-state))
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7809 (setq bufpos (point))))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7810 )
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7811 bufpos))
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7812 ))
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7813
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7814 (defun c-looking-at-special-brace-list (&optional lim)
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7815 ;; If we're looking at the start of a pike-style list, ie `({ })',
30403
68e734ab7d5d (c-looking-at-inexpr-block): Replaced a call to
Gerd Moellmann <gerd@gnu.org>
parents: 26817
diff changeset
7816 ;; `([ ])', `(< >)' etc, a cons of a cons of its starting and ending
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7817 ;; positions and its entry in c-special-brace-lists is returned, nil
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7818 ;; otherwise. The ending position is nil if the list is still open.
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7819 ;; LIM is the limit for forward search. The point may either be at
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7820 ;; the `(' or at the following paren character. Tries to check the
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7821 ;; matching closer, but assumes it's correct if no balanced paren is
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7822 ;; found (i.e. the case `({ ... } ... )' is detected as _not_ being
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7823 ;; a special brace list).
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7824 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7825 ;; This function might do hidden buffer changes.
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7826 (if c-special-brace-lists
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7827 (condition-case ()
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7828 (save-excursion
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7829 (let ((beg (point))
56646
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
7830 inner-beg end type)
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7831 (c-forward-syntactic-ws)
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7832 (if (eq (char-after) ?\()
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7833 (progn
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7834 (forward-char 1)
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7835 (c-forward-syntactic-ws)
56646
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
7836 (setq inner-beg (point))
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7837 (setq type (assq (char-after) c-special-brace-lists)))
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7838 (if (setq type (assq (char-after) c-special-brace-lists))
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7839 (progn
56646
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
7840 (setq inner-beg (point))
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7841 (c-backward-syntactic-ws)
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7842 (forward-char -1)
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7843 (setq beg (if (eq (char-after) ?\()
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7844 (point)
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7845 nil)))))
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7846 (if (and beg type)
56646
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
7847 (if (and (c-safe
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
7848 (goto-char beg)
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
7849 (c-forward-sexp 1)
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
7850 (setq end (point))
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
7851 (= (char-before) ?\)))
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
7852 (c-safe
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
7853 (goto-char inner-beg)
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
7854 (if (looking-at "\\s(")
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
7855 ;; Check balancing of the inner paren
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
7856 ;; below.
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
7857 (progn
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7858 (c-forward-sexp 1)
56646
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
7859 t)
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
7860 ;; If the inner char isn't a paren then
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
7861 ;; we can't check balancing, so just
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
7862 ;; check the char before the outer
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
7863 ;; closing paren.
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
7864 (goto-char end)
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
7865 (backward-char)
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
7866 (c-backward-syntactic-ws)
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
7867 (= (char-before) (cdr type)))))
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7868 (if (or (/= (char-syntax (char-before)) ?\))
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7869 (= (progn
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7870 (c-forward-syntactic-ws)
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7871 (point))
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7872 (1- end)))
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7873 (cons (cons beg end) type))
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7874 (cons (list beg) type)))))
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7875 (error nil))))
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7876
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7877 (defun c-looking-at-bos (&optional lim)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7878 ;; Return non-nil if between two statements or declarations, assuming
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7879 ;; point is not inside a literal or comment.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7880 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7881 ;; Obsolete - `c-at-statement-start-p' or `c-at-expression-start-p'
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7882 ;; are recommended instead.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7883 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7884 ;; This function might do hidden buffer changes.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7885 (c-at-statement-start-p))
104693
eee42a220506 * progmodes/cc-vars.el (c-comment-continuation-stars):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 102168
diff changeset
7886 (make-obsolete 'c-looking-at-bos 'c-at-statement-start-p "22.1")
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7887
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7888 (defun c-looking-at-inexpr-block (lim containing-sexp &optional check-at-end)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7889 ;; Return non-nil if we're looking at the beginning of a block
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7890 ;; inside an expression. The value returned is actually a cons of
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7891 ;; either 'inlambda, 'inexpr-statement or 'inexpr-class and the
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7892 ;; position of the beginning of the construct.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7893 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7894 ;; LIM limits the backward search. CONTAINING-SEXP is the start
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7895 ;; position of the closest containing list. If it's nil, the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7896 ;; containing paren isn't used to decide whether we're inside an
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7897 ;; expression or not. If both LIM and CONTAINING-SEXP are used, LIM
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7898 ;; needs to be farther back.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7899 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7900 ;; If CHECK-AT-END is non-nil then extra checks at the end of the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7901 ;; brace block might be done. It should only be used when the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7902 ;; construct can be assumed to be complete, i.e. when the original
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7903 ;; starting position was further down than that.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7904 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7905 ;; This function might do hidden buffer changes.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7906
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7907 (save-excursion
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7908 (let ((res 'maybe) passed-paren
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7909 (closest-lim (or containing-sexp lim (point-min)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7910 ;; Look at the character after point only as a last resort
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7911 ;; when we can't disambiguate.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7912 (block-follows (and (eq (char-after) ?{) (point))))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7913
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7914 (while (and (eq res 'maybe)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7915 (progn (c-backward-syntactic-ws)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7916 (> (point) closest-lim))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7917 (not (bobp))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7918 (progn (backward-char)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7919 (looking-at "[\]\).]\\|\\w\\|\\s_"))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7920 (c-safe (forward-char)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7921 (goto-char (scan-sexps (point) -1))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7922
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7923 (setq res
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7924 (if (looking-at c-keywords-regexp)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7925 (let ((kw-sym (c-keyword-sym (match-string 1))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7926 (cond
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7927 ((and block-follows
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7928 (c-keyword-member kw-sym 'c-inexpr-class-kwds))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7929 (and (not (eq passed-paren ?\[))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7930 (or (not (looking-at c-class-key))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7931 ;; If the class definition is at the start of
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7932 ;; a statement, we don't consider it an
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7933 ;; in-expression class.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7934 (let ((prev (point)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7935 (while (and
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7936 (= (c-backward-token-2 1 nil closest-lim) 0)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7937 (eq (char-syntax (char-after)) ?w))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7938 (setq prev (point)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7939 (goto-char prev)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7940 (not (c-at-statement-start-p)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7941 ;; Also, in Pike we treat it as an
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7942 ;; in-expression class if it's used in an
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7943 ;; object clone expression.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7944 (save-excursion
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7945 (and check-at-end
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7946 (c-major-mode-is 'pike-mode)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7947 (progn (goto-char block-follows)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7948 (zerop (c-forward-token-2 1 t)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7949 (eq (char-after) ?\())))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7950 (cons 'inexpr-class (point))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7951 ((c-keyword-member kw-sym 'c-inexpr-block-kwds)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7952 (when (not passed-paren)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7953 (cons 'inexpr-statement (point))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7954 ((c-keyword-member kw-sym 'c-lambda-kwds)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7955 (when (or (not passed-paren)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7956 (eq passed-paren ?\())
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7957 (cons 'inlambda (point))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7958 ((c-keyword-member kw-sym 'c-block-stmt-kwds)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7959 nil)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7960 (t
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7961 'maybe)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7962
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7963 (if (looking-at "\\s(")
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7964 (if passed-paren
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7965 (if (and (eq passed-paren ?\[)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7966 (eq (char-after) ?\[))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7967 ;; Accept several square bracket sexps for
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7968 ;; Java array initializations.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7969 'maybe)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7970 (setq passed-paren (char-after))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7971 'maybe)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7972 'maybe))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7973
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7974 (if (eq res 'maybe)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7975 (when (and c-recognize-paren-inexpr-blocks
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7976 block-follows
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7977 containing-sexp
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7978 (eq (char-after containing-sexp) ?\())
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7979 (goto-char containing-sexp)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7980 (if (or (save-excursion
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7981 (c-backward-syntactic-ws lim)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7982 (and (> (point) (or lim (point-min)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7983 (c-on-identifier)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7984 (and c-special-brace-lists
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7985 (c-looking-at-special-brace-list)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7986 nil
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7987 (cons 'inexpr-statement (point))))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7988
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7989 res))))
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7990
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7991 (defun c-looking-at-inexpr-block-backward (paren-state)
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7992 ;; Returns non-nil if we're looking at the end of an in-expression
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7993 ;; block, otherwise the same as `c-looking-at-inexpr-block'.
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7994 ;; PAREN-STATE is the paren state relevant at the current position.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7995 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
7996 ;; This function might do hidden buffer changes.
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
7997 (save-excursion
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7998 ;; We currently only recognize a block.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
7999 (let ((here (point))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8000 (elem (car-safe paren-state))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8001 containing-sexp)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8002 (when (and (consp elem)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8003 (progn (goto-char (cdr elem))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8004 (c-forward-syntactic-ws here)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8005 (= (point) here)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8006 (goto-char (car elem))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8007 (if (setq paren-state (cdr paren-state))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8008 (setq containing-sexp (car-safe paren-state)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8009 (c-looking-at-inexpr-block (c-safe-position containing-sexp
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8010 paren-state)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8011 containing-sexp)))))
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
8012
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8013
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8014 ;; `c-guess-basic-syntax' and the functions that precedes it below
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8015 ;; implements the main decision tree for determining the syntactic
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8016 ;; analysis of the current line of code.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8017
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8018 ;; Dynamically bound to t when `c-guess-basic-syntax' is called during
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8019 ;; auto newline analysis.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8020 (defvar c-auto-newline-analysis nil)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8021
78656
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8022 (defun c-brace-anchor-point (bracepos)
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8023 ;; BRACEPOS is the position of a brace in a construct like "namespace
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8024 ;; Bar {". Return the anchor point in this construct; this is the
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8025 ;; earliest symbol on the brace's line which isn't earlier than
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8026 ;; "namespace".
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8027 ;;
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8028 ;; Currently (2007-08-17), "like namespace" means "matches
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8029 ;; c-other-block-decl-kwds". It doesn't work with "class" or "struct"
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8030 ;; or anything like that.
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8031 (save-excursion
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8032 (let ((boi (c-point 'boi bracepos)))
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8033 (goto-char bracepos)
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8034 (while (and (> (point) boi)
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8035 (not (looking-at c-other-decl-block-key)))
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8036 (c-backward-token-2))
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8037 (if (> (point) boi) (point) boi))))
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8038
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8039 (defsubst c-add-syntax (symbol &rest args)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8040 ;; A simple function to prepend a new syntax element to
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8041 ;; `c-syntactic-context'. Using `setq' on it is unsafe since it
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8042 ;; should always be dynamically bound but since we read it first
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8043 ;; we'll fail properly anyway if this function is misused.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8044 (setq c-syntactic-context (cons (cons symbol args)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8045 c-syntactic-context)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8046
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8047 (defsubst c-append-syntax (symbol &rest args)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8048 ;; Like `c-add-syntax' but appends to the end of the syntax list.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8049 ;; (Normally not necessary.)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8050 (setq c-syntactic-context (nconc c-syntactic-context
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8051 (list (cons symbol args)))))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8052
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8053 (defun c-add-stmt-syntax (syntax-symbol
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8054 syntax-extra-args
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8055 stop-at-boi-only
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8056 containing-sexp
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8057 paren-state)
75027
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
8058 ;; Add the indicated SYNTAX-SYMBOL to `c-syntactic-context', extending it as
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
8059 ;; needed with further syntax elements of the types `substatement',
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
8060 ;; `inexpr-statement', `arglist-cont-nonempty', `statement-block-intro', and
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
8061 ;; `defun-block-intro'.
79408
a29ca195b71e (c-crosses-statement-barrier-p): Fix typo in docstring.
Juanma Barranquero <lekktu@gmail.com>
parents: 78656
diff changeset
8062 ;;
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8063 ;; Do the generic processing to anchor the given syntax symbol on
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8064 ;; the preceding statement: Skip over any labels and containing
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8065 ;; statements on the same line, and then search backward until we
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8066 ;; find a statement or block start that begins at boi without a
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8067 ;; label or comment.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8068 ;;
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8069 ;; Point is assumed to be at the prospective anchor point for the
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8070 ;; given SYNTAX-SYMBOL. More syntax entries are added if we need to
78656
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8071 ;; skip past open parens and containing statements. Most of the added
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8072 ;; syntax elements will get the same anchor point - the exception is
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8073 ;; for an anchor in a construct like "namespace"[*] - this is as early
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8074 ;; as possible in the construct but on the same line as the {.
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8075 ;;
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8076 ;; [*] i.e. with a keyword matching c-other-block-decl-kwds.
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8077 ;;
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8078 ;; SYNTAX-EXTRA-ARGS are a list of the extra arguments for the
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8079 ;; syntax symbol. They are appended after the anchor point.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8080 ;;
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8081 ;; If STOP-AT-BOI-ONLY is nil, we can stop in the middle of the line
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8082 ;; if the current statement starts there.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8083 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8084 ;; Note: It's not a problem if PAREN-STATE "overshoots"
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8085 ;; CONTAINING-SEXP, i.e. contains info about parens further down.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8086 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8087 ;; This function might do hidden buffer changes.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8088
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8089 (if (= (point) (c-point 'boi))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8090 ;; This is by far the most common case, so let's give it special
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8091 ;; treatment.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8092 (apply 'c-add-syntax syntax-symbol (point) syntax-extra-args)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8093
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8094 (let ((syntax-last c-syntactic-context)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8095 (boi (c-point 'boi))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8096 ;; Set when we're on a label, so that we don't stop there.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8097 ;; FIXME: To be complete we should check if we're on a label
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8098 ;; now at the start.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8099 on-label)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8100
78656
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8101 ;; Use point as the anchor point for "namespace", "extern", etc.
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8102 (apply 'c-add-syntax syntax-symbol
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8103 (if (rassq syntax-symbol c-other-decl-block-key-in-symbols-alist)
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8104 (point) nil)
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8105 syntax-extra-args)
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8106
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8107 ;; Loop while we have to back out of containing blocks.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8108 (while
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8109 (and
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8110 (catch 'back-up-block
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8111
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8112 ;; Loop while we have to back up statements.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8113 (while (or (/= (point) boi)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8114 on-label
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8115 (looking-at c-comment-start-regexp))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8116
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8117 ;; Skip past any comments that stands between the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8118 ;; statement start and boi.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8119 (let ((savepos (point)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8120 (while (and (/= savepos boi)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8121 (c-backward-single-comment))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8122 (setq savepos (point)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8123 boi (c-point 'boi)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8124 (goto-char savepos))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8125
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8126 ;; Skip to the beginning of this statement or backward
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8127 ;; another one.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8128 (let ((old-pos (point))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8129 (old-boi boi)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8130 (step-type (c-beginning-of-statement-1 containing-sexp)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8131 (setq boi (c-point 'boi)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8132 on-label (eq step-type 'label))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8133
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8134 (cond ((= (point) old-pos)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8135 ;; If we didn't move we're at the start of a block and
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8136 ;; have to continue outside it.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8137 (throw 'back-up-block t))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8138
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8139 ((and (eq step-type 'up)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8140 (>= (point) old-boi)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8141 (looking-at "else\\>[^_]")
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8142 (save-excursion
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8143 (goto-char old-pos)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8144 (looking-at "if\\>[^_]")))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8145 ;; Special case to avoid deeper and deeper indentation
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8146 ;; of "else if" clauses.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8147 )
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8148
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8149 ((and (not stop-at-boi-only)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8150 (/= old-pos old-boi)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8151 (memq step-type '(up previous)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8152 ;; If stop-at-boi-only is nil, we shouldn't back up
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8153 ;; over previous or containing statements to try to
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8154 ;; reach boi, so go back to the last position and
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8155 ;; exit.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8156 (goto-char old-pos)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8157 (throw 'back-up-block nil))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8158
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8159 (t
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8160 (if (and (not stop-at-boi-only)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8161 (memq step-type '(up previous beginning)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8162 ;; If we've moved into another statement then we
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8163 ;; should no longer try to stop in the middle of a
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8164 ;; line.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8165 (setq stop-at-boi-only t))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8166
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8167 ;; Record this as a substatement if we skipped up one
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8168 ;; level.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8169 (when (eq step-type 'up)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8170 (c-add-syntax 'substatement nil))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8171 )))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8172
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8173 containing-sexp)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8174
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8175 ;; Now we have to go out of this block.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8176 (goto-char containing-sexp)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8177
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8178 ;; Don't stop in the middle of a special brace list opener
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8179 ;; like "({".
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8180 (when c-special-brace-lists
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8181 (let ((special-list (c-looking-at-special-brace-list)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8182 (when (and special-list
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8183 (< (car (car special-list)) (point)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8184 (setq containing-sexp (car (car special-list)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8185 (goto-char containing-sexp))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8186
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8187 (setq paren-state (c-whack-state-after containing-sexp paren-state)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8188 containing-sexp (c-most-enclosing-brace paren-state)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8189 boi (c-point 'boi))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8190
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8191 ;; Analyze the construct in front of the block we've stepped out
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8192 ;; from and add the right syntactic element for it.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8193 (let ((paren-pos (point))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8194 (paren-char (char-after))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8195 step-type)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8196
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8197 (if (eq paren-char ?\()
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8198 ;; Stepped out of a parenthesis block, so we're in an
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8199 ;; expression now.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8200 (progn
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8201 (when (/= paren-pos boi)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8202 (if (and c-recognize-paren-inexpr-blocks
45512
17fef404cef1 (c-add-stmt-syntax): Fixed some cases of wrong anchoring, e.g. for
Martin Stjernholm <mast@lysator.liu.se>
parents: 45049
diff changeset
8203 (progn
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8204 (c-backward-syntactic-ws containing-sexp)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8205 (or (not (looking-at "\\>"))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8206 (not (c-on-identifier))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8207 (save-excursion
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8208 (goto-char (1+ paren-pos))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8209 (c-forward-syntactic-ws)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8210 (eq (char-after) ?{)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8211 ;; Stepped out of an in-expression statement. This
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8212 ;; syntactic element won't get an anchor pos.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8213 (c-add-syntax 'inexpr-statement)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8214
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8215 ;; A parenthesis normally belongs to an arglist.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8216 (c-add-syntax 'arglist-cont-nonempty nil paren-pos)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8217
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8218 (goto-char (max boi
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8219 (if containing-sexp
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8220 (1+ containing-sexp)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8221 (point-min))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8222 (setq step-type 'same
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8223 on-label nil))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8224
78656
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8225 ;; Stepped out of a brace block.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8226 (setq step-type (c-beginning-of-statement-1 containing-sexp)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8227 on-label (eq step-type 'label))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8228
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8229 (if (and (eq step-type 'same)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8230 (/= paren-pos (point)))
78656
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8231 (let (inexpr)
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8232 (cond
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8233 ((save-excursion
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8234 (goto-char paren-pos)
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8235 (setq inexpr (c-looking-at-inexpr-block
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8236 (c-safe-position containing-sexp paren-state)
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8237 containing-sexp)))
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8238 (c-add-syntax (if (eq (car inexpr) 'inlambda)
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8239 'defun-block-intro
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8240 'statement-block-intro)
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8241 nil))
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8242 ((looking-at c-other-decl-block-key)
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8243 (c-add-syntax
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8244 (cdr (assoc (match-string 1)
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8245 c-other-decl-block-key-in-symbols-alist))
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8246 (max (c-point 'boi paren-pos) (point))))
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8247 (t (c-add-syntax 'defun-block-intro nil))))
79408
a29ca195b71e (c-crosses-statement-barrier-p): Fix typo in docstring.
Juanma Barranquero <lekktu@gmail.com>
parents: 78656
diff changeset
8248
78656
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8249 (c-add-syntax 'statement-block-intro nil)))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8250
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8251 (if (= paren-pos boi)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8252 ;; Always done if the open brace was at boi. The
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8253 ;; c-beginning-of-statement-1 call above is necessary
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8254 ;; anyway, to decide the type of block-intro to add.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8255 (goto-char paren-pos)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8256 (setq boi (c-point 'boi)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8257 ))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8258
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8259 ;; Fill in the current point as the anchor for all the symbols
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8260 ;; added above.
78656
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8261 (let ((p c-syntactic-context) q)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8262 (while (not (eq p syntax-last))
78656
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8263 (setq q (cdr (car p))) ; e.g. (nil 28) [from (arglist-cont-nonempty nil 28)]
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8264 (while q
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8265 (unless (car q)
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8266 (setcar q (point)))
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
8267 (setq q (cdr q)))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8268 (setq p (cdr p))))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8269 )))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8270
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8271 (defun c-add-class-syntax (symbol
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8272 containing-decl-open
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8273 containing-decl-start
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8274 containing-decl-kwd
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8275 paren-state)
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8276 ;; The inclass and class-close syntactic symbols are added in
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8277 ;; several places and some work is needed to fix everything.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8278 ;; Therefore it's collected here.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8279 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8280 ;; This function might do hidden buffer changes.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8281 (goto-char containing-decl-open)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8282 (if (and (eq symbol 'inclass) (= (point) (c-point 'boi)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8283 (progn
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8284 (c-add-syntax symbol containing-decl-open)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8285 containing-decl-open)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8286 (goto-char containing-decl-start)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8287 ;; Ought to use `c-add-stmt-syntax' instead of backing up to boi
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8288 ;; here, but we have to do like this for compatibility.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8289 (back-to-indentation)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8290 (c-add-syntax symbol (point))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8291 (if (and (c-keyword-member containing-decl-kwd
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8292 'c-inexpr-class-kwds)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8293 (/= containing-decl-start (c-point 'boi containing-decl-start)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8294 (c-add-syntax 'inexpr-class))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8295 (point)))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8296
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8297 (defun c-guess-continued-construct (indent-point
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8298 char-after-ip
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8299 beg-of-same-or-containing-stmt
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8300 containing-sexp
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8301 paren-state)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8302 ;; This function contains the decision tree reached through both
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8303 ;; cases 18 and 10. It's a continued statement or top level
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8304 ;; construct of some kind.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8305 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8306 ;; This function might do hidden buffer changes.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8307
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8308 (let (special-brace-list)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8309 (goto-char indent-point)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8310 (skip-chars-forward " \t")
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8311
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8312 (cond
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8313 ;; (CASE A removed.)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8314 ;; CASE B: open braces for class or brace-lists
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8315 ((setq special-brace-list
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8316 (or (and c-special-brace-lists
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8317 (c-looking-at-special-brace-list))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8318 (eq char-after-ip ?{)))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8319
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8320 (cond
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8321 ;; CASE B.1: class-open
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8322 ((save-excursion
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8323 (and (eq (char-after) ?{)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8324 (c-looking-at-decl-block containing-sexp t)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8325 (setq beg-of-same-or-containing-stmt (point))))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8326 (c-add-syntax 'class-open beg-of-same-or-containing-stmt))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8327
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8328 ;; CASE B.2: brace-list-open
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8329 ((or (consp special-brace-list)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8330 (save-excursion
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8331 (goto-char beg-of-same-or-containing-stmt)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8332 (c-syntactic-re-search-forward "=\\([^=]\\|$\\)"
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8333 indent-point t t t)))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8334 ;; The most semantically accurate symbol here is
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8335 ;; brace-list-open, but we normally report it simply as a
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8336 ;; statement-cont. The reason is that one normally adjusts
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8337 ;; brace-list-open for brace lists as top-level constructs,
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8338 ;; and brace lists inside statements is a completely different
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8339 ;; context. C.f. case 5A.3.
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8340 (c-beginning-of-statement-1 containing-sexp)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8341 (c-add-stmt-syntax (if c-auto-newline-analysis
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8342 ;; Turn off the dwim above when we're
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8343 ;; analyzing the nature of the brace
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8344 ;; for the auto newline feature.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8345 'brace-list-open
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8346 'statement-cont)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8347 nil nil
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8348 containing-sexp paren-state))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8349
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8350 ;; CASE B.3: The body of a function declared inside a normal
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8351 ;; block. Can occur e.g. in Pike and when using gcc
53073
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
8352 ;; extensions, but watch out for macros followed by blocks.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8353 ;; C.f. cases E, 16F and 17G.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8354 ((and (not (c-at-statement-start-p))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8355 (eq (c-beginning-of-statement-1 containing-sexp nil nil t)
53073
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
8356 'same)
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
8357 (save-excursion
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8358 (let ((c-recognize-typeless-decls nil))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8359 ;; Turn off recognition of constructs that lacks a
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8360 ;; type in this case, since that's more likely to be
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8361 ;; a macro followed by a block.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8362 (c-forward-decl-or-cast-1 (c-point 'bosws) nil nil))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8363 (c-add-stmt-syntax 'defun-open nil t
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8364 containing-sexp paren-state))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8365
53073
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
8366 ;; CASE B.4: Continued statement with block open. The most
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
8367 ;; accurate analysis is perhaps `statement-cont' together with
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
8368 ;; `block-open' but we play DWIM and use `substatement-open'
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
8369 ;; instead. The rationaly is that this typically is a macro
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
8370 ;; followed by a block which makes it very similar to a
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
8371 ;; statement with a substatement block.
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8372 (t
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8373 (c-add-stmt-syntax 'substatement-open nil nil
53073
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
8374 containing-sexp paren-state))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8375 ))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8376
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8377 ;; CASE C: iostream insertion or extraction operator
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8378 ((and (looking-at "\\(<<\\|>>\\)\\([^=]\\|$\\)")
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8379 (save-excursion
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8380 (goto-char beg-of-same-or-containing-stmt)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8381 ;; If there is no preceding streamop in the statement
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8382 ;; then indent this line as a normal statement-cont.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8383 (when (c-syntactic-re-search-forward
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8384 "\\(<<\\|>>\\)\\([^=]\\|$\\)" indent-point 'move t t)
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8385 (c-add-syntax 'stream-op (c-point 'boi))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8386 t))))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8387
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8388 ;; CASE E: In the "K&R region" of a function declared inside a
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8389 ;; normal block. C.f. case B.3.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8390 ((and (save-excursion
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8391 ;; Check that the next token is a '{'. This works as
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8392 ;; long as no language that allows nested function
53073
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
8393 ;; definitions allows stuff like member init lists, K&R
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
8394 ;; declarations or throws clauses there.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8395 ;;
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8396 ;; Note that we do a forward search for something ahead
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8397 ;; of the indentation line here. That's not good since
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8398 ;; the user might not have typed it yet. Unfortunately
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8399 ;; it's exceedingly tricky to recognize a function
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8400 ;; prototype in a code block without resorting to this.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8401 (c-forward-syntactic-ws)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8402 (eq (char-after) ?{))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8403 (not (c-at-statement-start-p))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8404 (eq (c-beginning-of-statement-1 containing-sexp nil nil t)
53073
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
8405 'same)
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
8406 (save-excursion
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8407 (let ((c-recognize-typeless-decls nil))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8408 ;; Turn off recognition of constructs that lacks a
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8409 ;; type in this case, since that's more likely to be
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8410 ;; a macro followed by a block.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8411 (c-forward-decl-or-cast-1 (c-point 'bosws) nil nil))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8412 (c-add-stmt-syntax 'func-decl-cont nil t
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8413 containing-sexp paren-state))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8414
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8415 ;; CASE D: continued statement.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8416 (t
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8417 (c-beginning-of-statement-1 containing-sexp)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8418 (c-add-stmt-syntax 'statement-cont nil nil
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8419 containing-sexp paren-state))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8420 )))
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8421
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8422 ;; The next autoload was added by RMS on 2005/8/9 - don't know why (ACM,
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8423 ;; 2005/11/29).
64833
c4d00dfa8594 (c-guess-basic-syntax): Add autoload.
Richard M. Stallman <rms@gnu.org>
parents: 64699
diff changeset
8424 ;;;###autoload
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8425 (defun c-guess-basic-syntax ()
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8426 "Return the syntactic context of the current line."
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8427 (save-excursion
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8428 (beginning-of-line)
51829
d508ffa43505 2003-07-08 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 51714
diff changeset
8429 (c-save-buffer-state
d508ffa43505 2003-07-08 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 51714
diff changeset
8430 ((indent-point (point))
d508ffa43505 2003-07-08 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 51714
diff changeset
8431 (case-fold-search nil)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8432 ;; A whole ugly bunch of various temporary variables. Have
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8433 ;; to declare them here since it's not possible to declare
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8434 ;; a variable with only the scope of a cond test and the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8435 ;; following result clauses, and most of this function is a
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8436 ;; single gigantic cond. :P
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8437 literal char-before-ip before-ws-ip char-after-ip macro-start
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8438 in-macro-expr c-syntactic-context placeholder c-in-literal-cache
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8439 step-type tmpsymbol keyword injava-inher special-brace-list tmp-pos
106522
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
8440 containing-<
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8441 ;; The following record some positions for the containing
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8442 ;; declaration block if we're directly within one:
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8443 ;; `containing-decl-open' is the position of the open
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8444 ;; brace. `containing-decl-start' is the start of the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8445 ;; declaration. `containing-decl-kwd' is the keyword
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8446 ;; symbol of the keyword that tells what kind of block it
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8447 ;; is.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8448 containing-decl-open
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8449 containing-decl-start
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8450 containing-decl-kwd
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8451 ;; The open paren of the closest surrounding sexp or nil if
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8452 ;; there is none.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8453 containing-sexp
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8454 ;; The position after the closest preceding brace sexp
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8455 ;; (nested sexps are ignored), or the position after
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8456 ;; `containing-sexp' if there is none, or (point-min) if
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8457 ;; `containing-sexp' is nil.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8458 lim
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8459 ;; The paren state outside `containing-sexp', or at
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8460 ;; `indent-point' if `containing-sexp' is nil.
51829
d508ffa43505 2003-07-08 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 51714
diff changeset
8461 (paren-state (c-parse-state))
d508ffa43505 2003-07-08 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 51714
diff changeset
8462 ;; There's always at most one syntactic element which got
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8463 ;; an anchor pos. It's stored in syntactic-relpos.
51829
d508ffa43505 2003-07-08 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 51714
diff changeset
8464 syntactic-relpos
d508ffa43505 2003-07-08 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 51714
diff changeset
8465 (c-stmt-delim-chars c-stmt-delim-chars))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8466
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8467 ;; Check if we're directly inside an enclosing declaration
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8468 ;; level block.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8469 (when (and (setq containing-sexp
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8470 (c-most-enclosing-brace paren-state))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8471 (progn
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8472 (goto-char containing-sexp)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8473 (eq (char-after) ?{))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8474 (setq placeholder
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8475 (c-looking-at-decl-block
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8476 (c-most-enclosing-brace paren-state
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8477 containing-sexp)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8478 t)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8479 (setq containing-decl-open containing-sexp
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8480 containing-decl-start (point)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8481 containing-sexp nil)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8482 (goto-char placeholder)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8483 (setq containing-decl-kwd (and (looking-at c-keywords-regexp)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8484 (c-keyword-sym (match-string 1)))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8485
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8486 ;; Init some position variables.
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8487 (if c-state-cache
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8488 (progn
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8489 (setq containing-sexp (car paren-state)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8490 paren-state (cdr paren-state))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8491 (if (consp containing-sexp)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8492 (progn
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8493 (setq lim (cdr containing-sexp))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8494 (if (cdr c-state-cache)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8495 ;; Ignore balanced paren. The next entry
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8496 ;; can't be another one.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8497 (setq containing-sexp (car (cdr c-state-cache))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8498 paren-state (cdr paren-state))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8499 ;; If there is no surrounding open paren then
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8500 ;; put the last balanced pair back on paren-state.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8501 (setq paren-state (cons containing-sexp paren-state)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8502 containing-sexp nil)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8503 (setq lim (1+ containing-sexp))))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8504 (setq lim (point-min)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8505
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8506 ;; If we're in a parenthesis list then ',' delimits the
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8507 ;; "statements" rather than being an operator (with the
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8508 ;; exception of the "for" clause). This difference is
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8509 ;; typically only noticeable when statements are used in macro
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8510 ;; arglists.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8511 (when (and containing-sexp
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8512 (eq (char-after containing-sexp) ?\())
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8513 (setq c-stmt-delim-chars c-stmt-delim-chars-with-comma))
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8514
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8515 ;; cache char before and after indent point, and move point to
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8516 ;; the most likely position to perform the majority of tests
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8517 (goto-char indent-point)
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8518 (c-backward-syntactic-ws lim)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8519 (setq before-ws-ip (point)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8520 char-before-ip (char-before))
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8521 (goto-char indent-point)
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8522 (skip-chars-forward " \t")
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8523 (setq char-after-ip (char-after))
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8524
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8525 ;; are we in a literal?
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8526 (setq literal (c-in-literal lim))
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8527
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8528 ;; now figure out syntactic qualities of the current line
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8529 (cond
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8530
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8531 ;; CASE 1: in a string.
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8532 ((eq literal 'string)
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8533 (c-add-syntax 'string (c-point 'bopl)))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8534
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8535 ;; CASE 2: in a C or C++ style comment.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8536 ((and (memq literal '(c c++))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8537 ;; This is a kludge for XEmacs where we use
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8538 ;; `buffer-syntactic-context', which doesn't correctly
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8539 ;; recognize "\*/" to end a block comment.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8540 ;; `parse-partial-sexp' which is used by
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8541 ;; `c-literal-limits' will however do that in most
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8542 ;; versions, which results in that we get nil from
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8543 ;; `c-literal-limits' even when `c-in-literal' claims
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8544 ;; we're inside a comment.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8545 (setq placeholder (c-literal-limits lim)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8546 (c-add-syntax literal (car placeholder)))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8547
30403
68e734ab7d5d (c-looking-at-inexpr-block): Replaced a call to
Gerd Moellmann <gerd@gnu.org>
parents: 26817
diff changeset
8548 ;; CASE 3: in a cpp preprocessor macro continuation.
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8549 ((and (save-excursion
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8550 (when (c-beginning-of-macro)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8551 (setq macro-start (point))))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8552 (/= macro-start (c-point 'boi))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8553 (progn
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8554 (setq tmpsymbol 'cpp-macro-cont)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8555 (or (not c-syntactic-indentation-in-macros)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8556 (save-excursion
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8557 (goto-char macro-start)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8558 ;; If at the beginning of the body of a #define
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8559 ;; directive then analyze as cpp-define-intro
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8560 ;; only. Go on with the syntactic analysis
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8561 ;; otherwise. in-macro-expr is set if we're in a
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8562 ;; cpp expression, i.e. before the #define body
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8563 ;; or anywhere in a non-#define directive.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8564 (if (c-forward-to-cpp-define-body)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8565 (let ((indent-boi (c-point 'boi indent-point)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8566 (setq in-macro-expr (> (point) indent-boi)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8567 tmpsymbol 'cpp-define-intro)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8568 (= (point) indent-boi))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8569 (setq in-macro-expr t)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8570 nil)))))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8571 (c-add-syntax tmpsymbol macro-start)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8572 (setq macro-start nil))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8573
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8574 ;; CASE 11: an else clause?
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8575 ((looking-at "else\\>[^_]")
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8576 (c-beginning-of-statement-1 containing-sexp)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8577 (c-add-stmt-syntax 'else-clause nil t
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8578 containing-sexp paren-state))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8579
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8580 ;; CASE 12: while closure of a do/while construct?
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8581 ((and (looking-at "while\\>[^_]")
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8582 (save-excursion
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8583 (prog1 (eq (c-beginning-of-statement-1 containing-sexp)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8584 'beginning)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8585 (setq placeholder (point)))))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8586 (goto-char placeholder)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8587 (c-add-stmt-syntax 'do-while-closure nil t
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8588 containing-sexp paren-state))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8589
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8590 ;; CASE 13: A catch or finally clause? This case is simpler
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8591 ;; than if-else and do-while, because a block is required
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8592 ;; after every try, catch and finally.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8593 ((save-excursion
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8594 (and (cond ((c-major-mode-is 'c++-mode)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8595 (looking-at "catch\\>[^_]"))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8596 ((c-major-mode-is 'java-mode)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8597 (looking-at "\\(catch\\|finally\\)\\>[^_]")))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8598 (and (c-safe (c-backward-syntactic-ws)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8599 (c-backward-sexp)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8600 t)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8601 (eq (char-after) ?{)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8602 (c-safe (c-backward-syntactic-ws)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8603 (c-backward-sexp)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8604 t)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8605 (if (eq (char-after) ?\()
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8606 (c-safe (c-backward-sexp) t)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8607 t))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8608 (looking-at "\\(try\\|catch\\)\\>[^_]")
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8609 (setq placeholder (point))))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8610 (goto-char placeholder)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8611 (c-add-stmt-syntax 'catch-clause nil t
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8612 containing-sexp paren-state))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8613
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8614 ;; CASE 18: A substatement we can recognize by keyword.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8615 ((save-excursion
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8616 (and c-opt-block-stmt-key
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8617 (not (eq char-before-ip ?\;))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8618 (not (c-at-vsemi-p before-ws-ip))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8619 (not (memq char-after-ip '(?\) ?\] ?,)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8620 (or (not (eq char-before-ip ?}))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8621 (c-looking-at-inexpr-block-backward c-state-cache))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8622 (> (point)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8623 (progn
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8624 ;; Ought to cache the result from the
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8625 ;; c-beginning-of-statement-1 calls here.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8626 (setq placeholder (point))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8627 (while (eq (setq step-type
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8628 (c-beginning-of-statement-1 lim))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8629 'label))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8630 (if (eq step-type 'previous)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8631 (goto-char placeholder)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8632 (setq placeholder (point))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8633 (if (and (eq step-type 'same)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8634 (not (looking-at c-opt-block-stmt-key)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8635 ;; Step up to the containing statement if we
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8636 ;; stayed in the same one.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8637 (let (step)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8638 (while (eq
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8639 (setq step
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8640 (c-beginning-of-statement-1 lim))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8641 'label))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8642 (if (eq step 'up)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8643 (setq placeholder (point))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8644 ;; There was no containing statement afterall.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8645 (goto-char placeholder)))))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8646 placeholder))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8647 (if (looking-at c-block-stmt-2-key)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8648 ;; Require a parenthesis after these keywords.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8649 ;; Necessary to catch e.g. synchronized in Java,
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8650 ;; which can be used both as statement and
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8651 ;; modifier.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8652 (and (zerop (c-forward-token-2 1 nil))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8653 (eq (char-after) ?\())
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8654 (looking-at c-opt-block-stmt-key))))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8655
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8656 (if (eq step-type 'up)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8657 ;; CASE 18A: Simple substatement.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8658 (progn
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8659 (goto-char placeholder)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8660 (cond
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8661 ((eq char-after-ip ?{)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8662 (c-add-stmt-syntax 'substatement-open nil nil
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8663 containing-sexp paren-state))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8664 ((save-excursion
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8665 (goto-char indent-point)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8666 (back-to-indentation)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8667 (c-forward-label))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8668 (c-add-stmt-syntax 'substatement-label nil nil
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8669 containing-sexp paren-state))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8670 (t
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8671 (c-add-stmt-syntax 'substatement nil nil
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8672 containing-sexp paren-state))))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8673
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8674 ;; CASE 18B: Some other substatement. This is shared
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8675 ;; with case 10.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8676 (c-guess-continued-construct indent-point
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8677 char-after-ip
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8678 placeholder
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8679 lim
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8680 paren-state)))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8681
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8682 ;; CASE 14: A case or default label
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8683 ((looking-at c-label-kwds-regexp)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8684 (if containing-sexp
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8685 (progn
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8686 (goto-char containing-sexp)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8687 (setq lim (c-most-enclosing-brace c-state-cache
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8688 containing-sexp))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8689 (c-backward-to-block-anchor lim)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8690 (c-add-stmt-syntax 'case-label nil t lim paren-state))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8691 ;; Got a bogus label at the top level. In lack of better
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8692 ;; alternatives, anchor it on (point-min).
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8693 (c-add-syntax 'case-label (point-min))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8694
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8695 ;; CASE 15: any other label
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8696 ((save-excursion
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8697 (back-to-indentation)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8698 (and (not (looking-at c-syntactic-ws-start))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8699 (c-forward-label)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8700 (cond (containing-decl-open
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8701 (setq placeholder (c-add-class-syntax 'inclass
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8702 containing-decl-open
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8703 containing-decl-start
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8704 containing-decl-kwd
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8705 paren-state))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8706 ;; Append access-label with the same anchor point as
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8707 ;; inclass gets.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8708 (c-append-syntax 'access-label placeholder))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8709
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8710 (containing-sexp
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8711 (goto-char containing-sexp)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8712 (setq lim (c-most-enclosing-brace c-state-cache
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8713 containing-sexp))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8714 (save-excursion
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8715 (setq tmpsymbol
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8716 (if (and (eq (c-beginning-of-statement-1 lim) 'up)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8717 (looking-at "switch\\>[^_]"))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8718 ;; If the surrounding statement is a switch then
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8719 ;; let's analyze all labels as switch labels, so
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8720 ;; that they get lined up consistently.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8721 'case-label
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8722 'label)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8723 (c-backward-to-block-anchor lim)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8724 (c-add-stmt-syntax tmpsymbol nil t lim paren-state))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8725
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8726 (t
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8727 ;; A label on the top level. Treat it as a class
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8728 ;; context. (point-min) is the closest we get to the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8729 ;; class open brace.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8730 (c-add-syntax 'access-label (point-min)))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8731
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8732 ;; CASE 4: In-expression statement. C.f. cases 7B, 16A and
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8733 ;; 17E.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8734 ((setq placeholder (c-looking-at-inexpr-block
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8735 (c-safe-position containing-sexp paren-state)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8736 containing-sexp
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8737 ;; Have to turn on the heuristics after
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8738 ;; the point even though it doesn't work
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8739 ;; very well. C.f. test case class-16.pike.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8740 t))
30403
68e734ab7d5d (c-looking-at-inexpr-block): Replaced a call to
Gerd Moellmann <gerd@gnu.org>
parents: 26817
diff changeset
8741 (setq tmpsymbol (assq (car placeholder)
68e734ab7d5d (c-looking-at-inexpr-block): Replaced a call to
Gerd Moellmann <gerd@gnu.org>
parents: 26817
diff changeset
8742 '((inexpr-class . class-open)
68e734ab7d5d (c-looking-at-inexpr-block): Replaced a call to
Gerd Moellmann <gerd@gnu.org>
parents: 26817
diff changeset
8743 (inexpr-statement . block-open))))
68e734ab7d5d (c-looking-at-inexpr-block): Replaced a call to
Gerd Moellmann <gerd@gnu.org>
parents: 26817
diff changeset
8744 (if tmpsymbol
68e734ab7d5d (c-looking-at-inexpr-block): Replaced a call to
Gerd Moellmann <gerd@gnu.org>
parents: 26817
diff changeset
8745 ;; It's a statement block or an anonymous class.
68e734ab7d5d (c-looking-at-inexpr-block): Replaced a call to
Gerd Moellmann <gerd@gnu.org>
parents: 26817
diff changeset
8746 (setq tmpsymbol (cdr tmpsymbol))
68e734ab7d5d (c-looking-at-inexpr-block): Replaced a call to
Gerd Moellmann <gerd@gnu.org>
parents: 26817
diff changeset
8747 ;; It's a Pike lambda. Check whether we are between the
68e734ab7d5d (c-looking-at-inexpr-block): Replaced a call to
Gerd Moellmann <gerd@gnu.org>
parents: 26817
diff changeset
8748 ;; lambda keyword and the argument list or at the defun
68e734ab7d5d (c-looking-at-inexpr-block): Replaced a call to
Gerd Moellmann <gerd@gnu.org>
parents: 26817
diff changeset
8749 ;; opener.
68e734ab7d5d (c-looking-at-inexpr-block): Replaced a call to
Gerd Moellmann <gerd@gnu.org>
parents: 26817
diff changeset
8750 (setq tmpsymbol (if (eq char-after-ip ?{)
68e734ab7d5d (c-looking-at-inexpr-block): Replaced a call to
Gerd Moellmann <gerd@gnu.org>
parents: 26817
diff changeset
8751 'inline-open
68e734ab7d5d (c-looking-at-inexpr-block): Replaced a call to
Gerd Moellmann <gerd@gnu.org>
parents: 26817
diff changeset
8752 'lambda-intro-cont)))
68e734ab7d5d (c-looking-at-inexpr-block): Replaced a call to
Gerd Moellmann <gerd@gnu.org>
parents: 26817
diff changeset
8753 (goto-char (cdr placeholder))
36920
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
8754 (back-to-indentation)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8755 (c-add-stmt-syntax tmpsymbol nil t
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8756 (c-most-enclosing-brace c-state-cache (point))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8757 paren-state)
36920
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
8758 (unless (eq (point) (cdr placeholder))
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
8759 (c-add-syntax (car placeholder))))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8760
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8761 ;; CASE 5: Line is inside a declaration level block or at top level.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8762 ((or containing-decl-open (null containing-sexp))
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8763 (cond
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8764
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
8765 ;; CASE 5A: we are looking at a defun, brace list, class,
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
8766 ;; or inline-inclass method opening brace
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
8767 ((setq special-brace-list
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
8768 (or (and c-special-brace-lists
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
8769 (c-looking-at-special-brace-list))
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
8770 (eq char-after-ip ?{)))
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8771 (cond
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8772
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8773 ;; CASE 5A.1: Non-class declaration block open.
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8774 ((save-excursion
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8775 (let (tmp)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8776 (and (eq char-after-ip ?{)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8777 (setq tmp (c-looking-at-decl-block containing-sexp t))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8778 (progn
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8779 (setq placeholder (point))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8780 (goto-char tmp)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8781 (looking-at c-symbol-key))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8782 (c-keyword-member
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8783 (c-keyword-sym (setq keyword (match-string 0)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8784 'c-other-block-decl-kwds))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8785 (goto-char placeholder)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8786 (c-add-stmt-syntax
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8787 (if (string-equal keyword "extern")
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8788 ;; Special case for extern-lang-open.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8789 'extern-lang-open
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8790 (intern (concat keyword "-open")))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8791 nil t containing-sexp paren-state))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8792
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8793 ;; CASE 5A.2: we are looking at a class opening brace
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8794 ((save-excursion
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8795 (goto-char indent-point)
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8796 (skip-chars-forward " \t")
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8797 (and (eq (char-after) ?{)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8798 (c-looking-at-decl-block containing-sexp t)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8799 (setq placeholder (point))))
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8800 (c-add-syntax 'class-open placeholder))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8801
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8802 ;; CASE 5A.3: brace list open
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8803 ((save-excursion
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8804 (c-beginning-of-decl-1 lim)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8805 (while (looking-at c-specifier-key)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8806 (goto-char (match-end 1))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8807 (c-forward-syntactic-ws indent-point))
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8808 (setq placeholder (c-point 'boi))
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
8809 (or (consp special-brace-list)
36920
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
8810 (and (or (save-excursion
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
8811 (goto-char indent-point)
36920
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
8812 (setq tmpsymbol nil)
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
8813 (while (and (> (point) placeholder)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8814 (zerop (c-backward-token-2 1 t))
36920
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
8815 (/= (char-after) ?=))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8816 (and c-opt-inexpr-brace-list-key
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8817 (not tmpsymbol)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8818 (looking-at c-opt-inexpr-brace-list-key)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8819 (setq tmpsymbol 'topmost-intro-cont)))
36920
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
8820 (eq (char-after) ?=))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8821 (looking-at c-brace-list-key))
21106
5e5fa0a34cb0 (c-inside-bracelist-p): Fix for enum test.
Richard M. Stallman <rms@gnu.org>
parents: 20914
diff changeset
8822 (save-excursion
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
8823 (while (and (< (point) indent-point)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8824 (zerop (c-forward-token-2 1 t))
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
8825 (not (memq (char-after) '(?\; ?\()))))
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
8826 (not (memq (char-after) '(?\; ?\()))
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
8827 ))))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8828 (if (and (not c-auto-newline-analysis)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8829 (c-major-mode-is 'java-mode)
36920
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
8830 (eq tmpsymbol 'topmost-intro-cont))
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
8831 ;; We're in Java and have found that the open brace
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
8832 ;; belongs to a "new Foo[]" initialization list,
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
8833 ;; which means the brace list is part of an
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
8834 ;; expression and not a top level definition. We
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
8835 ;; therefore treat it as any topmost continuation
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
8836 ;; even though the semantically correct symbol still
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
8837 ;; is brace-list-open, on the same grounds as in
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8838 ;; case B.2.
36920
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
8839 (progn
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
8840 (c-beginning-of-statement-1 lim)
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
8841 (c-add-syntax 'topmost-intro-cont (c-point 'boi)))
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
8842 (c-add-syntax 'brace-list-open placeholder)))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8843
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8844 ;; CASE 5A.4: inline defun open
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8845 ((and containing-decl-open
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8846 (not (c-keyword-member containing-decl-kwd
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8847 'c-other-block-decl-kwds)))
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8848 (c-add-syntax 'inline-open)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8849 (c-add-class-syntax 'inclass
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8850 containing-decl-open
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8851 containing-decl-start
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8852 containing-decl-kwd
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8853 paren-state))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8854
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8855 ;; CASE 5A.5: ordinary defun open
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8856 (t
79953
6b6540ecfecf (c-guess-basic-syntax, CASE 5A.5): Anchor the "{" of a template function
Alan Mackenzie <acm@muc.de>
parents: 79943
diff changeset
8857 (save-excursion
6b6540ecfecf (c-guess-basic-syntax, CASE 5A.5): Anchor the "{" of a template function
Alan Mackenzie <acm@muc.de>
parents: 79943
diff changeset
8858 (c-beginning-of-decl-1 lim)
6b6540ecfecf (c-guess-basic-syntax, CASE 5A.5): Anchor the "{" of a template function
Alan Mackenzie <acm@muc.de>
parents: 79943
diff changeset
8859 (while (looking-at c-specifier-key)
6b6540ecfecf (c-guess-basic-syntax, CASE 5A.5): Anchor the "{" of a template function
Alan Mackenzie <acm@muc.de>
parents: 79943
diff changeset
8860 (goto-char (match-end 1))
6b6540ecfecf (c-guess-basic-syntax, CASE 5A.5): Anchor the "{" of a template function
Alan Mackenzie <acm@muc.de>
parents: 79943
diff changeset
8861 (c-forward-syntactic-ws indent-point))
6b6540ecfecf (c-guess-basic-syntax, CASE 5A.5): Anchor the "{" of a template function
Alan Mackenzie <acm@muc.de>
parents: 79943
diff changeset
8862 (c-add-syntax 'defun-open (c-point 'boi))
6b6540ecfecf (c-guess-basic-syntax, CASE 5A.5): Anchor the "{" of a template function
Alan Mackenzie <acm@muc.de>
parents: 79943
diff changeset
8863 ;; Bogus to use bol here, but it's the legacy. (Resolved,
6b6540ecfecf (c-guess-basic-syntax, CASE 5A.5): Anchor the "{" of a template function
Alan Mackenzie <acm@muc.de>
parents: 79943
diff changeset
8864 ;; 2007-11-09)
6b6540ecfecf (c-guess-basic-syntax, CASE 5A.5): Anchor the "{" of a template function
Alan Mackenzie <acm@muc.de>
parents: 79943
diff changeset
8865 ))))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8866
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8867 ;; CASE 5B: After a function header but before the body (or
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8868 ;; the ending semicolon if there's no body).
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8869 ((save-excursion
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8870 (when (setq placeholder (c-just-after-func-arglist-p lim))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8871 (setq tmp-pos (point))))
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8872 (cond
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8873
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8874 ;; CASE 5B.1: Member init list.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8875 ((eq (char-after tmp-pos) ?:)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8876 (if (or (> tmp-pos indent-point)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8877 (= (c-point 'bosws) (1+ tmp-pos)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8878 (progn
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8879 ;; There is no preceding member init clause.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8880 ;; Indent relative to the beginning of indentation
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8881 ;; for the topmost-intro line that contains the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8882 ;; prototype's open paren.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8883 (goto-char placeholder)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8884 (c-add-syntax 'member-init-intro (c-point 'boi)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8885 ;; Indent relative to the first member init clause.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8886 (goto-char (1+ tmp-pos))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8887 (c-forward-syntactic-ws)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8888 (c-add-syntax 'member-init-cont (point))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8889
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8890 ;; CASE 5B.2: K&R arg decl intro
53073
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
8891 ((and c-recognize-knr-p
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
8892 (c-in-knr-argdecl lim))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8893 (c-beginning-of-statement-1 lim)
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8894 (c-add-syntax 'knr-argdecl-intro (c-point 'boi))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8895 (if containing-decl-open
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8896 (c-add-class-syntax 'inclass
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8897 containing-decl-open
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8898 containing-decl-start
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8899 containing-decl-kwd
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8900 paren-state)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8901
30403
68e734ab7d5d (c-looking-at-inexpr-block): Replaced a call to
Gerd Moellmann <gerd@gnu.org>
parents: 26817
diff changeset
8902 ;; CASE 5B.4: Nether region after a C++ or Java func
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8903 ;; decl, which could include a `throws' declaration.
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8904 (t
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8905 (c-beginning-of-statement-1 lim)
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8906 (c-add-syntax 'func-decl-cont (c-point 'boi))
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8907 )))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8908
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8909 ;; CASE 5C: inheritance line. could be first inheritance
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8910 ;; line, or continuation of a multiple inheritance
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8911 ((or (and (c-major-mode-is 'c++-mode)
30403
68e734ab7d5d (c-looking-at-inexpr-block): Replaced a call to
Gerd Moellmann <gerd@gnu.org>
parents: 26817
diff changeset
8912 (progn
68e734ab7d5d (c-looking-at-inexpr-block): Replaced a call to
Gerd Moellmann <gerd@gnu.org>
parents: 26817
diff changeset
8913 (when (eq char-after-ip ?,)
68e734ab7d5d (c-looking-at-inexpr-block): Replaced a call to
Gerd Moellmann <gerd@gnu.org>
parents: 26817
diff changeset
8914 (skip-chars-forward " \t")
68e734ab7d5d (c-looking-at-inexpr-block): Replaced a call to
Gerd Moellmann <gerd@gnu.org>
parents: 26817
diff changeset
8915 (forward-char))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8916 (looking-at c-opt-postfix-decl-spec-key)))
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8917 (and (or (eq char-before-ip ?:)
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8918 ;; watch out for scope operator
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8919 (save-excursion
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8920 (and (eq char-after-ip ?:)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8921 (c-safe (forward-char 1) t)
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8922 (not (eq (char-after) ?:))
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8923 )))
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8924 (save-excursion
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8925 (c-backward-syntactic-ws lim)
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8926 (if (eq char-before-ip ?:)
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8927 (progn
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8928 (forward-char -1)
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8929 (c-backward-syntactic-ws lim)))
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8930 (back-to-indentation)
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8931 (looking-at c-class-key)))
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8932 ;; for Java
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
8933 (and (c-major-mode-is 'java-mode)
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8934 (let ((fence (save-excursion
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8935 (c-beginning-of-statement-1 lim)
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8936 (point)))
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8937 cont done)
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8938 (save-excursion
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8939 (while (not done)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
8940 (cond ((looking-at c-opt-postfix-decl-spec-key)
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8941 (setq injava-inher (cons cont (point))
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8942 done t))
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
8943 ((or (not (c-safe (c-forward-sexp -1) t))
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8944 (<= (point) fence))
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8945 (setq done t))
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8946 )
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8947 (setq cont t)))
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8948 injava-inher)
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8949 (not (c-crosses-statement-barrier-p (cdr injava-inher)
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8950 (point)))
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8951 ))
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8952 (cond
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8953
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8954 ;; CASE 5C.1: non-hanging colon on an inher intro
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8955 ((eq char-after-ip ?:)
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8956 (c-beginning-of-statement-1 lim)
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8957 (c-add-syntax 'inher-intro (c-point 'boi))
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8958 ;; don't add inclass symbol since relative point already
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8959 ;; contains any class offset
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8960 )
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8961
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8962 ;; CASE 5C.2: hanging colon on an inher intro
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8963 ((eq char-before-ip ?:)
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8964 (c-beginning-of-statement-1 lim)
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8965 (c-add-syntax 'inher-intro (c-point 'boi))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8966 (if containing-decl-open
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8967 (c-add-class-syntax 'inclass
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8968 containing-decl-open
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8969 containing-decl-start
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8970 containing-decl-kwd
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8971 paren-state)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8972
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8973 ;; CASE 5C.3: in a Java implements/extends
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8974 (injava-inher
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8975 (let ((where (cdr injava-inher))
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8976 (cont (car injava-inher)))
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8977 (goto-char where)
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8978 (cond ((looking-at "throws\\>[^_]")
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8979 (c-add-syntax 'func-decl-cont
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8980 (progn (c-beginning-of-statement-1 lim)
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8981 (c-point 'boi))))
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8982 (cont (c-add-syntax 'inher-cont where))
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8983 (t (c-add-syntax 'inher-intro
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8984 (progn (goto-char (cdr injava-inher))
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8985 (c-beginning-of-statement-1 lim)
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8986 (point))))
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8987 )))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8988
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8989 ;; CASE 5C.4: a continued inheritance line
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8990 (t
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8991 (c-beginning-of-inheritance-list lim)
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8992 (c-add-syntax 'inher-cont (point))
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8993 ;; don't add inclass symbol since relative point already
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8994 ;; contains any class offset
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8995 )))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
8996
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
8997 ;; CASE 5D: this could be a top-level initialization, a
26817
03befb219d03 Installed version 5.26
Gerd Moellmann <gerd@gnu.org>
parents: 25178
diff changeset
8998 ;; member init list continuation, or a template argument
03befb219d03 Installed version 5.26
Gerd Moellmann <gerd@gnu.org>
parents: 25178
diff changeset
8999 ;; list continuation.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9000 ((save-excursion
98693
69a04789c5f0 Amend several doc strings and comments.
Alan Mackenzie <acm@muc.de>
parents: 96145
diff changeset
9001 ;; Note: We use the fact that lim is always after any
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9002 ;; preceding brace sexp.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9003 (if c-recognize-<>-arglists
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9004 (while (and
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9005 (progn
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9006 (c-syntactic-skip-backward "^;,=<>" lim t)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9007 (> (point) lim))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9008 (or
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9009 (when c-overloadable-operators-regexp
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9010 (when (setq placeholder (c-after-special-operator-id lim))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9011 (goto-char placeholder)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9012 t))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9013 (cond
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9014 ((eq (char-before) ?>)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9015 (or (c-backward-<>-arglist nil lim)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9016 (backward-char))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9017 t)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9018 ((eq (char-before) ?<)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9019 (backward-char)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9020 (if (save-excursion
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9021 (c-forward-<>-arglist nil))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9022 (progn (forward-char)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9023 nil)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9024 t))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9025 (t nil)))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9026 ;; NB: No c-after-special-operator-id stuff in this
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9027 ;; clause - we assume only C++ needs it.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9028 (c-syntactic-skip-backward "^;,=" lim t))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9029 (memq (char-before) '(?, ?= ?<)))
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9030 (cond
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9031
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9032 ;; CASE 5D.3: perhaps a template list continuation?
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9033 ((and (c-major-mode-is 'c++-mode)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9034 (save-excursion
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9035 (save-restriction
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9036 (c-with-syntax-table c++-template-syntax-table
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9037 (goto-char indent-point)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9038 (setq placeholder (c-up-list-backward))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9039 (and placeholder
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9040 (eq (char-after placeholder) ?<))))))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9041 (c-with-syntax-table c++-template-syntax-table
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9042 (goto-char placeholder)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9043 (c-beginning-of-statement-1 lim t)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9044 (if (save-excursion
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9045 (c-backward-syntactic-ws lim)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9046 (eq (char-before) ?<))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9047 ;; In a nested template arglist.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9048 (progn
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9049 (goto-char placeholder)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9050 (c-syntactic-skip-backward "^,;" lim t)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9051 (c-forward-syntactic-ws))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9052 (back-to-indentation)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9053 ;; FIXME: Should use c-add-stmt-syntax, but it's not yet
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9054 ;; template aware.
106522
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
9055 (c-add-syntax 'template-args-cont (point) placeholder))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9056
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9057 ;; CASE 5D.4: perhaps a multiple inheritance line?
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9058 ((and (c-major-mode-is 'c++-mode)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9059 (save-excursion
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9060 (c-beginning-of-statement-1 lim)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9061 (setq placeholder (point))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9062 (if (looking-at "static\\>[^_]")
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9063 (c-forward-token-2 1 nil indent-point))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9064 (and (looking-at c-class-key)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9065 (zerop (c-forward-token-2 2 nil indent-point))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9066 (if (eq (char-after) ?<)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9067 (c-with-syntax-table c++-template-syntax-table
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9068 (zerop (c-forward-token-2 1 t indent-point)))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9069 t)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9070 (eq (char-after) ?:))))
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9071 (goto-char placeholder)
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9072 (c-add-syntax 'inher-cont (c-point 'boi)))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9073
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9074 ;; CASE 5D.5: Continuation of the "expression part" of a
96145
598aca8e5d9d (c-guess-basic-syntax CASE 5D.5): Fix an infinite loop on invalid syntax.
Alan Mackenzie <acm@muc.de>
parents: 94673
diff changeset
9075 ;; top level construct. Or, perhaps, an unrecognised construct.
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9076 (t
96145
598aca8e5d9d (c-guess-basic-syntax CASE 5D.5): Fix an infinite loop on invalid syntax.
Alan Mackenzie <acm@muc.de>
parents: 94673
diff changeset
9077 (while (and (setq placeholder (point))
598aca8e5d9d (c-guess-basic-syntax CASE 5D.5): Fix an infinite loop on invalid syntax.
Alan Mackenzie <acm@muc.de>
parents: 94673
diff changeset
9078 (eq (car (c-beginning-of-decl-1 containing-sexp))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9079 'same)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9080 (save-excursion
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9081 (c-backward-syntactic-ws)
96145
598aca8e5d9d (c-guess-basic-syntax CASE 5D.5): Fix an infinite loop on invalid syntax.
Alan Mackenzie <acm@muc.de>
parents: 94673
diff changeset
9082 (eq (char-before) ?}))
598aca8e5d9d (c-guess-basic-syntax CASE 5D.5): Fix an infinite loop on invalid syntax.
Alan Mackenzie <acm@muc.de>
parents: 94673
diff changeset
9083 (< (point) placeholder)))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9084 (c-add-stmt-syntax
96145
598aca8e5d9d (c-guess-basic-syntax CASE 5D.5): Fix an infinite loop on invalid syntax.
Alan Mackenzie <acm@muc.de>
parents: 94673
diff changeset
9085 (cond
598aca8e5d9d (c-guess-basic-syntax CASE 5D.5): Fix an infinite loop on invalid syntax.
Alan Mackenzie <acm@muc.de>
parents: 94673
diff changeset
9086 ((eq (point) placeholder) 'statement) ; unrecognised construct
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9087 ;; A preceding comma at the top level means that a
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9088 ;; new variable declaration starts here. Use
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9089 ;; topmost-intro-cont for it, for consistency with
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9090 ;; the first variable declaration. C.f. case 5N.
96145
598aca8e5d9d (c-guess-basic-syntax CASE 5D.5): Fix an infinite loop on invalid syntax.
Alan Mackenzie <acm@muc.de>
parents: 94673
diff changeset
9091 ((eq char-before-ip ?,) 'topmost-intro-cont)
598aca8e5d9d (c-guess-basic-syntax CASE 5D.5): Fix an infinite loop on invalid syntax.
Alan Mackenzie <acm@muc.de>
parents: 94673
diff changeset
9092 (t 'statement-cont))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9093 nil nil containing-sexp paren-state))
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9094 ))
79408
a29ca195b71e (c-crosses-statement-barrier-p): Fix typo in docstring.
Juanma Barranquero <lekktu@gmail.com>
parents: 78656
diff changeset
9095
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9096 ;; CASE 5F: Close of a non-class declaration level block.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9097 ((and (eq char-after-ip ?})
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9098 (c-keyword-member containing-decl-kwd
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9099 'c-other-block-decl-kwds))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9100 ;; This is inconsistent: Should use `containing-decl-open'
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9101 ;; here if it's at boi, like in case 5J.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9102 (goto-char containing-decl-start)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9103 (c-add-stmt-syntax
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9104 (if (string-equal (symbol-name containing-decl-kwd) "extern")
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9105 ;; Special case for compatibility with the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9106 ;; extern-lang syntactic symbols.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9107 'extern-lang-close
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9108 (intern (concat (symbol-name containing-decl-kwd)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9109 "-close")))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9110 nil t
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9111 (c-most-enclosing-brace paren-state (point))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9112 paren-state))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9113
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9114 ;; CASE 5G: we are looking at the brace which closes the
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9115 ;; enclosing nested class decl
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9116 ((and containing-sexp
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9117 (eq char-after-ip ?})
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9118 (eq containing-decl-open containing-sexp))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9119 (c-add-class-syntax 'class-close
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9120 containing-decl-open
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9121 containing-decl-start
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9122 containing-decl-kwd
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9123 paren-state))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9124
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9125 ;; CASE 5H: we could be looking at subsequent knr-argdecls
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9126 ((and c-recognize-knr-p
79838
2ec37d0d0d39 (c-guess-basic-syntax): prevent a macro call inside a struct being
Alan Mackenzie <acm@muc.de>
parents: 79717
diff changeset
9127 (not containing-sexp) ; can't be knr inside braces.
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9128 (not (eq char-before-ip ?}))
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9129 (save-excursion
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9130 (setq placeholder (cdr (c-beginning-of-decl-1 lim)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9131 (and placeholder
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9132 ;; Do an extra check to avoid tripping up on
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9133 ;; statements that occur in invalid contexts
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9134 ;; (e.g. in macro bodies where we don't really
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9135 ;; know the context of what we're looking at).
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9136 (not (and c-opt-block-stmt-key
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9137 (looking-at c-opt-block-stmt-key)))))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9138 (< placeholder indent-point))
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9139 (goto-char placeholder)
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9140 (c-add-syntax 'knr-argdecl (point)))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9141
30403
68e734ab7d5d (c-looking-at-inexpr-block): Replaced a call to
Gerd Moellmann <gerd@gnu.org>
parents: 26817
diff changeset
9142 ;; CASE 5I: ObjC method definition.
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9143 ((and c-opt-method-key
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9144 (looking-at c-opt-method-key))
62641
27b53b1903b6 2005-05-23 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 62317
diff changeset
9145 (c-beginning-of-statement-1 nil t)
27b53b1903b6 2005-05-23 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 62317
diff changeset
9146 (if (= (point) indent-point)
27b53b1903b6 2005-05-23 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 62317
diff changeset
9147 ;; Handle the case when it's the first (non-comment)
27b53b1903b6 2005-05-23 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 62317
diff changeset
9148 ;; thing in the buffer. Can't look for a 'same return
27b53b1903b6 2005-05-23 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 62317
diff changeset
9149 ;; value from cbos1 since ObjC directives currently
27b53b1903b6 2005-05-23 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 62317
diff changeset
9150 ;; aren't recognized fully, so that we get 'same
27b53b1903b6 2005-05-23 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 62317
diff changeset
9151 ;; instead of 'previous if it moved over a preceding
27b53b1903b6 2005-05-23 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 62317
diff changeset
9152 ;; directive.
27b53b1903b6 2005-05-23 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 62317
diff changeset
9153 (goto-char (point-min)))
30403
68e734ab7d5d (c-looking-at-inexpr-block): Replaced a call to
Gerd Moellmann <gerd@gnu.org>
parents: 26817
diff changeset
9154 (c-add-syntax 'objc-method-intro (c-point 'boi)))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9155
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9156 ;; CASE 5P: AWK pattern or function or continuation
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9157 ;; thereof.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9158 ((c-major-mode-is 'awk-mode)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9159 (setq placeholder (point))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9160 (c-add-stmt-syntax
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9161 (if (and (eq (c-beginning-of-statement-1) 'same)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9162 (/= (point) placeholder))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9163 'topmost-intro-cont
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9164 'topmost-intro)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9165 nil nil
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9166 containing-sexp paren-state))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9167
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9168 ;; CASE 5N: At a variable declaration that follows a class
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9169 ;; definition or some other block declaration that doesn't
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9170 ;; end at the closing '}'. C.f. case 5D.5.
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9171 ((progn
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9172 (c-backward-syntactic-ws lim)
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9173 (and (eq (char-before) ?})
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9174 (save-excursion
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9175 (let ((start (point)))
75027
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
9176 (if (and c-state-cache
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
9177 (consp (car c-state-cache))
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
9178 (eq (cdar c-state-cache) (point)))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9179 ;; Speed up the backward search a bit.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9180 (goto-char (caar c-state-cache)))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9181 (c-beginning-of-decl-1 containing-sexp)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9182 (setq placeholder (point))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9183 (if (= start (point))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9184 ;; The '}' is unbalanced.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9185 nil
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9186 (c-end-of-decl-1)
52107
3a5379a0d7f3 2003-08-01 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 51947
diff changeset
9187 (>= (point) indent-point))))))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9188 (goto-char placeholder)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9189 (c-add-stmt-syntax 'topmost-intro-cont nil nil
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9190 containing-sexp paren-state))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9191
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9192 ;; NOTE: The point is at the end of the previous token here.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9193
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9194 ;; CASE 5J: we are at the topmost level, make
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9195 ;; sure we skip back past any access specifiers
75027
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
9196 ((and
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
9197 ;; A macro continuation line is never at top level.
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
9198 (not (and macro-start
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
9199 (> indent-point macro-start)))
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
9200 (save-excursion
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
9201 (setq placeholder (point))
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
9202 (or (memq char-before-ip '(?\; ?{ ?} nil))
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
9203 (c-at-vsemi-p before-ws-ip)
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
9204 (when (and (eq char-before-ip ?:)
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
9205 (eq (c-beginning-of-statement-1 lim)
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
9206 'label))
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
9207 (c-backward-syntactic-ws lim)
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
9208 (setq placeholder (point)))
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
9209 (and (c-major-mode-is 'objc-mode)
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
9210 (catch 'not-in-directive
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
9211 (c-beginning-of-statement-1 lim)
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
9212 (setq placeholder (point))
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
9213 (while (and (c-forward-objc-directive)
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
9214 (< (point) indent-point))
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
9215 (c-forward-syntactic-ws)
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
9216 (if (>= (point) indent-point)
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
9217 (throw 'not-in-directive t))
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
9218 (setq placeholder (point)))
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
9219 nil)))))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9220 ;; For historic reasons we anchor at bol of the last
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9221 ;; line of the previous declaration. That's clearly
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9222 ;; highly bogus and useless, and it makes our lives hard
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9223 ;; to remain compatible. :P
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9224 (goto-char placeholder)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9225 (c-add-syntax 'topmost-intro (c-point 'bol))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9226 (if containing-decl-open
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9227 (if (c-keyword-member containing-decl-kwd
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9228 'c-other-block-decl-kwds)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9229 (progn
78656
b3cad8795b91 (c-brace-anchor-point): new function. (c-add-stmt-syntax): Give accurate
Alan Mackenzie <acm@muc.de>
parents: 78487
diff changeset
9230 (goto-char (c-brace-anchor-point containing-decl-open))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9231 (c-add-stmt-syntax
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9232 (if (string-equal (symbol-name containing-decl-kwd)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9233 "extern")
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9234 ;; Special case for compatibility with the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9235 ;; extern-lang syntactic symbols.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9236 'inextern-lang
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9237 (intern (concat "in"
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9238 (symbol-name containing-decl-kwd))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9239 nil t
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9240 (c-most-enclosing-brace paren-state (point))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9241 paren-state))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9242 (c-add-class-syntax 'inclass
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9243 containing-decl-open
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9244 containing-decl-start
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9245 containing-decl-kwd
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9246 paren-state)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9247 (when (and c-syntactic-indentation-in-macros
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9248 macro-start
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9249 (/= macro-start (c-point 'boi indent-point)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9250 (c-add-syntax 'cpp-define-intro)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9251 (setq macro-start nil)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9252
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9253 ;; CASE 5K: we are at an ObjC method definition
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9254 ;; continuation line.
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9255 ((and c-opt-method-key
62641
27b53b1903b6 2005-05-23 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 62317
diff changeset
9256 (save-excursion
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9257 (c-beginning-of-statement-1 lim)
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9258 (beginning-of-line)
62641
27b53b1903b6 2005-05-23 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 62317
diff changeset
9259 (when (looking-at c-opt-method-key)
27b53b1903b6 2005-05-23 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 62317
diff changeset
9260 (setq placeholder (point)))))
27b53b1903b6 2005-05-23 Martin Stjernholm <bug-cc-mode@gnu.org>
Martin Stjernholm <mast@lysator.liu.se>
parents: 62317
diff changeset
9261 (c-add-syntax 'objc-method-args-cont placeholder))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9262
30403
68e734ab7d5d (c-looking-at-inexpr-block): Replaced a call to
Gerd Moellmann <gerd@gnu.org>
parents: 26817
diff changeset
9263 ;; CASE 5L: we are at the first argument of a template
26817
03befb219d03 Installed version 5.26
Gerd Moellmann <gerd@gnu.org>
parents: 25178
diff changeset
9264 ;; arglist that begins on the previous line.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9265 ((and c-recognize-<>-arglists
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9266 (eq (char-before) ?<)
106522
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
9267 (setq placeholder (1- (point)))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9268 (not (and c-overloadable-operators-regexp
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9269 (c-after-special-operator-id lim))))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9270 (c-beginning-of-statement-1 (c-safe-position (point) paren-state))
106522
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
9271 (c-add-syntax 'template-args-cont (c-point 'boi) placeholder))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9272
75027
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
9273 ;; CASE 5Q: we are at a statement within a macro.
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
9274 (macro-start
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
9275 (c-beginning-of-statement-1 containing-sexp)
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
9276 (c-add-stmt-syntax 'statement nil t containing-sexp paren-state))
9f636bd65206 Update CC Mode to version 5.31.4. The detailed changes are those
Alan Mackenzie <acm@muc.de>
parents: 74372
diff changeset
9277
30403
68e734ab7d5d (c-looking-at-inexpr-block): Replaced a call to
Gerd Moellmann <gerd@gnu.org>
parents: 26817
diff changeset
9278 ;; CASE 5M: we are at a topmost continuation line
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9279 (t
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9280 (c-beginning-of-statement-1 (c-safe-position (point) paren-state))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9281 (when (c-major-mode-is 'objc-mode)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9282 (setq placeholder (point))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9283 (while (and (c-forward-objc-directive)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9284 (< (point) indent-point))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9285 (c-forward-syntactic-ws)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9286 (setq placeholder (point)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9287 (goto-char placeholder))
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9288 (c-add-syntax 'topmost-intro-cont (c-point 'boi)))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9289 ))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9290
30403
68e734ab7d5d (c-looking-at-inexpr-block): Replaced a call to
Gerd Moellmann <gerd@gnu.org>
parents: 26817
diff changeset
9291 ;; (CASE 6 has been removed.)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9292
106522
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
9293 ;; CASE 19: line is an expression, not a statement, and is directly
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
9294 ;; contained by a template delimiter. Most likely, we are in a
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
9295 ;; template arglist within a statement. This case is based on CASE
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
9296 ;; 7. At some point in the future, we may wish to create more
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
9297 ;; syntactic symbols such as `template-intro',
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
9298 ;; `template-cont-nonempty', etc., and distinguish between them as we
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
9299 ;; do for `arglist-intro' etc. (2009-12-07).
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
9300 ((and c-recognize-<>-arglists
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
9301 (setq containing-< (c-up-list-backward indent-point containing-sexp))
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
9302 (eq (char-after containing-<) ?\<))
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
9303 (setq placeholder (c-point 'boi containing-<))
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
9304 (goto-char containing-sexp) ; Most nested Lbrace/Lparen (but not
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
9305 ; '<') before indent-point.
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
9306 (if (>= (point) placeholder)
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
9307 (progn
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
9308 (forward-char)
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
9309 (skip-chars-forward " \t"))
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
9310 (goto-char placeholder))
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
9311 (c-add-stmt-syntax 'template-args-cont (list containing-<) t
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
9312 (c-most-enclosing-brace c-state-cache (point))
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
9313 paren-state))
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
9314
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
9315
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9316 ;; CASE 7: line is an expression, not a statement. Most
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9317 ;; likely we are either in a function prototype or a function
106522
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
9318 ;; call argument list, or a template argument list.
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9319 ((not (or (and c-special-brace-lists
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9320 (save-excursion
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9321 (goto-char containing-sexp)
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9322 (c-looking-at-special-brace-list)))
106522
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
9323 (eq (char-after containing-sexp) ?{)
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
9324 (eq (char-after containing-sexp) ?<)))
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9325 (cond
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9326
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9327 ;; CASE 7A: we are looking at the arglist closing paren.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9328 ;; C.f. case 7F.
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9329 ((memq char-after-ip '(?\) ?\]))
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9330 (goto-char containing-sexp)
30403
68e734ab7d5d (c-looking-at-inexpr-block): Replaced a call to
Gerd Moellmann <gerd@gnu.org>
parents: 26817
diff changeset
9331 (setq placeholder (c-point 'boi))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9332 (if (and (c-safe (backward-up-list 1) t)
56646
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
9333 (>= (point) placeholder))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9334 (progn
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9335 (forward-char)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9336 (skip-chars-forward " \t"))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9337 (goto-char placeholder))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9338 (c-add-stmt-syntax 'arglist-close (list containing-sexp) t
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9339 (c-most-enclosing-brace paren-state (point))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9340 paren-state))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9341
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9342 ;; CASE 7B: Looking at the opening brace of an
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9343 ;; in-expression block or brace list. C.f. cases 4, 16A
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9344 ;; and 17E.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9345 ((and (eq char-after-ip ?{)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9346 (progn
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9347 (setq placeholder (c-inside-bracelist-p (point)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9348 paren-state))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9349 (if placeholder
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9350 (setq tmpsymbol '(brace-list-open . inexpr-class))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9351 (setq tmpsymbol '(block-open . inexpr-statement)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9352 placeholder
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9353 (cdr-safe (c-looking-at-inexpr-block
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9354 (c-safe-position containing-sexp
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9355 paren-state)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9356 containing-sexp)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9357 ;; placeholder is nil if it's a block directly in
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9358 ;; a function arglist. That makes us skip out of
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9359 ;; this case.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9360 )))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9361 (goto-char placeholder)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9362 (back-to-indentation)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9363 (c-add-stmt-syntax (car tmpsymbol) nil t
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9364 (c-most-enclosing-brace paren-state (point))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9365 paren-state)
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9366 (if (/= (point) placeholder)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9367 (c-add-syntax (cdr tmpsymbol))))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9368
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9369 ;; CASE 7C: we are looking at the first argument in an empty
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9370 ;; argument list. Use arglist-close if we're actually
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9371 ;; looking at a close paren or bracket.
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9372 ((memq char-before-ip '(?\( ?\[))
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9373 (goto-char containing-sexp)
30403
68e734ab7d5d (c-looking-at-inexpr-block): Replaced a call to
Gerd Moellmann <gerd@gnu.org>
parents: 26817
diff changeset
9374 (setq placeholder (c-point 'boi))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9375 (if (and (c-safe (backward-up-list 1) t)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9376 (>= (point) placeholder))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9377 (progn
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9378 (forward-char)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9379 (skip-chars-forward " \t"))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9380 (goto-char placeholder))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9381 (c-add-stmt-syntax 'arglist-intro (list containing-sexp) t
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9382 (c-most-enclosing-brace paren-state (point))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9383 paren-state))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9384
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9385 ;; CASE 7D: we are inside a conditional test clause. treat
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9386 ;; these things as statements
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9387 ((progn
20914
8f189ffad604 (c-forward-syntactic-ws, c-backward-syntactic-ws):
Richard M. Stallman <rms@gnu.org>
parents: 20142
diff changeset
9388 (goto-char containing-sexp)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9389 (and (c-safe (c-forward-sexp -1) t)
20914
8f189ffad604 (c-forward-syntactic-ws, c-backward-syntactic-ws):
Richard M. Stallman <rms@gnu.org>
parents: 20142
diff changeset
9390 (looking-at "\\<for\\>[^_]")))
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9391 (goto-char (1+ containing-sexp))
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9392 (c-forward-syntactic-ws indent-point)
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9393 (if (eq char-before-ip ?\;)
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9394 (c-add-syntax 'statement (point))
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9395 (c-add-syntax 'statement-cont (point))
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9396 ))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9397
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9398 ;; CASE 7E: maybe a continued ObjC method call. This is the
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9399 ;; case when we are inside a [] bracketed exp, and what
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9400 ;; precede the opening bracket is not an identifier.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9401 ((and c-opt-method-key
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9402 (eq (char-after containing-sexp) ?\[)
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9403 (progn
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9404 (goto-char (1- containing-sexp))
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9405 (c-backward-syntactic-ws (c-point 'bod))
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9406 (if (not (looking-at c-symbol-key))
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9407 (c-add-syntax 'objc-method-call-cont containing-sexp))
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9408 )))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9409
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9410 ;; CASE 7F: we are looking at an arglist continuation line,
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9411 ;; but the preceding argument is on the same line as the
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9412 ;; opening paren. This case includes multi-line
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9413 ;; mathematical paren groupings, but we could be on a
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9414 ;; for-list continuation line. C.f. case 7A.
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9415 ((progn
36920
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
9416 (goto-char (1+ containing-sexp))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9417 (< (save-excursion
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9418 (c-forward-syntactic-ws)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9419 (point))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9420 (c-point 'bonl)))
106522
0a0832d4518d Fix bug#5091: indentation in c++-mode.
Alan Mackenzie <acm@muc.de>
parents: 106395
diff changeset
9421 (goto-char containing-sexp) ; paren opening the arglist
30403
68e734ab7d5d (c-looking-at-inexpr-block): Replaced a call to
Gerd Moellmann <gerd@gnu.org>
parents: 26817
diff changeset
9422 (setq placeholder (c-point 'boi))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9423 (if (and (c-safe (backward-up-list 1) t)
56646
b7446b6f097d Updated CC Mode to 5.30.9.
Martin Stjernholm <mast@lysator.liu.se>
parents: 53073
diff changeset
9424 (>= (point) placeholder))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9425 (progn
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9426 (forward-char)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9427 (skip-chars-forward " \t"))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9428 (goto-char placeholder))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9429 (c-add-stmt-syntax 'arglist-cont-nonempty (list containing-sexp) t
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9430 (c-most-enclosing-brace c-state-cache (point))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9431 paren-state))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9432
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9433 ;; CASE 7G: we are looking at just a normal arglist
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9434 ;; continuation line
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9435 (t (c-forward-syntactic-ws indent-point)
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9436 (c-add-syntax 'arglist-cont (c-point 'boi)))
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9437 ))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9438
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9439 ;; CASE 8: func-local multi-inheritance line
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9440 ((and (c-major-mode-is 'c++-mode)
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9441 (save-excursion
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9442 (goto-char indent-point)
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9443 (skip-chars-forward " \t")
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9444 (looking-at c-opt-postfix-decl-spec-key)))
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9445 (goto-char indent-point)
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9446 (skip-chars-forward " \t")
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9447 (cond
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9448
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9449 ;; CASE 8A: non-hanging colon on an inher intro
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9450 ((eq char-after-ip ?:)
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9451 (c-backward-syntactic-ws lim)
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9452 (c-add-syntax 'inher-intro (c-point 'boi)))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9453
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9454 ;; CASE 8B: hanging colon on an inher intro
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9455 ((eq char-before-ip ?:)
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9456 (c-add-syntax 'inher-intro (c-point 'boi)))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9457
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9458 ;; CASE 8C: a continued inheritance line
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9459 (t
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9460 (c-beginning-of-inheritance-list lim)
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9461 (c-add-syntax 'inher-cont (point))
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9462 )))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9463
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9464 ;; CASE 9: we are inside a brace-list
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9465 ((and (not (c-major-mode-is 'awk-mode)) ; Maybe this isn't needed (ACM, 2002/3/29)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9466 (setq special-brace-list
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9467 (or (and c-special-brace-lists ;;;; ALWAYS NIL FOR AWK!!
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9468 (save-excursion
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9469 (goto-char containing-sexp)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9470 (c-looking-at-special-brace-list)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9471 (c-inside-bracelist-p containing-sexp paren-state))))
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9472 (cond
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9473
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9474 ;; CASE 9A: In the middle of a special brace list opener.
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9475 ((and (consp special-brace-list)
30403
68e734ab7d5d (c-looking-at-inexpr-block): Replaced a call to
Gerd Moellmann <gerd@gnu.org>
parents: 26817
diff changeset
9476 (save-excursion
68e734ab7d5d (c-looking-at-inexpr-block): Replaced a call to
Gerd Moellmann <gerd@gnu.org>
parents: 26817
diff changeset
9477 (goto-char containing-sexp)
68e734ab7d5d (c-looking-at-inexpr-block): Replaced a call to
Gerd Moellmann <gerd@gnu.org>
parents: 26817
diff changeset
9478 (eq (char-after) ?\())
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9479 (eq char-after-ip (car (cdr special-brace-list))))
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9480 (goto-char (car (car special-brace-list)))
26817
03befb219d03 Installed version 5.26
Gerd Moellmann <gerd@gnu.org>
parents: 25178
diff changeset
9481 (skip-chars-backward " \t")
36920
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
9482 (if (and (bolp)
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
9483 (assoc 'statement-cont
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
9484 (setq placeholder (c-guess-basic-syntax))))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9485 (setq c-syntactic-context placeholder)
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9486 (c-beginning-of-statement-1
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9487 (c-safe-position (1- containing-sexp) paren-state))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9488 (c-forward-token-2 0)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9489 (while (looking-at c-specifier-key)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9490 (goto-char (match-end 1))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9491 (c-forward-syntactic-ws))
26817
03befb219d03 Installed version 5.26
Gerd Moellmann <gerd@gnu.org>
parents: 25178
diff changeset
9492 (c-add-syntax 'brace-list-open (c-point 'boi))))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9493
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9494 ;; CASE 9B: brace-list-close brace
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9495 ((if (consp special-brace-list)
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9496 ;; Check special brace list closer.
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9497 (progn
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9498 (goto-char (car (car special-brace-list)))
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9499 (save-excursion
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9500 (goto-char indent-point)
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9501 (back-to-indentation)
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9502 (or
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9503 ;; We were between the special close char and the `)'.
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9504 (and (eq (char-after) ?\))
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9505 (eq (1+ (point)) (cdr (car special-brace-list))))
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9506 ;; We were before the special close char.
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9507 (and (eq (char-after) (cdr (cdr special-brace-list)))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9508 (zerop (c-forward-token-2))
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9509 (eq (1+ (point)) (cdr (car special-brace-list)))))))
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9510 ;; Normal brace list check.
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9511 (and (eq char-after-ip ?})
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9512 (c-safe (goto-char (c-up-list-backward (point))) t)
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9513 (= (point) containing-sexp)))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9514 (if (eq (point) (c-point 'boi))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9515 (c-add-syntax 'brace-list-close (point))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9516 (setq lim (c-most-enclosing-brace c-state-cache (point)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9517 (c-beginning-of-statement-1 lim)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9518 (c-add-stmt-syntax 'brace-list-close nil t lim paren-state)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9519
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9520 (t
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9521 ;; Prepare for the rest of the cases below by going to the
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9522 ;; token following the opening brace
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9523 (if (consp special-brace-list)
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9524 (progn
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9525 (goto-char (car (car special-brace-list)))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9526 (c-forward-token-2 1 nil indent-point))
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9527 (goto-char containing-sexp))
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9528 (forward-char)
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9529 (let ((start (point)))
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9530 (c-forward-syntactic-ws indent-point)
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9531 (goto-char (max start (c-point 'bol))))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9532 (c-skip-ws-forward indent-point)
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9533 (cond
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9534
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9535 ;; CASE 9C: we're looking at the first line in a brace-list
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9536 ((= (point) indent-point)
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9537 (if (consp special-brace-list)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9538 (goto-char (car (car special-brace-list)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9539 (goto-char containing-sexp))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9540 (if (eq (point) (c-point 'boi))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9541 (c-add-syntax 'brace-list-intro (point))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9542 (setq lim (c-most-enclosing-brace c-state-cache (point)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9543 (c-beginning-of-statement-1 lim)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9544 (c-add-stmt-syntax 'brace-list-intro nil t lim paren-state)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9545
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9546 ;; CASE 9D: this is just a later brace-list-entry or
36920
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
9547 ;; brace-entry-open
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9548 (t (if (or (eq char-after-ip ?{)
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9549 (and c-special-brace-lists
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9550 (save-excursion
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9551 (goto-char indent-point)
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9552 (c-forward-syntactic-ws (c-point 'eol))
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9553 (c-looking-at-special-brace-list (point)))))
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9554 (c-add-syntax 'brace-entry-open (point))
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9555 (c-add-syntax 'brace-list-entry (point))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9556 ))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9557 ))))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9558
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9559 ;; CASE 10: A continued statement or top level construct.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9560 ((and (not (memq char-before-ip '(?\; ?:)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9561 (not (c-at-vsemi-p before-ws-ip))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9562 (or (not (eq char-before-ip ?}))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9563 (c-looking-at-inexpr-block-backward c-state-cache))
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9564 (> (point)
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9565 (save-excursion
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9566 (c-beginning-of-statement-1 containing-sexp)
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9567 (setq placeholder (point))))
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9568 (/= placeholder containing-sexp))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9569 ;; This is shared with case 18.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9570 (c-guess-continued-construct indent-point
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9571 char-after-ip
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9572 placeholder
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9573 containing-sexp
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9574 paren-state))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9575
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9576 ;; CASE 16: block close brace, possibly closing the defun or
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9577 ;; the class
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9578 ((eq char-after-ip ?})
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9579 ;; From here on we have the next containing sexp in lim.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9580 (setq lim (c-most-enclosing-brace paren-state))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9581 (goto-char containing-sexp)
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9582 (cond
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9583
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9584 ;; CASE 16E: Closing a statement block? This catches
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9585 ;; cases where it's preceded by a statement keyword,
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9586 ;; which works even when used in an "invalid" context,
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9587 ;; e.g. a macro argument.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9588 ((c-after-conditional)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9589 (c-backward-to-block-anchor lim)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9590 (c-add-stmt-syntax 'block-close nil t lim paren-state))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9591
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9592 ;; CASE 16A: closing a lambda defun or an in-expression
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9593 ;; block? C.f. cases 4, 7B and 17E.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9594 ((setq placeholder (c-looking-at-inexpr-block
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9595 (c-safe-position containing-sexp paren-state)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9596 nil))
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9597 (setq tmpsymbol (if (eq (car placeholder) 'inlambda)
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9598 'inline-close
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9599 'block-close))
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9600 (goto-char containing-sexp)
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9601 (back-to-indentation)
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9602 (if (= containing-sexp (point))
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9603 (c-add-syntax tmpsymbol (point))
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9604 (goto-char (cdr placeholder))
36920
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
9605 (back-to-indentation)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9606 (c-add-stmt-syntax tmpsymbol nil t
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9607 (c-most-enclosing-brace paren-state (point))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9608 paren-state)
36920
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
9609 (if (/= (point) (cdr placeholder))
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
9610 (c-add-syntax (car placeholder)))))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9611
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9612 ;; CASE 16B: does this close an inline or a function in
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9613 ;; a non-class declaration level block?
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9614 ((save-excursion
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9615 (and lim
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9616 (progn
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9617 (goto-char lim)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9618 (c-looking-at-decl-block
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9619 (c-most-enclosing-brace paren-state lim)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9620 nil))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9621 (setq placeholder (point))))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9622 (c-backward-to-decl-anchor lim)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9623 (back-to-indentation)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9624 (if (save-excursion
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9625 (goto-char placeholder)
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9626 (looking-at c-other-decl-block-key))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9627 (c-add-syntax 'defun-close (point))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9628 (c-add-syntax 'inline-close (point))))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9629
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9630 ;; CASE 16F: Can be a defun-close of a function declared
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9631 ;; in a statement block, e.g. in Pike or when using gcc
53073
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
9632 ;; extensions, but watch out for macros followed by
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
9633 ;; blocks. Let it through to be handled below.
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9634 ;; C.f. cases B.3 and 17G.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9635 ((save-excursion
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9636 (and (not (c-at-statement-start-p))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9637 (eq (c-beginning-of-statement-1 lim nil nil t) 'same)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9638 (setq placeholder (point))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9639 (let ((c-recognize-typeless-decls nil))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9640 ;; Turn off recognition of constructs that
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9641 ;; lacks a type in this case, since that's more
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9642 ;; likely to be a macro followed by a block.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9643 (c-forward-decl-or-cast-1 (c-point 'bosws) nil nil))))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9644 (back-to-indentation)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9645 (if (/= (point) containing-sexp)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9646 (goto-char placeholder))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9647 (c-add-stmt-syntax 'defun-close nil t lim paren-state))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9648
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9649 ;; CASE 16C: If there is an enclosing brace then this is
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9650 ;; a block close since defun closes inside declaration
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9651 ;; level blocks have been handled above.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9652 (lim
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9653 ;; If the block is preceded by a case/switch label on
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9654 ;; the same line, we anchor at the first preceding label
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9655 ;; at boi. The default handling in c-add-stmt-syntax
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9656 ;; really fixes it better, but we do like this to keep
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9657 ;; the indentation compatible with version 5.28 and
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9658 ;; earlier. C.f. case 17H.
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9659 (while (and (/= (setq placeholder (point)) (c-point 'boi))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9660 (eq (c-beginning-of-statement-1 lim) 'label)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9661 (goto-char placeholder)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9662 (if (looking-at c-label-kwds-regexp)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9663 (c-add-syntax 'block-close (point))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9664 (goto-char containing-sexp)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9665 ;; c-backward-to-block-anchor not necessary here; those
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9666 ;; situations are handled in case 16E above.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9667 (c-add-stmt-syntax 'block-close nil t lim paren-state)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9668
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9669 ;; CASE 16D: Only top level defun close left.
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9670 (t
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9671 (goto-char containing-sexp)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9672 (c-backward-to-decl-anchor lim)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9673 (c-add-stmt-syntax 'defun-close nil nil
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9674 (c-most-enclosing-brace paren-state)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9675 paren-state))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9676 ))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9677
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9678 ;; CASE 17: Statement or defun catchall.
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9679 (t
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9680 (goto-char indent-point)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9681 ;; Back up statements until we find one that starts at boi.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9682 (while (let* ((prev-point (point))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9683 (last-step-type (c-beginning-of-statement-1
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9684 containing-sexp)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9685 (if (= (point) prev-point)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9686 (progn
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9687 (setq step-type (or step-type last-step-type))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9688 nil)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9689 (setq step-type last-step-type)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9690 (/= (point) (c-point 'boi)))))
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9691 (cond
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9692
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9693 ;; CASE 17B: continued statement
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9694 ((and (eq step-type 'same)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9695 (/= (point) indent-point))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9696 (c-add-stmt-syntax 'statement-cont nil nil
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9697 containing-sexp paren-state))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9698
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9699 ;; CASE 17A: After a case/default label?
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9700 ((progn
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9701 (while (and (eq step-type 'label)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9702 (not (looking-at c-label-kwds-regexp)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9703 (setq step-type
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9704 (c-beginning-of-statement-1 containing-sexp)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9705 (eq step-type 'label))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9706 (c-add-stmt-syntax (if (eq char-after-ip ?{)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9707 'statement-case-open
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9708 'statement-case-intro)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9709 nil t containing-sexp paren-state))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9710
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9711 ;; CASE 17D: any old statement
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9712 ((progn
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9713 (while (eq step-type 'label)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9714 (setq step-type
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9715 (c-beginning-of-statement-1 containing-sexp)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9716 (eq step-type 'previous))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9717 (c-add-stmt-syntax 'statement nil t
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9718 containing-sexp paren-state)
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9719 (if (eq char-after-ip ?{)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9720 (c-add-syntax 'block-open)))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9721
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9722 ;; CASE 17I: Inside a substatement block.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9723 ((progn
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9724 ;; The following tests are all based on containing-sexp.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9725 (goto-char containing-sexp)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9726 ;; From here on we have the next containing sexp in lim.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9727 (setq lim (c-most-enclosing-brace paren-state containing-sexp))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9728 (c-after-conditional))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9729 (c-backward-to-block-anchor lim)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9730 (c-add-stmt-syntax 'statement-block-intro nil t
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9731 lim paren-state)
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9732 (if (eq char-after-ip ?{)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9733 (c-add-syntax 'block-open)))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9734
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9735 ;; CASE 17E: first statement in an in-expression block.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9736 ;; C.f. cases 4, 7B and 16A.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9737 ((setq placeholder (c-looking-at-inexpr-block
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9738 (c-safe-position containing-sexp paren-state)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9739 nil))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9740 (setq tmpsymbol (if (eq (car placeholder) 'inlambda)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9741 'defun-block-intro
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9742 'statement-block-intro))
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9743 (back-to-indentation)
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9744 (if (= containing-sexp (point))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9745 (c-add-syntax tmpsymbol (point))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9746 (goto-char (cdr placeholder))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9747 (back-to-indentation)
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9748 (c-add-stmt-syntax tmpsymbol nil t
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9749 (c-most-enclosing-brace c-state-cache (point))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9750 paren-state)
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9751 (if (/= (point) (cdr placeholder))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9752 (c-add-syntax (car placeholder))))
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9753 (if (eq char-after-ip ?{)
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9754 (c-add-syntax 'block-open)))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9755
24282
5b0864259a4b Installed CC Mode 5.25.
Barry A. Warsaw <barry@zope.org>
parents: 21106
diff changeset
9756 ;; CASE 17F: first statement in an inline, or first
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9757 ;; statement in a top-level defun. we can tell this is it
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9758 ;; if there are no enclosing braces that haven't been
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9759 ;; narrowed out by a class (i.e. don't use bod here).
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9760 ((save-excursion
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9761 (or (not (setq placeholder (c-most-enclosing-brace
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9762 paren-state)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9763 (and (progn
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9764 (goto-char placeholder)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9765 (eq (char-after) ?{))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9766 (c-looking-at-decl-block (c-most-enclosing-brace
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9767 paren-state (point))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9768 nil))))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9769 (c-backward-to-decl-anchor lim)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9770 (back-to-indentation)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9771 (c-add-syntax 'defun-block-intro (point)))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9772
30403
68e734ab7d5d (c-looking-at-inexpr-block): Replaced a call to
Gerd Moellmann <gerd@gnu.org>
parents: 26817
diff changeset
9773 ;; CASE 17G: First statement in a function declared inside
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9774 ;; a normal block. This can occur in Pike and with
53073
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
9775 ;; e.g. the gcc extensions, but watch out for macros
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
9776 ;; followed by blocks. C.f. cases B.3 and 16F.
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9777 ((save-excursion
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9778 (and (not (c-at-statement-start-p))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9779 (eq (c-beginning-of-statement-1 lim nil nil t) 'same)
53073
49f65e04ba8e CC Mode update (5.30.8).
Martin Stjernholm <mast@lysator.liu.se>
parents: 52605
diff changeset
9780 (setq placeholder (point))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9781 (let ((c-recognize-typeless-decls nil))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9782 ;; Turn off recognition of constructs that lacks
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9783 ;; a type in this case, since that's more likely
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9784 ;; to be a macro followed by a block.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9785 (c-forward-decl-or-cast-1 (c-point 'bosws) nil nil))))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9786 (back-to-indentation)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9787 (if (/= (point) containing-sexp)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9788 (goto-char placeholder))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9789 (c-add-stmt-syntax 'defun-block-intro nil t
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9790 lim paren-state))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9791
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9792 ;; CASE 17H: First statement in a block.
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9793 (t
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9794 ;; If the block is preceded by a case/switch label on the
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9795 ;; same line, we anchor at the first preceding label at
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9796 ;; boi. The default handling in c-add-stmt-syntax is
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9797 ;; really fixes it better, but we do like this to keep the
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9798 ;; indentation compatible with version 5.28 and earlier.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9799 ;; C.f. case 16C.
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9800 (while (and (/= (setq placeholder (point)) (c-point 'boi))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9801 (eq (c-beginning-of-statement-1 lim) 'label)))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9802 (goto-char placeholder)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9803 (if (looking-at c-label-kwds-regexp)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9804 (c-add-syntax 'statement-block-intro (point))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9805 (goto-char containing-sexp)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9806 ;; c-backward-to-block-anchor not necessary here; those
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9807 ;; situations are handled in case 17I above.
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9808 (c-add-stmt-syntax 'statement-block-intro nil t
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9809 lim paren-state))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9810 (if (eq char-after-ip ?{)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9811 (c-add-syntax 'block-open)))
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9812 ))
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9813 )
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9814
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9815 ;; now we need to look at any modifiers
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9816 (goto-char indent-point)
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9817 (skip-chars-forward " \t")
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9818
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9819 ;; are we looking at a comment only line?
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9820 (when (and (looking-at c-comment-start-regexp)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9821 (/= (c-forward-token-2 0 nil (c-point 'eol)) 0))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9822 (c-append-syntax 'comment-intro))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9823
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9824 ;; we might want to give additional offset to friends (in C++).
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9825 (when (and c-opt-friend-key
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9826 (looking-at c-opt-friend-key))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9827 (c-append-syntax 'friend))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9828
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9829 ;; Set syntactic-relpos.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9830 (let ((p c-syntactic-context))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9831 (while (and p
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9832 (if (integerp (c-langelem-pos (car p)))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9833 (progn
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9834 (setq syntactic-relpos (c-langelem-pos (car p)))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9835 nil)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9836 t))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9837 (setq p (cdr p))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9838
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9839 ;; Start of or a continuation of a preprocessor directive?
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9840 (if (and macro-start
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9841 (eq macro-start (c-point 'boi))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9842 (not (and (c-major-mode-is 'pike-mode)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9843 (eq (char-after (1+ macro-start)) ?\"))))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9844 (c-append-syntax 'cpp-macro)
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9845 (when (and c-syntactic-indentation-in-macros macro-start)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9846 (if in-macro-expr
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9847 (when (or
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9848 (< syntactic-relpos macro-start)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9849 (not (or
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9850 (assq 'arglist-intro c-syntactic-context)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9851 (assq 'arglist-cont c-syntactic-context)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9852 (assq 'arglist-cont-nonempty c-syntactic-context)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9853 (assq 'arglist-close c-syntactic-context))))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9854 ;; If inside a cpp expression, i.e. anywhere in a
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9855 ;; cpp directive except a #define body, we only let
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9856 ;; through the syntactic analysis that is internal
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9857 ;; in the expression. That means the arglist
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9858 ;; elements, if they are anchored inside the cpp
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9859 ;; expression.
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9860 (setq c-syntactic-context nil)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9861 (c-add-syntax 'cpp-macro-cont macro-start))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9862 (when (and (eq macro-start syntactic-relpos)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9863 (not (assq 'cpp-define-intro c-syntactic-context))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9864 (save-excursion
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9865 (goto-char macro-start)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9866 (or (not (c-forward-to-cpp-define-body))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9867 (<= (point) (c-point 'boi indent-point)))))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9868 ;; Inside a #define body and the syntactic analysis is
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9869 ;; anchored on the start of the #define. In this case
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9870 ;; we add cpp-define-intro to get the extra
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9871 ;; indentation of the #define body.
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9872 (c-add-syntax 'cpp-define-intro)))))
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9873
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9874 ;; return the syntax
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9875 c-syntactic-context)))
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9876
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9877
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9878 ;; Indentation calculation.
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9879
36920
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
9880 (defun c-evaluate-offset (offset langelem symbol)
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
9881 ;; offset can be a number, a function, a variable, a list, or one of
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
9882 ;; the symbols + or -
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9883 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9884 ;; This function might do hidden buffer changes.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9885 (let ((res
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9886 (cond
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9887 ((numberp offset) offset)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9888 ((vectorp offset) offset)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9889 ((null offset) nil)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9890
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9891 ((eq offset '+) c-basic-offset)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9892 ((eq offset '-) (- c-basic-offset))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9893 ((eq offset '++) (* 2 c-basic-offset))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9894 ((eq offset '--) (* 2 (- c-basic-offset)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9895 ((eq offset '*) (/ c-basic-offset 2))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9896 ((eq offset '/) (/ (- c-basic-offset) 2))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9897
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9898 ((functionp offset)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9899 (c-evaluate-offset
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9900 (funcall offset
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9901 (cons (c-langelem-sym langelem)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9902 (c-langelem-pos langelem)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9903 langelem symbol))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9904
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9905 ((listp offset)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9906 (cond
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9907 ((eq (car offset) 'quote)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9908 (c-benign-error "The offset %S for %s was mistakenly quoted"
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9909 offset symbol)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9910 nil)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9911
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9912 ((memq (car offset) '(min max))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9913 (let (res val (method (car offset)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9914 (setq offset (cdr offset))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9915 (while offset
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9916 (setq val (c-evaluate-offset (car offset) langelem symbol))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9917 (cond
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9918 ((not val))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9919 ((not res)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9920 (setq res val))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9921 ((integerp val)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9922 (if (vectorp res)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9923 (c-benign-error "\
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9924 Error evaluating offset %S for %s: \
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9925 Cannot combine absolute offset %S with relative %S in `%s' method"
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9926 (car offset) symbol res val method)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9927 (setq res (funcall method res val))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9928 (t
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9929 (if (integerp res)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9930 (c-benign-error "\
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9931 Error evaluating offset %S for %s: \
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9932 Cannot combine relative offset %S with absolute %S in `%s' method"
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9933 (car offset) symbol res val method)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9934 (setq res (vector (funcall method (aref res 0)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9935 (aref val 0)))))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9936 (setq offset (cdr offset)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9937 res))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9938
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9939 ((eq (car offset) 'add)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9940 (let (res val)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9941 (setq offset (cdr offset))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9942 (while offset
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9943 (setq val (c-evaluate-offset (car offset) langelem symbol))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9944 (cond
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9945 ((not val))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9946 ((not res)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9947 (setq res val))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9948 ((integerp val)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9949 (if (vectorp res)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9950 (setq res (vector (+ (aref res 0) val)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9951 (setq res (+ res val))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9952 (t
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9953 (if (vectorp res)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9954 (c-benign-error "\
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9955 Error evaluating offset %S for %s: \
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9956 Cannot combine absolute offsets %S and %S in `add' method"
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9957 (car offset) symbol res val)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9958 (setq res val)))) ; Override.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9959 (setq offset (cdr offset)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9960 res))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9961
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9962 (t
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9963 (let (res)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9964 (when (eq (car offset) 'first)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9965 (setq offset (cdr offset)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9966 (while (and (not res) offset)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9967 (setq res (c-evaluate-offset (car offset) langelem symbol)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9968 offset (cdr offset)))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9969 res))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9970
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9971 ((and (symbolp offset) (boundp offset))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9972 (symbol-value offset))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9973
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9974 (t
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9975 (c-benign-error "Unknown offset format %S for %s" offset symbol)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9976 nil))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9977
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9978 (if (or (null res) (integerp res)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9979 (and (vectorp res) (= (length res) 1) (integerp (aref res 0))))
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9980 res
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9981 (c-benign-error "Error evaluating offset %S for %s: Got invalid value %S"
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9982 offset symbol res)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9983 nil)))
36920
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
9984
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9985 (defun c-calc-offset (langelem)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9986 ;; Get offset from LANGELEM which is a list beginning with the
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9987 ;; syntactic symbol and followed by any analysis data it provides.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
9988 ;; That data may be zero or more elements, but if at least one is
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9989 ;; given then the first is the anchor position (or nil). The symbol
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9990 ;; is matched against `c-offsets-alist' and the offset calculated
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9991 ;; from that is returned.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9992 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9993 ;; This function might do hidden buffer changes.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
9994 (let* ((symbol (c-langelem-sym langelem))
36920
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
9995 (match (assq symbol c-offsets-alist))
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
9996 (offset (cdr-safe match)))
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9997 (if match
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9998 (setq offset (c-evaluate-offset offset langelem symbol))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
9999 (if c-strict-syntax-p
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
10000 (c-benign-error "No offset found for syntactic symbol %s" symbol))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
10001 (setq offset 0))
36920
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
10002 (if (vectorp offset)
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
10003 offset
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
10004 (or (and (numberp offset) offset)
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
10005 (and (symbolp offset) (symbol-value offset))
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
10006 0))
36920
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
10007 ))
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
10008
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
10009 (defun c-get-offset (langelem)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
10010 ;; This is a compatibility wrapper for `c-calc-offset' in case
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
10011 ;; someone is calling it directly. It takes an old style syntactic
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
10012 ;; element on the form (SYMBOL . ANCHOR-POS) and converts it to the
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
10013 ;; new list form.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
10014 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
10015 ;; This function might do hidden buffer changes.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
10016 (if (c-langelem-pos langelem)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
10017 (c-calc-offset (list (c-langelem-sym langelem)
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
10018 (c-langelem-pos langelem)))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
10019 (c-calc-offset langelem)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
10020
36920
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
10021 (defun c-get-syntactic-indentation (langelems)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
10022 ;; Calculate the syntactic indentation from a syntactic description
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
10023 ;; as returned by `c-guess-syntax'.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
10024 ;;
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
10025 ;; Note that topmost-intro always has an anchor position at bol, for
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
10026 ;; historical reasons. It's often used together with other symbols
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
10027 ;; that has more sane positions. Since we always use the first
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
10028 ;; found anchor position, we rely on that these other symbols always
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
10029 ;; precede topmost-intro in the LANGELEMS list.
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
10030 ;;
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
10031 ;; This function might do hidden buffer changes.
44728
7a3ac6c387fe CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents: 44510
diff changeset
10032 (let ((indent 0) anchor)
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
10033
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
10034 (while langelems
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
10035 (let* ((c-syntactic-element (car langelems))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
10036 (res (c-calc-offset c-syntactic-element)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
10037
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
10038 (if (vectorp res)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
10039 ;; Got an absolute column that overrides any indentation
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
10040 ;; we've collected so far, but not the relative
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
10041 ;; indentation we might get for the nested structures
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
10042 ;; further down the langelems list.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
10043 (setq indent (elt res 0)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
10044 anchor (point-min)) ; A position at column 0.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
10045
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
10046 ;; Got a relative change of the current calculated
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
10047 ;; indentation.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
10048 (setq indent (+ indent res))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
10049
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
10050 ;; Use the anchor position from the first syntactic
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
10051 ;; element with one.
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
10052 (unless anchor
67252
04d2abb755d9 Update CC Mode to release 5.31.
Alan Mackenzie <acm@muc.de>
parents: 64833
diff changeset
10053 (setq anchor (c-langelem-pos (car langelems)))))
51714
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
10054
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
10055 (setq langelems (cdr langelems))))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
10056
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
10057 (if anchor
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
10058 (+ indent (save-excursion
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
10059 (goto-char anchor)
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
10060 (current-column)))
bc91cbf50c24 Updated CC Mode to version 5.30.
Martin Stjernholm <mast@lysator.liu.se>
parents: 50273
diff changeset
10061 indent)))
26817
03befb219d03 Installed version 5.26
Gerd Moellmann <gerd@gnu.org>
parents: 25178
diff changeset
10062
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
10063
36920
32a4317c6aa5 Update to version 5.28.
Gerd Moellmann <gerd@gnu.org>
parents: 34304
diff changeset
10064 (cc-provide 'cc-engine)
38422
7a94f1c588c4 Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents: 36920
diff changeset
10065
93975
1e3a407766b9 Fix up comment convention on the arch-tag lines.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 92572
diff changeset
10066 ;; arch-tag: 149add18-4673-4da5-ac47-6805e4eae089
18720
fc6d08b9bbe2 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
10067 ;;; cc-engine.el ends here