xref: /vim-8.2.3635/runtime/syntax/c.vim (revision 17fb0e89)
1" Vim syntax file
2" Language:	C
3" Maintainer:	Bram Moolenaar <[email protected]>
4" Last Change:	2011 May 2
5
6" Quit when a (custom) syntax file was already loaded
7if exists("b:current_syntax")
8  finish
9endif
10
11" A bunch of useful C keywords
12syn keyword	cStatement	goto break return continue asm
13syn keyword	cLabel		case default
14syn keyword	cConditional	if else switch
15syn keyword	cRepeat		while for do
16
17syn keyword	cTodo		contained TODO FIXME XXX
18
19" It's easy to accidentally add a space after a backslash that was intended
20" for line continuation.  Some compilers allow it, which makes it
21" unpredicatable and should be avoided.
22syn match	cBadContinuation contained "\\\s\+$"
23
24" cCommentGroup allows adding matches for special things in comments
25syn cluster	cCommentGroup	contains=cTodo,cBadContinuation
26
27" String and Character constants
28" Highlight special characters (those which have a backslash) differently
29syn match	cSpecial	display contained "\\\(x\x\+\|\o\{1,3}\|.\|$\)"
30if !exists("c_no_utf")
31  syn match	cSpecial	display contained "\\\(u\x\{4}\|U\x\{8}\)"
32endif
33if exists("c_no_cformat")
34  syn region	cString		start=+L\="+ skip=+\\\\\|\\"+ end=+"+ contains=cSpecial,@Spell
35  " cCppString: same as cString, but ends at end of line
36  syn region	cCppString	start=+L\="+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end='$' contains=cSpecial,@Spell
37else
38  if !exists("c_no_c99") " ISO C99
39    syn match	cFormat		display "%\(\d\+\$\)\=[-+' #0*]*\(\d*\|\*\|\*\d\+\$\)\(\.\(\d*\|\*\|\*\d\+\$\)\)\=\([hlLjzt]\|ll\|hh\)\=\([aAbdiuoxXDOUfFeEgGcCsSpn]\|\[\^\=.[^]]*\]\)" contained
40  else
41    syn match	cFormat		display "%\(\d\+\$\)\=[-+' #0*]*\(\d*\|\*\|\*\d\+\$\)\(\.\(\d*\|\*\|\*\d\+\$\)\)\=\([hlL]\|ll\)\=\([bdiuoxXDOUfeEgGcCsSpn]\|\[\^\=.[^]]*\]\)" contained
42  endif
43  syn match	cFormat		display "%%" contained
44  syn region	cString		start=+L\="+ skip=+\\\\\|\\"+ end=+"+ contains=cSpecial,cFormat,@Spell
45  " cCppString: same as cString, but ends at end of line
46  syn region	cCppString	start=+L\="+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end='$' contains=cSpecial,cFormat,@Spell
47endif
48
49syn match	cCharacter	"L\='[^\\]'"
50syn match	cCharacter	"L'[^']*'" contains=cSpecial
51if exists("c_gnu")
52  syn match	cSpecialError	"L\='\\[^'\"?\\abefnrtv]'"
53  syn match	cSpecialCharacter "L\='\\['\"?\\abefnrtv]'"
54else
55  syn match	cSpecialError	"L\='\\[^'\"?\\abfnrtv]'"
56  syn match	cSpecialCharacter "L\='\\['\"?\\abfnrtv]'"
57endif
58syn match	cSpecialCharacter display "L\='\\\o\{1,3}'"
59syn match	cSpecialCharacter display "'\\x\x\{1,2}'"
60syn match	cSpecialCharacter display "L'\\x\x\+'"
61
62"when wanted, highlight trailing white space
63if exists("c_space_errors")
64  if !exists("c_no_trail_space_error")
65    syn match	cSpaceError	display excludenl "\s\+$"
66  endif
67  if !exists("c_no_tab_space_error")
68    syn match	cSpaceError	display " \+\t"me=e-1
69  endif
70endif
71
72" This should be before cErrInParen to avoid problems with #define ({ xxx })
73if exists("c_curly_error")
74  syntax match cCurlyError "}"
75  syntax region	cBlock		start="{" end="}" contains=ALLBUT,cBadBlock,cCurlyError,@cParenGroup,cErrInParen,cCppParen,cErrInBracket,cCppBracket,cCppString,@Spell fold
76else
77  syntax region	cBlock		start="{" end="}" transparent fold
78endif
79
80"catch errors caused by wrong parenthesis and brackets
81" also accept <% for {, %> for }, <: for [ and :> for ] (C99)
82" But avoid matching <::.
83syn cluster	cParenGroup	contains=cParenError,cIncluded,cSpecial,cCommentSkip,cCommentString,cComment2String,@cCommentGroup,cCommentStartError,cUserCont,cUserLabel,cBitField,cOctalZero,@cCppOutInGroup,cFormat,cNumber,cFloat,cOctal,cOctalError,cNumbersCom
84if exists("c_no_curly_error")
85  syn region	cParen		transparent start='(' end=')' end='}'me=s-1 contains=ALLBUT,cBlock,@cParenGroup,cCppParen,cCppString,@Spell
86  " cCppParen: same as cParen but ends at end-of-line; used in cDefine
87  syn region	cCppParen	transparent start='(' skip='\\$' excludenl end=')' end='$' contained contains=ALLBUT,@cParenGroup,cParen,cString,@Spell
88  syn match	cParenError	display ")"
89  syn match	cErrInParen	display contained "^[{}]\|^<%\|^%>"
90elseif exists("c_no_bracket_error")
91  syn region	cParen		transparent start='(' end=')' end='}'me=s-1 contains=ALLBUT,cBlock,@cParenGroup,cCppParen,cCppString,@Spell
92  " cCppParen: same as cParen but ends at end-of-line; used in cDefine
93  syn region	cCppParen	transparent start='(' skip='\\$' excludenl end=')' end='$' contained contains=ALLBUT,@cParenGroup,cParen,cString,@Spell
94  syn match	cParenError	display ")"
95  syn match	cErrInParen	display contained "[{}]\|<%\|%>"
96else
97  syn region	cParen		transparent start='(' end=')' end='}'me=s-1 contains=ALLBUT,cBlock,@cParenGroup,cCppParen,cErrInBracket,cCppBracket,cCppString,@Spell
98  " cCppParen: same as cParen but ends at end-of-line; used in cDefine
99  syn region	cCppParen	transparent start='(' skip='\\$' excludenl end=')' end='$' contained contains=ALLBUT,@cParenGroup,cErrInBracket,cParen,cBracket,cString,@Spell
100  syn match	cParenError	display "[\])]"
101  syn match	cErrInParen	display contained "[\]{}]\|<%\|%>"
102  syn region	cBracket	transparent start='\[\|<::\@!' end=']\|:>' end='}'me=s-1 contains=ALLBUT,cBlock,@cParenGroup,cErrInParen,cCppParen,cCppBracket,cCppString,@Spell
103  " cCppBracket: same as cParen but ends at end-of-line; used in cDefine
104  syn region	cCppBracket	transparent start='\[\|<::\@!' skip='\\$' excludenl end=']\|:>' end='$' contained contains=ALLBUT,@cParenGroup,cErrInParen,cParen,cBracket,cString,@Spell
105  syn match	cErrInBracket	display contained "[);{}]\|<%\|%>"
106endif
107
108syntax region	cBadBlock	keepend extend start="{" end="}" contained containedin=cParen,cBracket,cBadBlock transparent fold
109
110"integer number, or floating point number without a dot and with "f".
111syn case ignore
112syn match	cNumbers	display transparent "\<\d\|\.\d" contains=cNumber,cFloat,cOctalError,cOctal
113" Same, but without octal error (for comments)
114syn match	cNumbersCom	display contained transparent "\<\d\|\.\d" contains=cNumber,cFloat,cOctal
115syn match	cNumber		display contained "\d\+\(u\=l\{0,2}\|ll\=u\)\>"
116"hex number
117syn match	cNumber		display contained "0x\x\+\(u\=l\{0,2}\|ll\=u\)\>"
118" Flag the first zero of an octal number as something special
119syn match	cOctal		display contained "0\o\+\(u\=l\{0,2}\|ll\=u\)\>" contains=cOctalZero
120syn match	cOctalZero	display contained "\<0"
121syn match	cFloat		display contained "\d\+f"
122"floating point number, with dot, optional exponent
123syn match	cFloat		display contained "\d\+\.\d*\(e[-+]\=\d\+\)\=[fl]\="
124"floating point number, starting with a dot, optional exponent
125syn match	cFloat		display contained "\.\d\+\(e[-+]\=\d\+\)\=[fl]\=\>"
126"floating point number, without dot, with exponent
127syn match	cFloat		display contained "\d\+e[-+]\=\d\+[fl]\=\>"
128if !exists("c_no_c99")
129  "hexadecimal floating point number, optional leading digits, with dot, with exponent
130  syn match	cFloat		display contained "0x\x*\.\x\+p[-+]\=\d\+[fl]\=\>"
131  "hexadecimal floating point number, with leading digits, optional dot, with exponent
132  syn match	cFloat		display contained "0x\x\+\.\=p[-+]\=\d\+[fl]\=\>"
133endif
134
135" flag an octal number with wrong digits
136syn match	cOctalError	display contained "0\o*[89]\d*"
137syn case match
138
139if exists("c_comment_strings")
140  " A comment can contain cString, cCharacter and cNumber.
141  " But a "*/" inside a cString in a cComment DOES end the comment!  So we
142  " need to use a special type of cString: cCommentString, which also ends on
143  " "*/", and sees a "*" at the start of the line as comment again.
144  " Unfortunately this doesn't very well work for // type of comments :-(
145  syntax match	cCommentSkip	contained "^\s*\*\($\|\s\+\)"
146  syntax region cCommentString	contained start=+L\=\\\@<!"+ skip=+\\\\\|\\"+ end=+"+ end=+\*/+me=s-1 contains=cSpecial,cCommentSkip
147  syntax region cComment2String	contained start=+L\=\\\@<!"+ skip=+\\\\\|\\"+ end=+"+ end="$" contains=cSpecial
148  syntax region  cCommentL	start="//" skip="\\$" end="$" keepend contains=@cCommentGroup,cComment2String,cCharacter,cNumbersCom,cSpaceError,@Spell
149  if exists("c_no_comment_fold")
150    " Use "extend" here to have preprocessor lines not terminate halfway a
151    " comment.
152    syntax region cComment	matchgroup=cCommentStart start="/\*" end="\*/" contains=@cCommentGroup,cCommentStartError,cCommentString,cCharacter,cNumbersCom,cSpaceError,@Spell extend
153  else
154    syntax region cComment	matchgroup=cCommentStart start="/\*" end="\*/" contains=@cCommentGroup,cCommentStartError,cCommentString,cCharacter,cNumbersCom,cSpaceError,@Spell fold extend
155  endif
156else
157  syn region	cCommentL	start="//" skip="\\$" end="$" keepend contains=@cCommentGroup,cSpaceError,@Spell
158  if exists("c_no_comment_fold")
159    syn region	cComment	matchgroup=cCommentStart start="/\*" end="\*/" contains=@cCommentGroup,cCommentStartError,cSpaceError,@Spell extend
160  else
161    syn region	cComment	matchgroup=cCommentStart start="/\*" end="\*/" contains=@cCommentGroup,cCommentStartError,cSpaceError,@Spell fold extend
162  endif
163endif
164" keep a // comment separately, it terminates a preproc. conditional
165syntax match	cCommentError	display "\*/"
166syntax match	cCommentStartError display "/\*"me=e-1 contained
167
168syn keyword	cOperator	sizeof
169if exists("c_gnu")
170  syn keyword	cStatement	__asm__
171  syn keyword	cOperator	typeof __real__ __imag__
172endif
173syn keyword	cType		int long short char void
174syn keyword	cType		signed unsigned float double
175if !exists("c_no_ansi") || exists("c_ansi_typedefs")
176  syn keyword   cType		size_t ssize_t off_t wchar_t ptrdiff_t sig_atomic_t fpos_t
177  syn keyword   cType		clock_t time_t va_list jmp_buf FILE DIR div_t ldiv_t
178  syn keyword   cType		mbstate_t wctrans_t wint_t wctype_t
179endif
180if !exists("c_no_c99") " ISO C99
181  syn keyword	cType		bool complex
182  syn keyword	cType		int8_t int16_t int32_t int64_t
183  syn keyword	cType		uint8_t uint16_t uint32_t uint64_t
184  syn keyword	cType		int_least8_t int_least16_t int_least32_t int_least64_t
185  syn keyword	cType		uint_least8_t uint_least16_t uint_least32_t uint_least64_t
186  syn keyword	cType		int_fast8_t int_fast16_t int_fast32_t int_fast64_t
187  syn keyword	cType		uint_fast8_t uint_fast16_t uint_fast32_t uint_fast64_t
188  syn keyword	cType		intptr_t uintptr_t
189  syn keyword	cType		intmax_t uintmax_t
190endif
191if exists("c_gnu")
192  syn keyword	cType		__label__ __complex__ __volatile__
193endif
194
195syn keyword	cStructure	struct union enum typedef
196syn keyword	cStorageClass	static register auto volatile extern const
197if exists("c_gnu")
198  syn keyword	cStorageClass	inline __attribute__
199endif
200if !exists("c_no_c99")
201  syn keyword	cStorageClass	inline restrict
202endif
203
204if !exists("c_no_ansi") || exists("c_ansi_constants") || exists("c_gnu")
205  if exists("c_gnu")
206    syn keyword cConstant __GNUC__ __FUNCTION__ __PRETTY_FUNCTION__ __func__
207  endif
208  syn keyword cConstant __LINE__ __FILE__ __DATE__ __TIME__ __STDC__
209  syn keyword cConstant __STDC_VERSION__
210  syn keyword cConstant CHAR_BIT MB_LEN_MAX MB_CUR_MAX
211  syn keyword cConstant UCHAR_MAX UINT_MAX ULONG_MAX USHRT_MAX
212  syn keyword cConstant CHAR_MIN INT_MIN LONG_MIN SHRT_MIN
213  syn keyword cConstant CHAR_MAX INT_MAX LONG_MAX SHRT_MAX
214  syn keyword cConstant SCHAR_MIN SINT_MIN SLONG_MIN SSHRT_MIN
215  syn keyword cConstant SCHAR_MAX SINT_MAX SLONG_MAX SSHRT_MAX
216  if !exists("c_no_c99")
217    syn keyword cConstant __func__
218    syn keyword cConstant LLONG_MIN LLONG_MAX ULLONG_MAX
219    syn keyword cConstant INT8_MIN INT16_MIN INT32_MIN INT64_MIN
220    syn keyword cConstant INT8_MAX INT16_MAX INT32_MAX INT64_MAX
221    syn keyword cConstant UINT8_MAX UINT16_MAX UINT32_MAX UINT64_MAX
222    syn keyword cConstant INT_LEAST8_MIN INT_LEAST16_MIN INT_LEAST32_MIN INT_LEAST64_MIN
223    syn keyword cConstant INT_LEAST8_MAX INT_LEAST16_MAX INT_LEAST32_MAX INT_LEAST64_MAX
224    syn keyword cConstant UINT_LEAST8_MAX UINT_LEAST16_MAX UINT_LEAST32_MAX UINT_LEAST64_MAX
225    syn keyword cConstant INT_FAST8_MIN INT_FAST16_MIN INT_FAST32_MIN INT_FAST64_MIN
226    syn keyword cConstant INT_FAST8_MAX INT_FAST16_MAX INT_FAST32_MAX INT_FAST64_MAX
227    syn keyword cConstant UINT_FAST8_MAX UINT_FAST16_MAX UINT_FAST32_MAX UINT_FAST64_MAX
228    syn keyword cConstant INTPTR_MIN INTPTR_MAX UINTPTR_MAX
229    syn keyword cConstant INTMAX_MIN INTMAX_MAX UINTMAX_MAX
230    syn keyword cConstant PTRDIFF_MIN PTRDIFF_MAX SIG_ATOMIC_MIN SIG_ATOMIC_MAX
231    syn keyword cConstant SIZE_MAX WCHAR_MIN WCHAR_MAX WINT_MIN WINT_MAX
232  endif
233  syn keyword cConstant FLT_RADIX FLT_ROUNDS
234  syn keyword cConstant FLT_DIG FLT_MANT_DIG FLT_EPSILON
235  syn keyword cConstant DBL_DIG DBL_MANT_DIG DBL_EPSILON
236  syn keyword cConstant LDBL_DIG LDBL_MANT_DIG LDBL_EPSILON
237  syn keyword cConstant FLT_MIN FLT_MAX FLT_MIN_EXP FLT_MAX_EXP
238  syn keyword cConstant FLT_MIN_10_EXP FLT_MAX_10_EXP
239  syn keyword cConstant DBL_MIN DBL_MAX DBL_MIN_EXP DBL_MAX_EXP
240  syn keyword cConstant DBL_MIN_10_EXP DBL_MAX_10_EXP
241  syn keyword cConstant LDBL_MIN LDBL_MAX LDBL_MIN_EXP LDBL_MAX_EXP
242  syn keyword cConstant LDBL_MIN_10_EXP LDBL_MAX_10_EXP
243  syn keyword cConstant HUGE_VAL CLOCKS_PER_SEC NULL
244  syn keyword cConstant LC_ALL LC_COLLATE LC_CTYPE LC_MONETARY
245  syn keyword cConstant LC_NUMERIC LC_TIME
246  syn keyword cConstant SIG_DFL SIG_ERR SIG_IGN
247  syn keyword cConstant SIGABRT SIGFPE SIGILL SIGHUP SIGINT SIGSEGV SIGTERM
248  " Add POSIX signals as well...
249  syn keyword cConstant SIGABRT SIGALRM SIGCHLD SIGCONT SIGFPE SIGHUP
250  syn keyword cConstant SIGILL SIGINT SIGKILL SIGPIPE SIGQUIT SIGSEGV
251  syn keyword cConstant SIGSTOP SIGTERM SIGTRAP SIGTSTP SIGTTIN SIGTTOU
252  syn keyword cConstant SIGUSR1 SIGUSR2
253  syn keyword cConstant _IOFBF _IOLBF _IONBF BUFSIZ EOF WEOF
254  syn keyword cConstant FOPEN_MAX FILENAME_MAX L_tmpnam
255  syn keyword cConstant SEEK_CUR SEEK_END SEEK_SET
256  syn keyword cConstant TMP_MAX stderr stdin stdout
257  syn keyword cConstant EXIT_FAILURE EXIT_SUCCESS RAND_MAX
258  " Add POSIX errors as well
259  syn keyword cConstant E2BIG EACCES EAGAIN EBADF EBADMSG EBUSY
260  syn keyword cConstant ECANCELED ECHILD EDEADLK EDOM EEXIST EFAULT
261  syn keyword cConstant EFBIG EILSEQ EINPROGRESS EINTR EINVAL EIO EISDIR
262  syn keyword cConstant EMFILE EMLINK EMSGSIZE ENAMETOOLONG ENFILE ENODEV
263  syn keyword cConstant ENOENT ENOEXEC ENOLCK ENOMEM ENOSPC ENOSYS
264  syn keyword cConstant ENOTDIR ENOTEMPTY ENOTSUP ENOTTY ENXIO EPERM
265  syn keyword cConstant EPIPE ERANGE EROFS ESPIPE ESRCH ETIMEDOUT EXDEV
266  " math.h
267  syn keyword cConstant M_E M_LOG2E M_LOG10E M_LN2 M_LN10 M_PI M_PI_2 M_PI_4
268  syn keyword cConstant M_1_PI M_2_PI M_2_SQRTPI M_SQRT2 M_SQRT1_2
269endif
270if !exists("c_no_c99") " ISO C99
271  syn keyword cConstant true false
272endif
273
274" Accept %: for # (C99)
275syn region	cPreCondit	start="^\s*\(%:\|#\)\s*\(if\|ifdef\|ifndef\|elif\)\>" skip="\\$" end="$" keepend contains=cComment,cCommentL,cCppString,cCharacter,cCppParen,cParenError,cNumbers,cCommentError,cSpaceError
276syn match	cPreConditMatch	display "^\s*\(%:\|#\)\s*\(else\|endif\|elif\)\>"
277if !exists("c_no_if0")
278  syn cluster	cCppOutInGroup	contains=cCppInIf,cCppInElse,cCppInElse2,cCppOutIf,cCppOutIf2,cCppOutElse,cCppInSkip,cCppOutSkip
279  syn region	cCppOutWrapper	start="^\s*\(%:\|#\)\s*if\s\+0\+\s*\($\|//\|/\*\|&\)" end=".\@=\|$" contains=cCppOutIf,cCppOutElse
280  syn region	cCppOutIf	contained start="0\+" matchgroup=cCppOutWrapper end="^\s*\(%:\|#\)\s*endif\>" contains=cCppOutIf2,cCppOutElse
281  if !exists("c_no_if0_fold")
282    syn region	cCppOutIf2	contained matchgroup=cCppOutWrapper start="0\+" end="^\s*\(%:\|#\)\s*\(else\>\|elif\s\+\(0\+\s*\($\|//\|/\*\|&\)\)\@!\|endif\>\)"me=s-1 contains=cSpaceError,cCppOutSkip
283  else
284    syn region	cCppOutIf2	contained matchgroup=cCppOutWrapper start="0\+" end="^\s*\(%:\|#\)\s*\(else\>\|elif\s\+\(0\+\s*\($\|//\|/\*\|&\)\)\@!\|endif\>\)"me=s-1 contains=cSpaceError,cCppOutSkip fold
285  endif
286  syn region	cCppOutElse	contained matchgroup=cCppOutWrapper start="^\s*\(%:\|#\)\s*\(else\|elif\)" end="^\s*\(%:\|#\)\s*endif\>"me=s-1 contains=TOP,cPreCondit
287  syn region	cCppInWrapper	start="^\s*\(%:\|#\)\s*if\s\+0*[1-9]\d*\s*\($\|//\|/\*\||\)" end=".\@=\|$" contains=cCppInIf,cCppInElse
288  syn region	cCppInIf	contained matchgroup=cCppInWrapper start="\d\+" end="^\s*\(%:\|#\)\s*endif\>" contains=TOP,cPreCondit
289  if !exists("c_no_if0_fold")
290    syn region	cCppInElse	contained start="^\s*\(%:\|#\)\s*\(else\>\|elif\s\+\(0*[1-9]\d*\s*\($\|//\|/\*\||\)\)\@!\)" end=".\@=\|$" containedin=cCppInIf contains=cCppInElse2 fold
291  else
292    syn region	cCppInElse	contained start="^\s*\(%:\|#\)\s*\(else\>\|elif\s\+\(0*[1-9]\d*\s*\($\|//\|/\*\||\)\)\@!\)" end=".\@=\|$" containedin=cCppInIf contains=cCppInElse2
293  endif
294  syn region	cCppInElse2	contained matchgroup=cCppInWrapper start="^\s*\(%:\|#\)\s*\(else\|elif\)\([^/]\|/[^/*]\)*" end="^\s*\(%:\|#\)\s*endif\>"me=s-1 contains=cSpaceError,cCppOutSkip
295  syn region	cCppOutSkip	contained start="^\s*\(%:\|#\)\s*\(if\>\|ifdef\>\|ifndef\>\)" skip="\\$" end="^\s*\(%:\|#\)\s*endif\>" contains=cSpaceError,cCppOutSkip
296  syn region	cCppInSkip	contained matchgroup=cCppInWrapper start="^\s*\(%:\|#\)\s*\(if\s\+\(\d\+\s*\($\|//\|/\*\||\|&\)\)\@!\|ifdef\>\|ifndef\>\)" skip="\\$" end="^\s*\(%:\|#\)\s*endif\>" containedin=cCppOutElse,cCppInIf,cCppInSkip contains=TOP,cPreProc
297endif
298syn region	cIncluded	display contained start=+"+ skip=+\\\\\|\\"+ end=+"+
299syn match	cIncluded	display contained "<[^>]*>"
300syn match	cInclude	display "^\s*\(%:\|#\)\s*include\>\s*["<]" contains=cIncluded
301"syn match cLineSkip	"\\$"
302syn cluster	cPreProcGroup	contains=cPreCondit,cIncluded,cInclude,cDefine,cErrInParen,cErrInBracket,cUserLabel,cSpecial,cOctalZero,cCppOutWrapper,cCppInWrapper,@cCppOutInGroup,cFormat,cNumber,cFloat,cOctal,cOctalError,cNumbersCom,cString,cCommentSkip,cCommentString,cComment2String,@cCommentGroup,cCommentStartError,cParen,cBracket,cMulti
303syn region	cDefine		start="^\s*\(%:\|#\)\s*\(define\|undef\)\>" skip="\\$" end="$" keepend contains=ALLBUT,@cPreProcGroup,@Spell
304syn region	cPreProc	start="^\s*\(%:\|#\)\s*\(pragma\>\|line\>\|warning\>\|warn\>\|error\>\)" skip="\\$" end="$" keepend contains=ALLBUT,@cPreProcGroup,@Spell
305
306" Highlight User Labels
307syn cluster	cMultiGroup	contains=cIncluded,cSpecial,cCommentSkip,cCommentString,cComment2String,@cCommentGroup,cCommentStartError,cUserCont,cUserLabel,cBitField,cOctalZero,cCppOutWrapper,cCppInWrapper,@cCppOutInGroup,cFormat,cNumber,cFloat,cOctal,cOctalError,cNumbersCom,cCppParen,cCppBracket,cCppString
308syn region	cMulti		transparent start='?' skip='::' end=':' contains=ALLBUT,@cMultiGroup,@Spell
309" Avoid matching foo::bar() in C++ by requiring that the next char is not ':'
310syn cluster	cLabelGroup	contains=cUserLabel
311syn match	cUserCont	display "^\s*\I\i*\s*:$" contains=@cLabelGroup
312syn match	cUserCont	display ";\s*\I\i*\s*:$" contains=@cLabelGroup
313syn match	cUserCont	display "^\s*\I\i*\s*:[^:]"me=e-1 contains=@cLabelGroup
314syn match	cUserCont	display ";\s*\I\i*\s*:[^:]"me=e-1 contains=@cLabelGroup
315
316syn match	cUserLabel	display "\I\i*" contained
317
318" Avoid recognizing most bitfields as labels
319syn match	cBitField	display "^\s*\I\i*\s*:\s*[1-9]"me=e-1 contains=cType
320syn match	cBitField	display ";\s*\I\i*\s*:\s*[1-9]"me=e-1 contains=cType
321
322if exists("c_minlines")
323  let b:c_minlines = c_minlines
324else
325  if !exists("c_no_if0")
326    let b:c_minlines = 50	" #if 0 constructs can be long
327  else
328    let b:c_minlines = 15	" mostly for () constructs
329  endif
330endif
331if exists("c_curly_error")
332  syn sync fromstart
333else
334  exec "syn sync ccomment cComment minlines=" . b:c_minlines
335endif
336
337" Define the default highlighting.
338" Only used when an item doesn't have highlighting yet
339hi def link cFormat		cSpecial
340hi def link cCppString		cString
341hi def link cCommentL		cComment
342hi def link cCommentStart	cComment
343hi def link cLabel		Label
344hi def link cUserLabel		Label
345hi def link cConditional	Conditional
346hi def link cRepeat		Repeat
347hi def link cCharacter		Character
348hi def link cSpecialCharacter	cSpecial
349hi def link cNumber		Number
350hi def link cOctal		Number
351hi def link cOctalZero		PreProc	 " link this to Error if you want
352hi def link cFloat		Float
353hi def link cOctalError		cError
354hi def link cParenError		cError
355hi def link cErrInParen		cError
356hi def link cErrInBracket	cError
357hi def link cCommentError	cError
358hi def link cCommentStartError	cError
359hi def link cSpaceError		cError
360hi def link cSpecialError	cError
361hi def link cCurlyError		cError
362hi def link cOperator		Operator
363hi def link cStructure		Structure
364hi def link cStorageClass	StorageClass
365hi def link cInclude		Include
366hi def link cPreProc		PreProc
367hi def link cDefine		Macro
368hi def link cIncluded		cString
369hi def link cError		Error
370hi def link cStatement		Statement
371hi def link cCppInWrapper	cCppOutWrapper
372hi def link cCppOutWrapper	cPreCondit
373hi def link cPreConditMatch	cPreCondit
374hi def link cPreCondit		PreCondit
375hi def link cType		Type
376hi def link cConstant		Constant
377hi def link cCommentString	cString
378hi def link cComment2String	cString
379hi def link cCommentSkip	cComment
380hi def link cString		String
381hi def link cComment		Comment
382hi def link cSpecial		SpecialChar
383hi def link cTodo		Todo
384hi def link cBadContinuation	Error
385hi def link cCppOutSkip		cCppOutIf2
386hi def link cCppInElse2		cCppOutIf2
387hi def link cCppOutIf2		cCppOut2  " Old syntax group for #if 0 body
388hi def link cCppOut2		cCppOut  " Old syntax group for #if of #if 0
389hi def link cCppOut		Comment
390
391let b:current_syntax = "c"
392
393" vim: ts=8
394