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