To: vim_dev@googlegroups.com
Subject: Patch 7.3.178
Fcc: outbox
From: Bram Moolenaar <Bram@moolenaar.net>
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
------------

Patch 7.3.178
Problem:    C-indent doesn't handle code right after { correctly.
Solution:   Fix detecting unterminated line. (Lech Lorens)
Files:      src/misc1.c, src/testdir/test3.in, src/testdir/test3.ok
    

*** ../vim-7.3.177/src/misc1.c	2011-04-28 17:48:39.000000000 +0200
--- src/misc1.c	2011-05-10 11:35:09.000000000 +0200
***************
*** 4983,4989 ****
  }
  
  /*
!  * Return TRUE if there there is no code at *s.  White space and comments are
   * not considered code.
   */
      static int
--- 4983,4989 ----
  }
  
  /*
!  * Return TRUE if there is no code at *s.  White space and comments are
   * not considered code.
   */
      static int
***************
*** 5458,5465 ****
  }
  
  /*
!  * Recognize a line that starts with '{' or '}', or ends with ';', '{' or '}'.
   * Don't consider "} else" a terminated line.
   * Return the character terminating the line (ending char's have precedence if
   * both apply in order to determine initializations).
   */
--- 5458,5468 ----
  }
  
  /*
!  * Recognize a line that starts with '{' or '}', or ends with ';', ',', '{' or
!  * '}'.
   * Don't consider "} else" a terminated line.
+  * Don't consider a line where there are unmatched opening braces before '}',
+  * ';' or ',' a terminated line.
   * Return the character terminating the line (ending char's have precedence if
   * both apply in order to determine initializations).
   */
***************
*** 5470,5475 ****
--- 5473,5479 ----
      int		incl_comma;	/* recognize a trailing comma */
  {
      char_u found_start = 0;
+     unsigned n_open = 0;
  
      s = cin_skipcomment(s);
  
***************
*** 5480,5489 ****
      {
  	/* skip over comments, "" strings and 'c'haracters */
  	s = skip_string(cin_skipcomment(s));
! 	if ((*s == ';' || (incl_open && *s == '{') || *s == '}'
! 						 || (incl_comma && *s == ','))
  		&& cin_nocode(s + 1))
  	    return *s;
  
  	if (*s)
  	    s++;
--- 5484,5502 ----
      {
  	/* skip over comments, "" strings and 'c'haracters */
  	s = skip_string(cin_skipcomment(s));
! 	if (*s == '}' && n_open > 0)
! 	    --n_open;
! 	if (n_open == 0
! 		&& (*s == ';' || *s == '}' || (incl_comma && *s == ','))
  		&& cin_nocode(s + 1))
  	    return *s;
+ 	else if (*s == '{')
+ 	{
+ 	    if (incl_open && cin_nocode(s + 1))
+ 		return *s;
+ 	    else
+ 		++n_open;
+ 	}
  
  	if (*s)
  	    s++;
*** ../vim-7.3.177/src/testdir/test3.in	2011-04-28 13:01:59.000000000 +0200
--- src/testdir/test3.in	2011-05-10 11:34:13.000000000 +0200
***************
*** 1344,1349 ****
--- 1344,1365 ----
  }
  
  STARTTEST
+ :set cino&
+ 2kdd=][
+ ENDTEST
+ 
+ void func(void)
+ {
+ 	if(x==y)
+ 		if(y==z)
+ 			foo=1;
+ 		else { bar=1;
+ 			baz=2;
+ 		}
+ 	printf("Foo!\n");
+ }
+ 
+ STARTTEST
  :g/^STARTTEST/.,/^ENDTEST/d
  :1;/start of AUTO/,$wq! test.out
  ENDTEST
*** ../vim-7.3.177/src/testdir/test3.ok	2011-04-28 13:01:59.000000000 +0200
--- src/testdir/test3.ok	2011-05-10 11:34:13.000000000 +0200
***************
*** 1204,1206 ****
--- 1204,1218 ----
  {
  }
  
+ 
+ void func(void)
+ {
+ 	if(x==y)
+ 		if(y==z)
+ 			foo=1;
+ 		else { bar=1;
+ 			baz=2;
+ 		}
+ 	printf("Foo!\n");
+ }
+ 
*** ../vim-7.3.177/src/version.c	2011-05-05 18:31:54.000000000 +0200
--- src/version.c	2011-05-10 11:37:43.000000000 +0200
***************
*** 716,717 ****
--- 716,719 ----
  {   /* Add new patch number below this line */
+ /**/
+     178,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
69. Yahoo welcomes you with your own start page

 /// 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    ///
