@@ -5815,6 +5815,54 @@ cin_is_cpp_namespace(char_u *s)
58155815 return FALSE;
58165816}
58175817
5818+ /*
5819+ * Recognize a `extern "C"` or `extern "C++"` linkage specifications.
5820+ */
5821+ static int
5822+ cin_is_cpp_extern_c (char_u * s )
5823+ {
5824+ char_u * p ;
5825+ int has_string_literal = FALSE;
5826+
5827+ s = cin_skipcomment (s );
5828+ if (STRNCMP (s , "extern" , 6 ) == 0 && (s [6 ] == NUL || !vim_iswordc (s [6 ])))
5829+ {
5830+ p = cin_skipcomment (skipwhite (s + 6 ));
5831+ while (* p != NUL )
5832+ {
5833+ if (vim_iswhite (* p ))
5834+ {
5835+ p = cin_skipcomment (skipwhite (p ));
5836+ }
5837+ else if (* p == '{' )
5838+ {
5839+ break ;
5840+ }
5841+ else if (p [0 ] == '"' && p [1 ] == 'C' && p [2 ] == '"' )
5842+ {
5843+ if (has_string_literal )
5844+ return FALSE;
5845+ has_string_literal = TRUE;
5846+ p += 3 ;
5847+ }
5848+ else if (p [0 ] == '"' && p [1 ] == 'C' && p [2 ] == '+' && p [3 ] == '+'
5849+ && p [4 ] == '"' )
5850+ {
5851+ if (has_string_literal )
5852+ return FALSE;
5853+ has_string_literal = TRUE;
5854+ p += 5 ;
5855+ }
5856+ else
5857+ {
5858+ return FALSE;
5859+ }
5860+ }
5861+ return has_string_literal ? TRUE : FALSE;
5862+ }
5863+ return FALSE;
5864+ }
5865+
58185866/*
58195867 * Return a pointer to the first non-empty non-comment character after a ':'.
58205868 * Return NULL if not found.
@@ -6658,6 +6706,7 @@ cin_skip2pos(pos_T *trypos)
66586706{
66596707 char_u * line ;
66606708 char_u * p ;
6709+ char_u * new_p ;
66616710
66626711 p = line = ml_get (trypos -> lnum );
66636712 while (* p && (colnr_T )(p - line ) < trypos -> col )
@@ -6666,8 +6715,11 @@ cin_skip2pos(pos_T *trypos)
66666715 p = cin_skipcomment (p );
66676716 else
66686717 {
6669- p = skip_string (p );
6670- ++ p ;
6718+ new_p = skip_string (p );
6719+ if (new_p == p )
6720+ ++ p ;
6721+ else
6722+ p = new_p ;
66716723 }
66726724 }
66736725 return (int )(p - line );
@@ -6983,6 +7035,9 @@ parse_cino(buf_T *buf)
69837035 /* indentation for # comments */
69847036 buf -> b_ind_hash_comment = 0 ;
69857037
7038+ /* Handle C++ extern "C" or "C++" */
7039+ buf -> b_ind_cpp_extern_c = 0 ;
7040+
69867041 for (p = buf -> b_p_cino ; * p ; )
69877042 {
69887043 l = p ++ ;
@@ -7057,6 +7112,7 @@ parse_cino(buf_T *buf)
70577112 case '#' : buf -> b_ind_hash_comment = n ; break ;
70587113 case 'N' : buf -> b_ind_cpp_namespace = n ; break ;
70597114 case 'k' : buf -> b_ind_if_for_while = n ; break ;
7115+ case 'E' : buf -> b_ind_cpp_extern_c = n ; break ;
70607116 }
70617117 if (* p == ',' )
70627118 ++ p ;
@@ -7770,6 +7826,8 @@ get_c_indent(void)
77707826 l = skipwhite (ml_get_curline ());
77717827 if (cin_is_cpp_namespace (l ))
77727828 amount += curbuf -> b_ind_cpp_namespace ;
7829+ else if (cin_is_cpp_extern_c (l ))
7830+ amount += curbuf -> b_ind_cpp_extern_c ;
77737831 }
77747832 else
77757833 {
@@ -7996,6 +8054,12 @@ get_c_indent(void)
79968054 - added_to_amount ;
79978055 break ;
79988056 }
8057+ else if (cin_is_cpp_extern_c (l ))
8058+ {
8059+ amount += curbuf -> b_ind_cpp_extern_c
8060+ - added_to_amount ;
8061+ break ;
8062+ }
79998063
80008064 if (cin_nocode (l ))
80018065 continue ;
0 commit comments