summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <bram@vim.org>2011-12-14 20:21:35 +0100
committerBram Moolenaar <bram@vim.org>2011-12-14 20:21:35 +0100
commit7f9d401b39405db2bcb8628d561000645a2c5301 (patch)
tree56511ea25af0f2e5abbbf4b8fe78bb5c83c50756
parente1a284865e6eab91bb35bca9bc4b134da99cb6d9 (diff)
downloadvim-7f9d401b39405db2bcb8628d561000645a2c5301.tar.gz
updated for version 7.3.380v7.3.380v7-3-380
Problem: C-indenting wrong for a function header. Solution: Skip to the start paren. (Lech Lorens)
-rw-r--r--src/misc1.c39
-rw-r--r--src/testdir/test3.in26
-rw-r--r--src/testdir/test3.ok24
-rw-r--r--src/version.c2
4 files changed, 81 insertions, 10 deletions
diff --git a/src/misc1.c b/src/misc1.c
index 65f56f4f..a5a3ad31 100644
--- a/src/misc1.c
+++ b/src/misc1.c
@@ -4943,7 +4943,7 @@ static int cin_iscomment __ARGS((char_u *));
static int cin_islinecomment __ARGS((char_u *));
static int cin_isterminated __ARGS((char_u *, int, int));
static int cin_isinit __ARGS((void));
-static int cin_isfuncdecl __ARGS((char_u **, linenr_T));
+static int cin_isfuncdecl __ARGS((char_u **, linenr_T, linenr_T, int, int));
static int cin_isif __ARGS((char_u *));
static int cin_iselse __ARGS((char_u *));
static int cin_isdo __ARGS((char_u *));
@@ -5585,21 +5585,37 @@ cin_isterminated(s, incl_open, incl_comma)
* "sp" points to a string with the line. When looking at other lines it must
* be restored to the line. When it's NULL fetch lines here.
* "lnum" is where we start looking.
+ * "min_lnum" is the line before which we will not be looking.
*/
static int
-cin_isfuncdecl(sp, first_lnum)
+cin_isfuncdecl(sp, first_lnum, min_lnum, ind_maxparen, ind_maxcomment)
char_u **sp;
linenr_T first_lnum;
+ linenr_T min_lnum;
+ int ind_maxparen;
+ int ind_maxcomment;
{
char_u *s;
linenr_T lnum = first_lnum;
int retval = FALSE;
+ pos_T *trypos;
+ int just_started = TRUE;
if (sp == NULL)
s = ml_get(lnum);
else
s = *sp;
+ if (find_last_paren(s, '(', ')')
+ && (trypos = find_match_paren(ind_maxparen, ind_maxcomment)) != NULL)
+ {
+ lnum = trypos->lnum;
+ if (lnum < min_lnum)
+ return FALSE;
+
+ s = ml_get(lnum);
+ }
+
/* Ignore line starting with #. */
if (cin_ispreproc(s))
return FALSE;
@@ -5650,13 +5666,17 @@ cin_isfuncdecl(sp, first_lnum)
/* Require a comma at end of the line or a comma or ')' at the
* start of next line. */
s = skipwhite(s);
- if (!comma && *s != ',' && *s != ')')
+ if (!just_started && (!comma && *s != ',' && *s != ')'))
break;
+ just_started = FALSE;
}
else if (cin_iscomment(s)) /* ignore comments */
s = cin_skipcomment(s);
else
+ {
++s;
+ just_started = FALSE;
+ }
}
done:
@@ -7158,7 +7178,8 @@ get_c_indent()
* (it's a variable declaration).
*/
if (start_brace != BRACE_IN_COL0
- || !cin_isfuncdecl(&l, curwin->w_cursor.lnum))
+ || !cin_isfuncdecl(&l, curwin->w_cursor.lnum,
+ 0, ind_maxparen, ind_maxcomment))
{
/* if the line is terminated with another ','
* it is a continued variable initialization.
@@ -8019,7 +8040,9 @@ term_again:
&& vim_strchr(theline, '}') == NULL
&& !cin_ends_in(theline, (char_u *)":", NULL)
&& !cin_ends_in(theline, (char_u *)",", NULL)
- && cin_isfuncdecl(NULL, cur_curpos.lnum + 1)
+ && cin_isfuncdecl(NULL, cur_curpos.lnum + 1,
+ cur_curpos.lnum + 1,
+ ind_maxparen, ind_maxcomment)
&& !cin_isterminated(theline, FALSE, TRUE))
{
amount = ind_func_type;
@@ -8125,7 +8148,8 @@ term_again:
* If the line looks like a function declaration, and we're
* not in a comment, put it the left margin.
*/
- if (cin_isfuncdecl(NULL, cur_curpos.lnum)) /* XXX */
+ if (cin_isfuncdecl(NULL, cur_curpos.lnum, 0,
+ ind_maxparen, ind_maxcomment)) /* XXX */
break;
l = ml_get_curline();
@@ -8173,7 +8197,8 @@ term_again:
* line (and the ones that follow) needs to be indented as
* parameters.
*/
- if (cin_isfuncdecl(&l, curwin->w_cursor.lnum))
+ if (cin_isfuncdecl(&l, curwin->w_cursor.lnum, 0,
+ ind_maxparen, ind_maxcomment))
{
amount = ind_param;
break;
diff --git a/src/testdir/test3.in b/src/testdir/test3.in
index 6c43732a..808d0319 100644
--- a/src/testdir/test3.in
+++ b/src/testdir/test3.in
@@ -1429,7 +1429,7 @@ func(int a
STARTTEST
:set cino&
-2kdd=4][
+2kdd=7][
ENDTEST
void func(void)
@@ -1478,7 +1478,29 @@ void func3(void)
3, 4,
5, 6};
-printf("Don't you dare indent this line incorrectly!\n);
+printf("Don't you dare indent this line incorrectly!\n");
+}
+
+void
+func4(a, b,
+ c)
+int a;
+int b;
+int c;
+{
+}
+
+void
+func5(
+ int a,
+ int b)
+{
+}
+
+void
+func6(
+ int a)
+{
}
STARTTEST
diff --git a/src/testdir/test3.ok b/src/testdir/test3.ok
index ad1db853..82816643 100644
--- a/src/testdir/test3.ok
+++ b/src/testdir/test3.ok
@@ -1331,7 +1331,29 @@ void func3(void)
3, 4,
5, 6};
- printf("Don't you dare indent this line incorrectly!\n);
+ printf("Don't you dare indent this line incorrectly!\n");
+}
+
+ void
+func4(a, b,
+ c)
+ int a;
+ int b;
+ int c;
+{
+}
+
+ void
+func5(
+ int a,
+ int b)
+{
+}
+
+ void
+func6(
+ int a)
+{
}
diff --git a/src/version.c b/src/version.c
index 6f2f28c1..5a581138 100644
--- a/src/version.c
+++ b/src/version.c
@@ -715,6 +715,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 380,
+/**/
379,
/**/
378,