To: vim_dev@googlegroups.com Subject: Patch 7.3.380 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 7.3.380 Problem: C-indenting wrong for a function header. Solution: Skip to the start paren. (Lech Lorens) Files: src/misc1.c, src/testdir/test3.in, src/testdir/test3.ok *** ../vim-7.3.379/src/misc1.c 2011-12-14 20:05:17.000000000 +0100 --- src/misc1.c 2011-12-14 20:16:43.000000000 +0100 *************** *** 4943,4949 **** 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_isif __ARGS((char_u *)); static int cin_iselse __ARGS((char_u *)); static int cin_isdo __ARGS((char_u *)); --- 4943,4949 ---- 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, 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,5605 **** * "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. */ static int ! cin_isfuncdecl(sp, first_lnum) char_u **sp; linenr_T first_lnum; { char_u *s; linenr_T lnum = first_lnum; int retval = FALSE; if (sp == NULL) s = ml_get(lnum); else s = *sp; /* Ignore line starting with #. */ if (cin_ispreproc(s)) return FALSE; --- 5585,5621 ---- * "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, 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,5662 **** /* 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 != ')') break; } else if (cin_iscomment(s)) /* ignore comments */ s = cin_skipcomment(s); else ++s; } done: --- 5666,5682 ---- /* Require a comma at end of the line or a comma or ')' at the * start of next line. */ s = skipwhite(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,7164 **** * (it's a variable declaration). */ if (start_brace != BRACE_IN_COL0 ! || !cin_isfuncdecl(&l, curwin->w_cursor.lnum)) { /* if the line is terminated with another ',' * it is a continued variable initialization. --- 7178,7185 ---- * (it's a variable declaration). */ if (start_brace != BRACE_IN_COL0 ! || !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,8025 **** && 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_isterminated(theline, FALSE, TRUE)) { amount = ind_func_type; --- 8040,8048 ---- && 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, ! cur_curpos.lnum + 1, ! ind_maxparen, ind_maxcomment) && !cin_isterminated(theline, FALSE, TRUE)) { amount = ind_func_type; *************** *** 8125,8131 **** * 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 */ break; l = ml_get_curline(); --- 8148,8155 ---- * 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, 0, ! ind_maxparen, ind_maxcomment)) /* XXX */ break; l = ml_get_curline(); *************** *** 8173,8179 **** * line (and the ones that follow) needs to be indented as * parameters. */ ! if (cin_isfuncdecl(&l, curwin->w_cursor.lnum)) { amount = ind_param; break; --- 8197,8204 ---- * line (and the ones that follow) needs to be indented as * parameters. */ ! if (cin_isfuncdecl(&l, curwin->w_cursor.lnum, 0, ! ind_maxparen, ind_maxcomment)) { amount = ind_param; break; *** ../vim-7.3.379/src/testdir/test3.in 2011-12-14 20:05:17.000000000 +0100 --- src/testdir/test3.in 2011-12-14 20:11:24.000000000 +0100 *************** *** 1429,1435 **** STARTTEST :set cino& ! 2kdd=4][ ENDTEST void func(void) --- 1429,1435 ---- STARTTEST :set cino& ! 2kdd=7][ ENDTEST void func(void) *************** *** 1478,1484 **** 3, 4, 5, 6}; ! printf("Don't you dare indent this line incorrectly!\n); } STARTTEST --- 1478,1506 ---- 3, 4, 5, 6}; ! 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 *** ../vim-7.3.379/src/testdir/test3.ok 2011-12-14 20:05:17.000000000 +0100 --- src/testdir/test3.ok 2011-12-14 20:11:24.000000000 +0100 *************** *** 1331,1337 **** 3, 4, 5, 6}; ! printf("Don't you dare indent this line incorrectly!\n); } --- 1331,1359 ---- 3, 4, 5, 6}; ! 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) ! { } *** ../vim-7.3.379/src/version.c 2011-12-14 20:05:17.000000000 +0100 --- src/version.c 2011-12-14 20:20:50.000000000 +0100 *************** *** 716,717 **** --- 716,719 ---- { /* Add new patch number below this line */ + /**/ + 380, /**/ -- "Intelligence has much less practical application than you'd think." -- Scott Adams, Dilbert. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///