xref: /vim-8.2.3635/runtime/syntax/c.vim (revision 071d4279)
1" Vim syntax file
2" Language:	C
3" Maintainer:	Bram Moolenaar <[email protected]>
4" Last Change:	2004 Feb 04
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  syntax region cComment	matchgroup=cCommentStart start="/\*" end="\*/" contains=@cCommentGroup,cCommentStartError,cCommentString,cCharacter,cNumbersCom,cSpaceError,@Spell
128else
129  syn region	cCommentL	start="//" skip="\\$" end="$" keepend contains=@cCommentGroup,cSpaceError,@Spell
130  syn region	cComment	matchgroup=cCommentStart start="/\*" end="\*/" contains=@cCommentGroup,cCommentStartError,cSpaceError,@Spell
131endif
132" keep a // comment separately, it terminates a preproc. conditional
133syntax match	cCommentError	display "\*/"
134syntax match	cCommentStartError display "/\*"me=e-1 contained
135
136syn keyword	cOperator	sizeof
137if exists("c_gnu")
138  syn keyword	cStatement	__asm__
139  syn keyword	cOperator	typeof __real__ __imag__
140endif
141syn keyword	cType		int long short char void
142syn keyword	cType		signed unsigned float double
143if !exists("c_no_ansi") || exists("c_ansi_typedefs")
144  syn keyword   cType		size_t ssize_t wchar_t ptrdiff_t sig_atomic_t fpos_t
145  syn keyword   cType		clock_t time_t va_list jmp_buf FILE DIR div_t ldiv_t
146  syn keyword   cType		mbstate_t wctrans_t wint_t wctype_t
147endif
148if !exists("c_no_c99") " ISO C99
149  syn keyword	cType		bool complex
150  syn keyword	cType		int8_t int16_t int32_t int64_t
151  syn keyword	cType		uint8_t uint16_t uint32_t uint64_t
152  syn keyword	cType		int_least8_t int_least16_t int_least32_t int_least64_t
153  syn keyword	cType		uint_least8_t uint_least16_t uint_least32_t uint_least64_t
154  syn keyword	cType		int_fast8_t int_fast16_t int_fast32_t int_fast64_t
155  syn keyword	cType		uint_fast8_t uint_fast16_t uint_fast32_t uint_fast64_t
156  syn keyword	cType		intptr_t uintptr_t
157  syn keyword	cType		intmax_t uintmax_t
158endif
159if exists("c_gnu")
160  syn keyword	cType		__label__ __complex__ __volatile__
161endif
162
163syn keyword	cStructure	struct union enum typedef
164syn keyword	cStorageClass	static register auto volatile extern const
165if exists("c_gnu")
166  syn keyword	cStorageClass	inline __attribute__
167endif
168if !exists("c_no_c99")
169  syn keyword	cStorageClass	inline restrict
170endif
171
172if !exists("c_no_ansi") || exists("c_ansi_constants") || exists("c_gnu")
173  if exists("c_gnu")
174    syn keyword cConstant __GNUC__ __FUNCTION__ __PRETTY_FUNCTION__
175  endif
176  syn keyword cConstant __LINE__ __FILE__ __DATE__ __TIME__ __STDC__
177  syn keyword cConstant __STDC_VERSION__
178  syn keyword cConstant CHAR_BIT MB_LEN_MAX MB_CUR_MAX
179  syn keyword cConstant UCHAR_MAX UINT_MAX ULONG_MAX USHRT_MAX
180  syn keyword cConstant CHAR_MIN INT_MIN LONG_MIN SHRT_MIN
181  syn keyword cConstant CHAR_MAX INT_MAX LONG_MAX SHRT_MAX
182  syn keyword cConstant SCHAR_MIN SINT_MIN SLONG_MIN SSHRT_MIN
183  syn keyword cConstant SCHAR_MAX SINT_MAX SLONG_MAX SSHRT_MAX
184  if !exists("c_no_c99")
185    syn keyword cConstant LLONG_MAX ULLONG_MAX
186    syn keyword cConstant INT8_MIN INT16_MIN INT32_MIN INT64_MIN
187    syn keyword cConstant INT8_MAX INT16_MAX INT32_MAX INT64_MAX
188    syn keyword cConstant UINT8_MAX UINT16_MAX UINT32_MAX UINT64_MAX
189    syn keyword cConstant INT_LEAST8_MIN INT_LEAST16_MIN INT_LEAST32_MIN INT_LEAST64_MIN
190    syn keyword cConstant INT_LEAST8_MAX INT_LEAST16_MAX INT_LEAST32_MAX INT_LEAST64_MAX
191    syn keyword cConstant UINT_LEAST8_MAX UINT_LEAST16_MAX UINT_LEAST32_MAX UINT_LEAST64_MAX
192    syn keyword cConstant INT_FAST8_MIN INT_FAST16_MIN INT_FAST32_MIN INT_FAST64_MIN
193    syn keyword cConstant INT_FAST8_MAX INT_FAST16_MAX INT_FAST32_MAX INT_FAST64_MAX
194    syn keyword cConstant UINT_FAST8_MAX UINT_FAST16_MAX UINT_FAST32_MAX UINT_FAST64_MAX
195    syn keyword cConstant INTPTR_MIN INTPTR_MAX UINTPTR_MAX
196    syn keyword cConstant INTMAX_MIN INTMAX_MAX UINTMAX_MAX
197    syn keyword cConstant PTRDIFF_MIN PTRDIFF_MAX SIG_ATOMIC_MIN SIG_ATOMIC_MAX
198    syn keyword cConstant SIZE_MAX WCHAR_MIN WCHAR_MAX WINT_MIN WINT_MAX
199  endif
200  syn keyword cConstant FLT_RADIX FLT_ROUNDS
201  syn keyword cConstant FLT_DIG FLT_MANT_DIG FLT_EPSILON
202  syn keyword cConstant DBL_DIG DBL_MANT_DIG DBL_EPSILON
203  syn keyword cConstant LDBL_DIG LDBL_MANT_DIG LDBL_EPSILON
204  syn keyword cConstant FLT_MIN FLT_MAX FLT_MIN_EXP FLT_MAX_EXP
205  syn keyword cConstant FLT_MIN_10_EXP FLT_MAX_10_EXP
206  syn keyword cConstant DBL_MIN DBL_MAX DBL_MIN_EXP DBL_MAX_EXP
207  syn keyword cConstant DBL_MIN_10_EXP DBL_MAX_10_EXP
208  syn keyword cConstant LDBL_MIN LDBL_MAX LDBL_MIN_EXP LDBL_MAX_EXP
209  syn keyword cConstant LDBL_MIN_10_EXP LDBL_MAX_10_EXP
210  syn keyword cConstant HUGE_VAL CLOCKS_PER_SEC NULL
211  syn keyword cConstant LC_ALL LC_COLLATE LC_CTYPE LC_MONETARY
212  syn keyword cConstant LC_NUMERIC LC_TIME
213  syn keyword cConstant SIG_DFL SIG_ERR SIG_IGN
214  syn keyword cConstant SIGABRT SIGFPE SIGILL SIGHUP SIGINT SIGSEGV SIGTERM
215  " Add POSIX signals as well...
216  syn keyword cConstant SIGABRT SIGALRM SIGCHLD SIGCONT SIGFPE SIGHUP
217  syn keyword cConstant SIGILL SIGINT SIGKILL SIGPIPE SIGQUIT SIGSEGV
218  syn keyword cConstant SIGSTOP SIGTERM SIGTRAP SIGTSTP SIGTTIN SIGTTOU
219  syn keyword cConstant SIGUSR1 SIGUSR2
220  syn keyword cConstant _IOFBF _IOLBF _IONBF BUFSIZ EOF WEOF
221  syn keyword cConstant FOPEN_MAX FILENAME_MAX L_tmpnam
222  syn keyword cConstant SEEK_CUR SEEK_END SEEK_SET
223  syn keyword cConstant TMP_MAX stderr stdin stdout
224  syn keyword cConstant EXIT_FAILURE EXIT_SUCCESS RAND_MAX
225  " Add POSIX errors as well
226  syn keyword cConstant E2BIG EACCES EAGAIN EBADF EBADMSG EBUSY
227  syn keyword cConstant ECANCELED ECHILD EDEADLK EDOM EEXIST EFAULT
228  syn keyword cConstant EFBIG EILSEQ EINPROGRESS EINTR EINVAL EIO EISDIR
229  syn keyword cConstant EMFILE EMLINK EMSGSIZE ENAMETOOLONG ENFILE ENODEV
230  syn keyword cConstant ENOENT ENOEXEC ENOLCK ENOMEM ENOSPC ENOSYS
231  syn keyword cConstant ENOTDIR ENOTEMPTY ENOTSUP ENOTTY ENXIO EPERM
232  syn keyword cConstant EPIPE ERANGE EROFS ESPIPE ESRCH ETIMEDOUT EXDEV
233  " math.h
234  syn keyword cConstant M_E M_LOG2E M_LOG10E M_LN2 M_LN10 M_PI M_PI_2 M_PI_4
235  syn keyword cConstant M_1_PI M_2_PI M_2_SQRTPI M_SQRT2 M_SQRT1_2
236endif
237if !exists("c_no_c99") " ISO C99
238  syn keyword cConstant true false
239endif
240
241" Accept %: for # (C99)
242syn region	cPreCondit	start="^\s*\(%:\|#\)\s*\(if\|ifdef\|ifndef\|elif\)\>" skip="\\$" end="$" end="//"me=s-1 contains=cComment,cCppString,cCharacter,cCppParen,cParenError,cNumbers,cCommentError,cSpaceError
243syn match	cPreCondit	display "^\s*\(%:\|#\)\s*\(else\|endif\)\>"
244if !exists("c_no_if0")
245  syn region	cCppOut		start="^\s*\(%:\|#\)\s*if\s\+0\+\>" end=".\@=\|$" contains=cCppOut2
246  syn region	cCppOut2	contained start="0" end="^\s*\(%:\|#\)\s*\(endif\>\|else\>\|elif\>\)" contains=cSpaceError,cCppSkip
247  syn region	cCppSkip	contained start="^\s*\(%:\|#\)\s*\(if\>\|ifdef\>\|ifndef\>\)" skip="\\$" end="^\s*\(%:\|#\)\s*endif\>" contains=cSpaceError,cCppSkip
248endif
249syn region	cIncluded	display contained start=+"+ skip=+\\\\\|\\"+ end=+"+
250syn match	cIncluded	display contained "<[^>]*>"
251syn match	cInclude	display "^\s*\(%:\|#\)\s*include\>\s*["<]" contains=cIncluded
252"syn match cLineSkip	"\\$"
253syn 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
254syn region	cDefine		start="^\s*\(%:\|#\)\s*\(define\|undef\)\>" skip="\\$" end="$" end="//"me=s-1 contains=ALLBUT,@cPreProcGroup,@Spell
255syn region	cPreProc	start="^\s*\(%:\|#\)\s*\(pragma\>\|line\>\|warning\>\|warn\>\|error\>\)" skip="\\$" end="$" keepend contains=ALLBUT,@cPreProcGroup,@Spell
256
257" Highlight User Labels
258syn 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
259syn region	cMulti		transparent start='?' skip='::' end=':' contains=ALLBUT,@cMultiGroup,@Spell
260" Avoid matching foo::bar() in C++ by requiring that the next char is not ':'
261syn cluster	cLabelGroup	contains=cUserLabel
262syn match	cUserCont	display "^\s*\I\i*\s*:$" contains=@cLabelGroup
263syn match	cUserCont	display ";\s*\I\i*\s*:$" contains=@cLabelGroup
264syn match	cUserCont	display "^\s*\I\i*\s*:[^:]"me=e-1 contains=@cLabelGroup
265syn match	cUserCont	display ";\s*\I\i*\s*:[^:]"me=e-1 contains=@cLabelGroup
266
267syn match	cUserLabel	display "\I\i*" contained
268
269" Avoid recognizing most bitfields as labels
270syn match	cBitField	display "^\s*\I\i*\s*:\s*[1-9]"me=e-1
271syn match	cBitField	display ";\s*\I\i*\s*:\s*[1-9]"me=e-1
272
273if exists("c_minlines")
274  let b:c_minlines = c_minlines
275else
276  if !exists("c_no_if0")
277    let b:c_minlines = 50	" #if 0 constructs can be long
278  else
279    let b:c_minlines = 15	" mostly for () constructs
280  endif
281endif
282exec "syn sync ccomment cComment minlines=" . b:c_minlines
283
284" Define the default highlighting.
285" For version 5.7 and earlier: only when not done already
286" For version 5.8 and later: only when an item doesn't have highlighting yet
287if version >= 508 || !exists("did_c_syn_inits")
288  if version < 508
289    let did_c_syn_inits = 1
290    command -nargs=+ HiLink hi link <args>
291  else
292    command -nargs=+ HiLink hi def link <args>
293  endif
294
295  HiLink cFormat		cSpecial
296  HiLink cCppString		cString
297  HiLink cCommentL		cComment
298  HiLink cCommentStart		cComment
299  HiLink cLabel			Label
300  HiLink cUserLabel		Label
301  HiLink cConditional		Conditional
302  HiLink cRepeat		Repeat
303  HiLink cCharacter		Character
304  HiLink cSpecialCharacter	cSpecial
305  HiLink cNumber		Number
306  HiLink cOctal			Number
307  HiLink cOctalZero		PreProc	 " link this to Error if you want
308  HiLink cFloat			Float
309  HiLink cOctalError		cError
310  HiLink cParenError		cError
311  HiLink cErrInParen		cError
312  HiLink cErrInBracket		cError
313  HiLink cCommentError		cError
314  HiLink cCommentStartError	cError
315  HiLink cSpaceError		cError
316  HiLink cSpecialError		cError
317  HiLink cOperator		Operator
318  HiLink cStructure		Structure
319  HiLink cStorageClass		StorageClass
320  HiLink cInclude		Include
321  HiLink cPreProc		PreProc
322  HiLink cDefine		Macro
323  HiLink cIncluded		cString
324  HiLink cError			Error
325  HiLink cStatement		Statement
326  HiLink cPreCondit		PreCondit
327  HiLink cType			Type
328  HiLink cConstant		Constant
329  HiLink cCommentString		cString
330  HiLink cComment2String	cString
331  HiLink cCommentSkip		cComment
332  HiLink cString		String
333  HiLink cComment		Comment
334  HiLink cSpecial		SpecialChar
335  HiLink cTodo			Todo
336  HiLink cCppSkip		cCppOut
337  HiLink cCppOut2		cCppOut
338  HiLink cCppOut		Comment
339
340  delcommand HiLink
341endif
342
343let b:current_syntax = "c"
344
345" vim: ts=8
346