home *** CD-ROM | disk | FTP | other *** search
/ vim.ftp.fu-berlin.de / 2015-02-03.vim.ftp.fu-berlin.de.tar / vim.ftp.fu-berlin.de / runtime / dos / syntax / c.vim < prev    next >
Encoding:
Text File  |  2012-05-31  |  22.4 KB  |  428 lines

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