@@ -5809,6 +5809,54 @@ cin_is_cpp_namespace(char_u *s)
58095809 return FALSE;
58105810}
58115811
5812+ /*
5813+ * Recognize a `extern "C"` or `extern "C++"` linkage specifications.
5814+ */
5815+ static int
5816+ cin_is_cpp_extern_c (char_u * s )
5817+ {
5818+ char_u * p ;
5819+ int has_string_literal = FALSE;
5820+
5821+ s = cin_skipcomment (s );
5822+ if (STRNCMP (s , "extern" , 6 ) == 0 && (s [6 ] == NUL || !vim_iswordc (s [6 ])))
5823+ {
5824+ p = cin_skipcomment (skipwhite (s + 6 ));
5825+ while (* p != NUL )
5826+ {
5827+ if (vim_iswhite (* p ))
5828+ {
5829+ p = cin_skipcomment (skipwhite (p ));
5830+ }
5831+ else if (* p == '{' )
5832+ {
5833+ break ;
5834+ }
5835+ else if (p [0 ] == '"' && p [1 ] == 'C' && p [2 ] == '"' )
5836+ {
5837+ if (has_string_literal )
5838+ return FALSE;
5839+ has_string_literal = TRUE;
5840+ p += 3 ;
5841+ }
5842+ else if (p [0 ] == '"' && p [1 ] == 'C' && p [2 ] == '+' && p [3 ] == '+'
5843+ && p [4 ] == '"' )
5844+ {
5845+ if (has_string_literal )
5846+ return FALSE;
5847+ has_string_literal = TRUE;
5848+ p += 5 ;
5849+ }
5850+ else
5851+ {
5852+ return FALSE;
5853+ }
5854+ }
5855+ return has_string_literal ? TRUE : FALSE;
5856+ }
5857+ return FALSE;
5858+ }
5859+
58125860/*
58135861 * Return a pointer to the first non-empty non-comment character after a ':'.
58145862 * Return NULL if not found.
@@ -6652,6 +6700,7 @@ cin_skip2pos(pos_T *trypos)
66526700{
66536701 char_u * line ;
66546702 char_u * p ;
6703+ char_u * new_p ;
66556704
66566705 p = line = ml_get (trypos -> lnum );
66576706 while (* p && (colnr_T )(p - line ) < trypos -> col )
@@ -6660,8 +6709,11 @@ cin_skip2pos(pos_T *trypos)
66606709 p = cin_skipcomment (p );
66616710 else
66626711 {
6663- p = skip_string (p );
6664- ++ p ;
6712+ new_p = skip_string (p );
6713+ if (new_p == p )
6714+ ++ p ;
6715+ else
6716+ p = new_p ;
66656717 }
66666718 }
66676719 return (int )(p - line );
@@ -6977,6 +7029,9 @@ parse_cino(buf_T *buf)
69777029 /* indentation for # comments */
69787030 buf -> b_ind_hash_comment = 0 ;
69797031
7032+ /* Handle C++ extern "C" or "C++" */
7033+ buf -> b_ind_cpp_extern_c = 0 ;
7034+
69807035 for (p = buf -> b_p_cino ; * p ; )
69817036 {
69827037 l = p ++ ;
@@ -7051,6 +7106,7 @@ parse_cino(buf_T *buf)
70517106 case '#' : buf -> b_ind_hash_comment = n ; break ;
70527107 case 'N' : buf -> b_ind_cpp_namespace = n ; break ;
70537108 case 'k' : buf -> b_ind_if_for_while = n ; break ;
7109+ case 'E' : buf -> b_ind_cpp_extern_c = n ; break ;
70547110 }
70557111 if (* p == ',' )
70567112 ++ p ;
@@ -7764,6 +7820,8 @@ get_c_indent(void)
77647820 l = skipwhite (ml_get_curline ());
77657821 if (cin_is_cpp_namespace (l ))
77667822 amount += curbuf -> b_ind_cpp_namespace ;
7823+ else if (cin_is_cpp_extern_c (l ))
7824+ amount += curbuf -> b_ind_cpp_extern_c ;
77677825 }
77687826 else
77697827 {
@@ -7990,6 +8048,12 @@ get_c_indent(void)
79908048 - added_to_amount ;
79918049 break ;
79928050 }
8051+ else if (cin_is_cpp_extern_c (l ))
8052+ {
8053+ amount += curbuf -> b_ind_cpp_extern_c
8054+ - added_to_amount ;
8055+ break ;
8056+ }
79938057
79948058 if (cin_nocode (l ))
79958059 continue ;
0 commit comments