xref: /vim-8.2.3635/runtime/syntax/c.vim (revision f573c6e1)
1" Vim syntax file
2" Language:	C
3" Maintainer:	Bram Moolenaar <[email protected]>
4" Last Change:	2021 May 24
5
6" Quit when a (custom) syntax file was already loaded
7if exists("b:current_syntax")
8  finish
9endif
10
11let s:cpo_save = &cpo
12set cpo&vim
13
14let s:ft = matchstr(&ft, '^\([^.]\)\+')
15
16" check if this was included from cpp.vim
17let s:in_cpp_family = exists("b:filetype_in_cpp_family")
18
19" Optional embedded Autodoc parsing
20" To enable it add: let g:c_autodoc = 1
21" to your .vimrc
22if exists("c_autodoc")
23  syn include @cAutodoc <sfile>:p:h/autodoc.vim
24  unlet b:current_syntax
25endif
26
27" A bunch of useful C keywords
28syn keyword	cStatement	goto break return continue asm
29syn keyword	cLabel		case default
30syn keyword	cConditional	if else switch
31syn keyword	cRepeat		while for do
32
33syn keyword	cTodo		contained TODO FIXME XXX
34
35" It's easy to accidentally add a space after a backslash that was intended
36" for line continuation.  Some compilers allow it, which makes it
37" unpredictable and should be avoided.
38syn match	cBadContinuation contained "\\\s\+$"
39
40" cCommentGroup allows adding matches for special things in comments
41syn cluster	cCommentGroup	contains=cTodo,cBadContinuation
42
43" String and Character constants
44" Highlight special characters (those which have a backslash) differently
45syn match	cSpecial	display contained "\\\(x\x\+\|\o\{1,3}\|.\|$\)"
46if !exists("c_no_utf")
47  syn match	cSpecial	display contained "\\\(u\x\{4}\|U\x\{8}\)"
48endif
49
50if !exists("c_no_cformat")
51  " Highlight % items in strings.
52  if !exists("c_no_c99") " ISO C99
53    syn match	cFormat		display "%\(\d\+\$\)\=[-+' #0*]*\(\d*\|\*\|\*\d\+\$\)\(\.\(\d*\|\*\|\*\d\+\$\)\)\=\([hlLjzt]\|ll\|hh\)\=\([aAbdiuoxXDOUfFeEgGcCsSpn]\|\[\^\=.[^]]*\]\)" contained
54  else
55    syn match	cFormat		display "%\(\d\+\$\)\=[-+' #0*]*\(\d*\|\*\|\*\d\+\$\)\(\.\(\d*\|\*\|\*\d\+\$\)\)\=\([hlL]\|ll\)\=\([bdiuoxXDOUfeEgGcCsSpn]\|\[\^\=.[^]]*\]\)" contained
56  endif
57  syn match	cFormat		display "%%" contained
58endif
59
60" cCppString: same as cString, but ends at end of line
61if s:in_cpp_family && !exists("cpp_no_cpp11") && !exists("c_no_cformat")
62  " ISO C++11
63  syn region	cString		start=+\(L\|u\|u8\|U\|R\|LR\|u8R\|uR\|UR\)\="+ skip=+\\\\\|\\"+ end=+"+ contains=cSpecial,cFormat,@Spell extend
64  syn region 	cCppString	start=+\(L\|u\|u8\|U\|R\|LR\|u8R\|uR\|UR\)\="+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end='$' contains=cSpecial,cFormat,@Spell
65elseif s:ft ==# "c" && !exists("c_no_c11") && !exists("c_no_cformat")
66  " ISO C99
67  syn region	cString		start=+\%(L\|U\|u8\)\="+ skip=+\\\\\|\\"+ end=+"+ contains=cSpecial,cFormat,@Spell extend
68  syn region	cCppString	start=+\%(L\|U\|u8\)\="+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end='$' contains=cSpecial,cFormat,@Spell
69else
70  " older C or C++
71  syn match	cFormat		display "%%" contained
72  syn region	cString		start=+L\="+ skip=+\\\\\|\\"+ end=+"+ contains=cSpecial,cFormat,@Spell extend
73  syn region	cCppString	start=+L\="+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end='$' contains=cSpecial,cFormat,@Spell
74endif
75
76syn region	cCppSkip	contained start="^\s*\(%:\|#\)\s*\(if\>\|ifdef\>\|ifndef\>\)" skip="\\$" end="^\s*\(%:\|#\)\s*endif\>" contains=cSpaceError,cCppSkip
77
78syn cluster	cStringGroup	contains=cCppString,cCppSkip
79
80syn match	cCharacter	"L\='[^\\]'"
81syn match	cCharacter	"L'[^']*'" contains=cSpecial
82if exists("c_gnu")
83  syn match	cSpecialError	"L\='\\[^'\"?\\abefnrtv]'"
84  syn match	cSpecialCharacter "L\='\\['\"?\\abefnrtv]'"
85else
86  syn match	cSpecialError	"L\='\\[^'\"?\\abfnrtv]'"
87  syn match	cSpecialCharacter "L\='\\['\"?\\abfnrtv]'"
88endif
89syn match	cSpecialCharacter display "L\='\\\o\{1,3}'"
90syn match	cSpecialCharacter display "'\\x\x\{1,2}'"
91syn match	cSpecialCharacter display "L'\\x\x\+'"
92
93if (s:ft ==# "c" && !exists("c_no_c11")) || (s:in_cpp_family && !exists("cpp_no_cpp11"))
94  " ISO C11 or ISO C++ 11
95  if exists("c_no_cformat")
96    syn region	cString		start=+\%(U\|u8\=\)"+ skip=+\\\\\|\\"+ end=+"+ contains=cSpecial,@Spell extend
97  else
98    syn region	cString		start=+\%(U\|u8\=\)"+ skip=+\\\\\|\\"+ end=+"+ contains=cSpecial,cFormat,@Spell extend
99  endif
100  syn match	cCharacter	"[Uu]'[^\\]'"
101  syn match	cCharacter	"[Uu]'[^']*'" contains=cSpecial
102  if exists("c_gnu")
103    syn match	cSpecialError	"[Uu]'\\[^'\"?\\abefnrtv]'"
104    syn match	cSpecialCharacter "[Uu]'\\['\"?\\abefnrtv]'"
105  else
106    syn match	cSpecialError	"[Uu]'\\[^'\"?\\abfnrtv]'"
107    syn match	cSpecialCharacter "[Uu]'\\['\"?\\abfnrtv]'"
108  endif
109  syn match	cSpecialCharacter display "[Uu]'\\\o\{1,3}'"
110  syn match	cSpecialCharacter display "[Uu]'\\x\x\+'"
111endif
112
113"when wanted, highlight trailing white space
114if exists("c_space_errors")
115  if !exists("c_no_trail_space_error")
116    syn match	cSpaceError	display excludenl "\s\+$"
117  endif
118  if !exists("c_no_tab_space_error")
119    syn match	cSpaceError	display " \+\t"me=e-1
120  endif
121endif
122
123" This should be before cErrInParen to avoid problems with #define ({ xxx })
124if exists("c_curly_error")
125  syn match cCurlyError "}"
126  syn region	cBlock		start="{" end="}" contains=ALLBUT,cBadBlock,cCurlyError,@cParenGroup,cErrInParen,cCppParen,cErrInBracket,cCppBracket,@cStringGroup,@Spell fold
127else
128  syn region	cBlock		start="{" end="}" transparent fold
129endif
130
131" Catch errors caused by wrong parenthesis and brackets.
132" Also accept <% for {, %> for }, <: for [ and :> for ] (C99)
133" But avoid matching <::.
134syn cluster	cParenGroup	contains=cParenError,cIncluded,cSpecial,cCommentSkip,cCommentString,cComment2String,@cCommentGroup,cCommentStartError,cUserLabel,cBitField,cOctalZero,@cCppOutInGroup,cFormat,cNumber,cFloat,cOctal,cOctalError,cNumbersCom
135if exists("c_no_curly_error")
136  if s:in_cpp_family && !exists("cpp_no_cpp11")
137    syn region	cParen		transparent start='(' end=')' contains=ALLBUT,@cParenGroup,cCppParen,@cStringGroup,@Spell
138    " cCppParen: same as cParen but ends at end-of-line; used in cDefine
139    syn region	cCppParen	transparent start='(' skip='\\$' excludenl end=')' end='$' contained contains=ALLBUT,@cParenGroup,cParen,cString,@Spell
140    syn match	cParenError	display ")"
141    syn match	cErrInParen	display contained "^^<%\|^%>"
142  else
143    syn region	cParen		transparent start='(' end=')' contains=ALLBUT,cBlock,@cParenGroup,cCppParen,@cStringGroup,@Spell
144    " cCppParen: same as cParen but ends at end-of-line; used in cDefine
145    syn region	cCppParen	transparent start='(' skip='\\$' excludenl end=')' end='$' contained contains=ALLBUT,@cParenGroup,cParen,cString,@Spell
146    syn match	cParenError	display ")"
147    syn match	cErrInParen	display contained "^[{}]\|^<%\|^%>"
148  endif
149elseif exists("c_no_bracket_error")
150  if s:in_cpp_family && !exists("cpp_no_cpp11")
151    syn region	cParen		transparent start='(' end=')' contains=ALLBUT,@cParenGroup,cCppParen,@cStringGroup,@Spell
152    " cCppParen: same as cParen but ends at end-of-line; used in cDefine
153    syn region	cCppParen	transparent start='(' skip='\\$' excludenl end=')' end='$' contained contains=ALLBUT,@cParenGroup,cParen,cString,@Spell
154    syn match	cParenError	display ")"
155    syn match	cErrInParen	display contained "<%\|%>"
156  else
157    syn region	cParen		transparent start='(' end=')' end='}'me=s-1 contains=ALLBUT,cBlock,@cParenGroup,cCppParen,@cStringGroup,@Spell
158    " cCppParen: same as cParen but ends at end-of-line; used in cDefine
159    syn region	cCppParen	transparent start='(' skip='\\$' excludenl end=')' end='$' contained contains=ALLBUT,@cParenGroup,cParen,cString,@Spell
160    syn match	cParenError	display ")"
161    syn match	cErrInParen	display contained "[{}]\|<%\|%>"
162  endif
163else
164  if s:in_cpp_family && !exists("cpp_no_cpp11")
165    syn region	cParen		transparent start='(' end=')' contains=ALLBUT,@cParenGroup,cCppParen,cErrInBracket,cCppBracket,@cStringGroup,@Spell
166    " cCppParen: same as cParen but ends at end-of-line; used in cDefine
167    syn region	cCppParen	transparent start='(' skip='\\$' excludenl end=')' end='$' contained contains=ALLBUT,@cParenGroup,cErrInBracket,cParen,cBracket,cString,@Spell
168    syn match	cParenError	display "[\])]"
169    syn match	cErrInParen	display contained "<%\|%>"
170    syn region	cBracket	transparent start='\[\|<::\@!' end=']\|:>' contains=ALLBUT,@cParenGroup,cErrInParen,cCppParen,cCppBracket,@cStringGroup,@Spell
171  else
172    syn region	cParen		transparent start='(' end=')' end='}'me=s-1 contains=ALLBUT,cBlock,@cParenGroup,cCppParen,cErrInBracket,cCppBracket,@cStringGroup,@Spell
173    " cCppParen: same as cParen but ends at end-of-line; used in cDefine
174    syn region	cCppParen	transparent start='(' skip='\\$' excludenl end=')' end='$' contained contains=ALLBUT,@cParenGroup,cErrInBracket,cParen,cBracket,cString,@Spell
175    syn match	cParenError	display "[\])]"
176    syn match	cErrInParen	display contained "[\]{}]\|<%\|%>"
177    syn region	cBracket	transparent start='\[\|<::\@!' end=']\|:>' end='}'me=s-1 contains=ALLBUT,cBlock,@cParenGroup,cErrInParen,cCppParen,cCppBracket,@cStringGroup,@Spell
178  endif
179  " cCppBracket: same as cParen but ends at end-of-line; used in cDefine
180  syn region	cCppBracket	transparent start='\[\|<::\@!' skip='\\$' excludenl end=']\|:>' end='$' contained contains=ALLBUT,@cParenGroup,cErrInParen,cParen,cBracket,cString,@Spell
181  syn match	cErrInBracket	display contained "[);{}]\|<%\|%>"
182endif
183
184if s:ft ==# 'c' || exists("cpp_no_cpp11")
185  syn region	cBadBlock	keepend start="{" end="}" contained containedin=cParen,cBracket,cBadBlock transparent fold
186endif
187
188"integer number, or floating point number without a dot and with "f".
189syn case ignore
190syn match	cNumbers	display transparent "\<\d\|\.\d" contains=cNumber,cFloat,cOctalError,cOctal
191" Same, but without octal error (for comments)
192syn match	cNumbersCom	display contained transparent "\<\d\|\.\d" contains=cNumber,cFloat,cOctal
193syn match	cNumber		display contained "\d\+\(u\=l\{0,2}\|ll\=u\)\>"
194"hex number
195syn match	cNumber		display contained "0x\x\+\(u\=l\{0,2}\|ll\=u\)\>"
196" Flag the first zero of an octal number as something special
197syn match	cOctal		display contained "0\o\+\(u\=l\{0,2}\|ll\=u\)\>" contains=cOctalZero
198syn match	cOctalZero	display contained "\<0"
199syn match	cFloat		display contained "\d\+f"
200"floating point number, with dot, optional exponent
201syn match	cFloat		display contained "\d\+\.\d*\(e[-+]\=\d\+\)\=[fl]\="
202"floating point number, starting with a dot, optional exponent
203syn match	cFloat		display contained "\.\d\+\(e[-+]\=\d\+\)\=[fl]\=\>"
204"floating point number, without dot, with exponent
205syn match	cFloat		display contained "\d\+e[-+]\=\d\+[fl]\=\>"
206if !exists("c_no_c99")
207  "hexadecimal floating point number, optional leading digits, with dot, with exponent
208  syn match	cFloat		display contained "0x\x*\.\x\+p[-+]\=\d\+[fl]\=\>"
209  "hexadecimal floating point number, with leading digits, optional dot, with exponent
210  syn match	cFloat		display contained "0x\x\+\.\=p[-+]\=\d\+[fl]\=\>"
211endif
212
213" flag an octal number with wrong digits
214syn match	cOctalError	display contained "0\o*[89]\d*"
215syn case match
216
217if exists("c_comment_strings")
218  " A comment can contain cString, cCharacter and cNumber.
219  " But a "*/" inside a cString in a cComment DOES end the comment!  So we
220  " need to use a special type of cString: cCommentString, which also ends on
221  " "*/", and sees a "*" at the start of the line as comment again.
222  " Unfortunately this doesn't very well work for // type of comments :-(
223  syn match	cCommentSkip	contained "^\s*\*\($\|\s\+\)"
224  syn region cCommentString	contained start=+L\=\\\@<!"+ skip=+\\\\\|\\"+ end=+"+ end=+\*/+me=s-1 contains=cSpecial,cCommentSkip
225  syn region cComment2String	contained start=+L\=\\\@<!"+ skip=+\\\\\|\\"+ end=+"+ end="$" contains=cSpecial
226  syn region  cCommentL	start="//" skip="\\$" end="$" keepend contains=@cCommentGroup,cComment2String,cCharacter,cNumbersCom,cSpaceError,cWrongComTail,@Spell
227  if exists("c_no_comment_fold")
228    " Use "extend" here to have preprocessor lines not terminate halfway a
229    " comment.
230    syn region cComment	matchgroup=cCommentStart start="/\*" end="\*/" contains=@cCommentGroup,cCommentStartError,cCommentString,cCharacter,cNumbersCom,cSpaceError,@Spell extend
231  else
232    syn region cComment	matchgroup=cCommentStart start="/\*" end="\*/" contains=@cCommentGroup,cCommentStartError,cCommentString,cCharacter,cNumbersCom,cSpaceError,@Spell fold extend
233  endif
234else
235  syn region	cCommentL	start="//" skip="\\$" end="$" keepend contains=@cCommentGroup,cSpaceError,@Spell
236  if exists("c_no_comment_fold")
237    syn region	cComment	matchgroup=cCommentStart start="/\*" end="\*/" contains=@cCommentGroup,cCommentStartError,cSpaceError,@Spell extend
238  else
239    syn region	cComment	matchgroup=cCommentStart start="/\*" end="\*/" contains=@cCommentGroup,cCommentStartError,cSpaceError,@Spell fold extend
240  endif
241endif
242" keep a // comment separately, it terminates a preproc. conditional
243syn match	cCommentError	display "\*/"
244syn match	cCommentStartError display "/\*"me=e-1 contained
245syn match	cWrongComTail	display "\*/"
246
247syn keyword	cOperator	sizeof
248if exists("c_gnu")
249  syn keyword	cStatement	__asm__
250  syn keyword	cOperator	typeof __real__ __imag__
251endif
252syn keyword	cType		int long short char void
253syn keyword	cType		signed unsigned float double
254if !exists("c_no_ansi") || exists("c_ansi_typedefs")
255  syn keyword   cType		size_t ssize_t off_t wchar_t ptrdiff_t sig_atomic_t fpos_t
256  syn keyword   cType		clock_t time_t va_list jmp_buf FILE DIR div_t ldiv_t
257  syn keyword   cType		mbstate_t wctrans_t wint_t wctype_t
258endif
259if !exists("c_no_c99") " ISO C99
260  syn keyword	cType		_Bool bool _Complex complex _Imaginary imaginary
261  syn keyword	cType		int8_t int16_t int32_t int64_t
262  syn keyword	cType		uint8_t uint16_t uint32_t uint64_t
263  if !exists("c_no_bsd")
264    " These are BSD specific.
265    syn keyword	cType		u_int8_t u_int16_t u_int32_t u_int64_t
266  endif
267  syn keyword	cType		int_least8_t int_least16_t int_least32_t int_least64_t
268  syn keyword	cType		uint_least8_t uint_least16_t uint_least32_t uint_least64_t
269  syn keyword	cType		int_fast8_t int_fast16_t int_fast32_t int_fast64_t
270  syn keyword	cType		uint_fast8_t uint_fast16_t uint_fast32_t uint_fast64_t
271  syn keyword	cType		intptr_t uintptr_t
272  syn keyword	cType		intmax_t uintmax_t
273endif
274if exists("c_gnu")
275  syn keyword	cType		__label__ __complex__ __volatile__
276endif
277
278syn keyword	cTypedef	typedef
279syn keyword	cStructure	struct union enum
280syn keyword	cStorageClass	static register auto volatile extern const
281if exists("c_gnu")
282  syn keyword	cStorageClass	inline __attribute__
283endif
284if !exists("c_no_c99") && !s:in_cpp_family
285  syn keyword	cStorageClass	inline restrict
286endif
287if !exists("c_no_c11")
288  syn keyword	cStorageClass	_Alignas alignas
289  syn keyword	cOperator	_Alignof alignof
290  syn keyword	cStorageClass	_Atomic
291  syn keyword	cOperator	_Generic
292  syn keyword	cStorageClass	_Noreturn noreturn
293  syn keyword	cOperator	_Static_assert static_assert
294  syn keyword	cStorageClass	_Thread_local thread_local
295  syn keyword   cType		char16_t char32_t
296  " C11 atomics (take down the shield wall!)
297  syn keyword	cType		atomic_bool atomic_char atomic_schar atomic_uchar
298  syn keyword	Ctype		atomic_short atomic_ushort atomic_int atomic_uint
299  syn keyword	cType		atomic_long atomic_ulong atomic_llong atomic_ullong
300  syn keyword	cType		atomic_char16_t atomic_char32_t atomic_wchar_t
301  syn keyword	cType		atomic_int_least8_t atomic_uint_least8_t
302  syn keyword	cType		atomic_int_least16_t atomic_uint_least16_t
303  syn keyword	cType		atomic_int_least32_t atomic_uint_least32_t
304  syn keyword	cType		atomic_int_least64_t atomic_uint_least64_t
305  syn keyword	cType		atomic_int_fast8_t atomic_uint_fast8_t
306  syn keyword	cType		atomic_int_fast16_t atomic_uint_fast16_t
307  syn keyword	cType		atomic_int_fast32_t atomic_uint_fast32_t
308  syn keyword	cType		atomic_int_fast64_t atomic_uint_fast64_t
309  syn keyword	cType		atomic_intptr_t atomic_uintptr_t
310  syn keyword	cType		atomic_size_t atomic_ptrdiff_t
311  syn keyword	cType		atomic_intmax_t atomic_uintmax_t
312endif
313
314if !exists("c_no_ansi") || exists("c_ansi_constants") || exists("c_gnu")
315  if exists("c_gnu")
316    syn keyword cConstant __GNUC__ __FUNCTION__ __PRETTY_FUNCTION__ __func__
317  endif
318  syn keyword cConstant __LINE__ __FILE__ __DATE__ __TIME__ __STDC__ __STDC_VERSION__ __STDC_HOSTED__
319  syn keyword cConstant CHAR_BIT MB_LEN_MAX MB_CUR_MAX
320  syn keyword cConstant UCHAR_MAX UINT_MAX ULONG_MAX USHRT_MAX
321  syn keyword cConstant CHAR_MIN INT_MIN LONG_MIN SHRT_MIN
322  syn keyword cConstant CHAR_MAX INT_MAX LONG_MAX SHRT_MAX
323  syn keyword cConstant SCHAR_MIN SINT_MIN SLONG_MIN SSHRT_MIN
324  syn keyword cConstant SCHAR_MAX SINT_MAX SLONG_MAX SSHRT_MAX
325  if !exists("c_no_c99")
326    syn keyword cConstant __func__ __VA_ARGS__
327    syn keyword cConstant LLONG_MIN LLONG_MAX ULLONG_MAX
328    syn keyword cConstant INT8_MIN INT16_MIN INT32_MIN INT64_MIN
329    syn keyword cConstant INT8_MAX INT16_MAX INT32_MAX INT64_MAX
330    syn keyword cConstant UINT8_MAX UINT16_MAX UINT32_MAX UINT64_MAX
331    syn keyword cConstant INT_LEAST8_MIN INT_LEAST16_MIN INT_LEAST32_MIN INT_LEAST64_MIN
332    syn keyword cConstant INT_LEAST8_MAX INT_LEAST16_MAX INT_LEAST32_MAX INT_LEAST64_MAX
333    syn keyword cConstant UINT_LEAST8_MAX UINT_LEAST16_MAX UINT_LEAST32_MAX UINT_LEAST64_MAX
334    syn keyword cConstant INT_FAST8_MIN INT_FAST16_MIN INT_FAST32_MIN INT_FAST64_MIN
335    syn keyword cConstant INT_FAST8_MAX INT_FAST16_MAX INT_FAST32_MAX INT_FAST64_MAX
336    syn keyword cConstant UINT_FAST8_MAX UINT_FAST16_MAX UINT_FAST32_MAX UINT_FAST64_MAX
337    syn keyword cConstant INTPTR_MIN INTPTR_MAX UINTPTR_MAX
338    syn keyword cConstant INTMAX_MIN INTMAX_MAX UINTMAX_MAX
339    syn keyword cConstant PTRDIFF_MIN PTRDIFF_MAX SIG_ATOMIC_MIN SIG_ATOMIC_MAX
340    syn keyword cConstant SIZE_MAX WCHAR_MIN WCHAR_MAX WINT_MIN WINT_MAX
341  endif
342  syn keyword cConstant FLT_RADIX FLT_ROUNDS FLT_DIG FLT_MANT_DIG FLT_EPSILON DBL_DIG DBL_MANT_DIG DBL_EPSILON
343  syn keyword cConstant LDBL_DIG LDBL_MANT_DIG LDBL_EPSILON FLT_MIN FLT_MAX FLT_MIN_EXP FLT_MAX_EXP FLT_MIN_10_EXP FLT_MAX_10_EXP
344  syn keyword cConstant DBL_MIN DBL_MAX DBL_MIN_EXP DBL_MAX_EXP DBL_MIN_10_EXP DBL_MAX_10_EXP LDBL_MIN LDBL_MAX LDBL_MIN_EXP LDBL_MAX_EXP
345  syn keyword cConstant LDBL_MIN_10_EXP LDBL_MAX_10_EXP HUGE_VAL CLOCKS_PER_SEC NULL LC_ALL LC_COLLATE LC_CTYPE LC_MONETARY
346  syn keyword cConstant LC_NUMERIC LC_TIME SIG_DFL SIG_ERR SIG_IGN SIGABRT SIGFPE SIGILL SIGHUP SIGINT SIGSEGV SIGTERM
347  " Add POSIX signals as well...
348  syn keyword cConstant SIGABRT SIGALRM SIGCHLD SIGCONT SIGFPE SIGHUP SIGILL SIGINT SIGKILL SIGPIPE SIGQUIT SIGSEGV
349  syn keyword cConstant SIGSTOP SIGTERM SIGTRAP SIGTSTP SIGTTIN SIGTTOU SIGUSR1 SIGUSR2
350  syn keyword cConstant _IOFBF _IOLBF _IONBF BUFSIZ EOF WEOF FOPEN_MAX FILENAME_MAX L_tmpnam
351  syn keyword cConstant SEEK_CUR SEEK_END SEEK_SET TMP_MAX stderr stdin stdout EXIT_FAILURE EXIT_SUCCESS RAND_MAX
352  " used in assert.h
353  syn keyword cConstant NDEBUG
354  " POSIX 2001
355  syn keyword cConstant SIGBUS SIGPOLL SIGPROF SIGSYS SIGURG SIGVTALRM SIGXCPU SIGXFSZ
356  " non-POSIX signals
357  syn keyword cConstant SIGWINCH SIGINFO
358  " Add POSIX errors as well.  List comes from:
359  " http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/errno.h.html
360  syn keyword cConstant E2BIG EACCES EADDRINUSE EADDRNOTAVAIL EAFNOSUPPORT EAGAIN EALREADY EBADF
361  syn keyword cConstant EBADMSG EBUSY ECANCELED ECHILD ECONNABORTED ECONNREFUSED ECONNRESET EDEADLK
362  syn keyword cConstant EDESTADDRREQ EDOM EDQUOT EEXIST EFAULT EFBIG EHOSTUNREACH EIDRM EILSEQ
363  syn keyword cConstant EINPROGRESS EINTR EINVAL EIO EISCONN EISDIR ELOOP EMFILE EMLINK EMSGSIZE
364  syn keyword cConstant EMULTIHOP ENAMETOOLONG ENETDOWN ENETRESET ENETUNREACH ENFILE ENOBUFS ENODATA
365  syn keyword cConstant ENODEV ENOENT ENOEXEC ENOLCK ENOLINK ENOMEM ENOMSG ENOPROTOOPT ENOSPC ENOSR
366  syn keyword cConstant ENOSTR ENOSYS ENOTBLK ENOTCONN ENOTDIR ENOTEMPTY ENOTRECOVERABLE ENOTSOCK ENOTSUP
367  syn keyword cConstant ENOTTY ENXIO EOPNOTSUPP EOVERFLOW EOWNERDEAD EPERM EPIPE EPROTO
368  syn keyword cConstant EPROTONOSUPPORT EPROTOTYPE ERANGE EROFS ESPIPE ESRCH ESTALE ETIME ETIMEDOUT
369  syn keyword cConstant ETXTBSY EWOULDBLOCK EXDEV
370  " math.h
371  syn keyword cConstant M_E M_LOG2E M_LOG10E M_LN2 M_LN10 M_PI M_PI_2 M_PI_4
372  syn keyword cConstant M_1_PI M_2_PI M_2_SQRTPI M_SQRT2 M_SQRT1_2
373endif
374if !exists("c_no_c99") " ISO C99
375  syn keyword cConstant true false
376endif
377
378" Accept %: for # (C99)
379syn region	cPreCondit	start="^\s*\zs\(%:\|#\)\s*\(if\|ifdef\|ifndef\|elif\)\>" skip="\\$" end="$" keepend contains=cComment,cCommentL,cCppString,cCharacter,cCppParen,cParenError,cNumbers,cCommentError,cSpaceError
380syn match	cPreConditMatch	display "^\s*\zs\(%:\|#\)\s*\(else\|endif\)\>"
381if !exists("c_no_if0")
382  syn cluster	cCppOutInGroup	contains=cCppInIf,cCppInElse,cCppInElse2,cCppOutIf,cCppOutIf2,cCppOutElse,cCppInSkip,cCppOutSkip
383  syn region	cCppOutWrapper	start="^\s*\zs\(%:\|#\)\s*if\s\+0\+\s*\($\|//\|/\*\|&\)" end=".\@=\|$" contains=cCppOutIf,cCppOutElse,@NoSpell fold
384  syn region	cCppOutIf	contained start="0\+" matchgroup=cCppOutWrapper end="^\s*\(%:\|#\)\s*endif\>" contains=cCppOutIf2,cCppOutElse
385  if !exists("c_no_if0_fold")
386    syn region	cCppOutIf2	contained matchgroup=cCppOutWrapper start="0\+" end="^\s*\(%:\|#\)\s*\(else\>\|elif\s\+\(0\+\s*\($\|//\|/\*\|&\)\)\@!\|endif\>\)"me=s-1 contains=cSpaceError,cCppOutSkip,@Spell fold
387  else
388    syn region	cCppOutIf2	contained matchgroup=cCppOutWrapper start="0\+" end="^\s*\(%:\|#\)\s*\(else\>\|elif\s\+\(0\+\s*\($\|//\|/\*\|&\)\)\@!\|endif\>\)"me=s-1 contains=cSpaceError,cCppOutSkip,@Spell
389  endif
390  syn region	cCppOutElse	contained matchgroup=cCppOutWrapper start="^\s*\(%:\|#\)\s*\(else\|elif\)" end="^\s*\(%:\|#\)\s*endif\>"me=s-1 contains=TOP,cPreCondit
391  syn region	cCppInWrapper	start="^\s*\zs\(%:\|#\)\s*if\s\+0*[1-9]\d*\s*\($\|//\|/\*\||\)" end=".\@=\|$" contains=cCppInIf,cCppInElse fold
392  syn region	cCppInIf	contained matchgroup=cCppInWrapper start="\d\+" end="^\s*\(%:\|#\)\s*endif\>" contains=TOP,cPreCondit
393  if !exists("c_no_if0_fold")
394    syn region	cCppInElse	contained start="^\s*\(%:\|#\)\s*\(else\>\|elif\s\+\(0*[1-9]\d*\s*\($\|//\|/\*\||\)\)\@!\)" end=".\@=\|$" containedin=cCppInIf contains=cCppInElse2 fold
395  else
396    syn region	cCppInElse	contained start="^\s*\(%:\|#\)\s*\(else\>\|elif\s\+\(0*[1-9]\d*\s*\($\|//\|/\*\||\)\)\@!\)" end=".\@=\|$" containedin=cCppInIf contains=cCppInElse2
397  endif
398  syn region	cCppInElse2	contained matchgroup=cCppInWrapper start="^\s*\(%:\|#\)\s*\(else\|elif\)\([^/]\|/[^/*]\)*" end="^\s*\(%:\|#\)\s*endif\>"me=s-1 contains=cSpaceError,cCppOutSkip,@Spell
399  syn region	cCppOutSkip	contained start="^\s*\(%:\|#\)\s*\(if\>\|ifdef\>\|ifndef\>\)" skip="\\$" end="^\s*\(%:\|#\)\s*endif\>" contains=cSpaceError,cCppOutSkip
400  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
401endif
402syn region	cIncluded	display contained start=+"+ skip=+\\\\\|\\"+ end=+"+
403syn match	cIncluded	display contained "<[^>]*>"
404syn match	cInclude	display "^\s*\zs\(%:\|#\)\s*include\>\s*["<]" contains=cIncluded
405"syn match cLineSkip	"\\$"
406syn 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,cBadBlock
407syn region	cDefine		start="^\s*\zs\(%:\|#\)\s*\(define\|undef\)\>" skip="\\$" end="$" keepend contains=ALLBUT,@cPreProcGroup,@Spell
408syn region	cPreProc	start="^\s*\zs\(%:\|#\)\s*\(pragma\>\|line\>\|warning\>\|warn\>\|error\>\)" skip="\\$" end="$" keepend contains=ALLBUT,@cPreProcGroup,@Spell
409
410" Optional embedded Autodoc parsing
411if exists("c_autodoc")
412  syn match cAutodocReal display contained "\%(//\|[/ \t\v]\*\|^\*\)\@2<=!.*" contains=@cAutodoc containedin=cComment,cCommentL
413  syn cluster cCommentGroup add=cAutodocReal
414  syn cluster cPreProcGroup add=cAutodocReal
415endif
416
417" be able to fold #pragma regions
418syn region	cPragma		start="^\s*#pragma\s\+region\>" end="^\s*#pragma\s\+endregion\>" transparent keepend extend fold
419
420" Highlight User Labels
421syn 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
422if s:ft ==# 'c' || exists("cpp_no_cpp11")
423  syn region	cMulti		transparent start='?' skip='::' end=':' contains=ALLBUT,@cMultiGroup,@Spell,@cStringGroup
424endif
425" Avoid matching foo::bar() in C++ by requiring that the next char is not ':'
426syn cluster	cLabelGroup	contains=cUserLabel
427syn match	cUserCont	display "^\s*\zs\I\i*\s*:$" contains=@cLabelGroup
428syn match	cUserCont	display ";\s*\zs\I\i*\s*:$" contains=@cLabelGroup
429if s:in_cpp_family
430  syn match	cUserCont	display "^\s*\zs\%(class\|struct\|enum\)\@!\I\i*\s*:[^:]"me=e-1 contains=@cLabelGroup
431  syn match	cUserCont	display ";\s*\zs\%(class\|struct\|enum\)\@!\I\i*\s*:[^:]"me=e-1 contains=@cLabelGroup
432else
433  syn match	cUserCont	display "^\s*\zs\I\i*\s*:[^:]"me=e-1 contains=@cLabelGroup
434  syn match	cUserCont	display ";\s*\zs\I\i*\s*:[^:]"me=e-1 contains=@cLabelGroup
435endif
436
437syn match	cUserLabel	display "\I\i*" contained
438
439" Avoid recognizing most bitfields as labels
440syn match	cBitField	display "^\s*\zs\I\i*\s*:\s*[1-9]"me=e-1 contains=cType
441syn match	cBitField	display ";\s*\zs\I\i*\s*:\s*[1-9]"me=e-1 contains=cType
442
443if exists("c_minlines")
444  let b:c_minlines = c_minlines
445else
446  if !exists("c_no_if0")
447    let b:c_minlines = 50	" #if 0 constructs can be long
448  else
449    let b:c_minlines = 15	" mostly for () constructs
450  endif
451endif
452if exists("c_curly_error")
453  syn sync fromstart
454else
455  exec "syn sync ccomment cComment minlines=" . b:c_minlines
456endif
457
458" Define the default highlighting.
459" Only used when an item doesn't have highlighting yet
460hi def link cFormat		cSpecial
461hi def link cCppString		cString
462hi def link cCommentL		cComment
463hi def link cCommentStart	cComment
464hi def link cLabel		Label
465hi def link cUserLabel		Label
466hi def link cConditional	Conditional
467hi def link cRepeat		Repeat
468hi def link cCharacter		Character
469hi def link cSpecialCharacter	cSpecial
470hi def link cNumber		Number
471hi def link cOctal		Number
472hi def link cOctalZero		PreProc	 " link this to Error if you want
473hi def link cFloat		Float
474hi def link cOctalError		cError
475hi def link cParenError		cError
476hi def link cErrInParen		cError
477hi def link cErrInBracket	cError
478hi def link cCommentError	cError
479hi def link cCommentStartError	cError
480hi def link cSpaceError		cError
481hi def link cWrongComTail	cError
482hi def link cSpecialError	cError
483hi def link cCurlyError		cError
484hi def link cOperator		Operator
485hi def link cStructure		Structure
486hi def link cTypedef		Structure
487hi def link cStorageClass	StorageClass
488hi def link cInclude		Include
489hi def link cPreProc		PreProc
490hi def link cDefine		Macro
491hi def link cIncluded		cString
492hi def link cError		Error
493hi def link cStatement		Statement
494hi def link cCppInWrapper	cCppOutWrapper
495hi def link cCppOutWrapper	cPreCondit
496hi def link cPreConditMatch	cPreCondit
497hi def link cPreCondit		PreCondit
498hi def link cType		Type
499hi def link cConstant		Constant
500hi def link cCommentString	cString
501hi def link cComment2String	cString
502hi def link cCommentSkip	cComment
503hi def link cString		String
504hi def link cComment		Comment
505hi def link cSpecial		SpecialChar
506hi def link cTodo		Todo
507hi def link cBadContinuation	Error
508hi def link cCppOutSkip		cCppOutIf2
509hi def link cCppInElse2		cCppOutIf2
510hi def link cCppOutIf2		cCppOut
511hi def link cCppOut		Comment
512
513let b:current_syntax = "c"
514
515unlet s:ft
516
517let &cpo = s:cpo_save
518unlet s:cpo_save
519" vim: ts=8
520