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