updated for version 7.0001
diff --git a/src/testdir/test3.ok b/src/testdir/test3.ok
new file mode 100644
index 0000000..570f8f6
--- /dev/null
+++ b/src/testdir/test3.ok
@@ -0,0 +1,1090 @@
+/* start of AUTO matically checked */
+{
+	if (test)
+		cmd1;
+	cmd2;
+}
+
+{
+	if (test)
+		cmd1;
+	else
+		cmd2;
+}
+
+{
+	if (test)
+	{
+		cmd1;
+		cmd2;
+	}
+}
+
+{
+	if (test)
+	{
+		cmd1;
+		else
+	}
+}
+
+{
+	while (this)
+		if (test)
+			cmd1;
+	cmd2;
+}
+
+{
+	while (this)
+		if (test)
+			cmd1;
+		else
+			cmd2;
+}
+
+{
+	if (test)
+	{
+		cmd;
+	}
+
+	if (test)
+		cmd;
+}
+
+{
+	if (test) {
+		cmd;
+	}
+
+	if (test) cmd;
+}
+
+{
+	cmd1;
+	for (blah)
+		while (this)
+			if (test)
+				cmd2;
+	cmd3;
+}
+
+{
+	cmd1;
+	for (blah)
+		while (this)
+			if (test)
+				cmd2;
+	cmd3;
+
+	if (test)
+	{
+		cmd1;
+		cmd2;
+		cmd3;
+	}
+}
+
+
+/* Test for 'cindent' do/while mixed with if/else: */
+
+{
+	do
+		if (asdf)
+			asdfasd;
+	while (cond);
+
+	do
+		if (asdf)
+			while (asdf)
+				asdf;
+	while (asdf);
+}
+
+/* Test for 'cindent' with two ) on a continuation line */
+{
+	if (asdfasdf;asldkfj asdlkfj as;ldkfj sal;d
+			aal;sdkjf  ( ;asldfkja;sldfk
+				al;sdjfka ;slkdf ) sa;ldkjfsa dlk;)
+		line up here;
+}
+
+
+/* C++ tests: */
+
+// foo()		these three lines should remain in column 0
+// {
+// }
+
+/* Test for continuation and unterminated lines: */
+{
+	i = 99 + 14325 +
+		21345 +
+		21345 +
+		21345 + ( 21345 +
+				21345) +
+		2345 +
+		1234;
+	c = 1;
+}
+
+/*
+   testje for indent with empty line
+
+   here */
+
+{
+	if (testing &&
+			not a joke ||
+			line up here)
+		hay;
+	if (testing &&
+			(not a joke || testing
+			)line up here)
+		hay;
+	if (testing &&
+			(not a joke || testing
+			 line up here))
+		hay;
+}
+
+
+{
+	switch (c)
+	{
+		case xx:
+			do
+				if (asdf)
+					do
+						asdfasdf;
+					while (asdf);
+				else
+					asdfasdf;
+			while (cond);
+		case yy:
+		case xx:
+		case zz:
+			testing;
+	}
+}
+
+{
+	if (cond) {
+		foo;
+	}
+	else
+	{
+		bar;
+	}
+}
+
+{
+	if (alskdfj ;alsdkfjal;skdjf (;sadlkfsa ;dlkf j;alksdfj ;alskdjf
+				alsdkfj (asldk;fj
+					awith cino=(0 ;lf this one goes to below the paren with ==
+						;laksjfd ;lsakdjf ;alskdf asd)
+					asdfasdf;)))
+		asdfasdf;
+}
+
+	int
+func(a, b)
+	int a;
+	int c;
+{
+	if (c1 && (c2 ||
+				c3))
+		foo;
+	if (c1 &&
+			(c2 || c3)
+	   )
+}
+
+{
+	while (asd)
+	{
+		if (asdf)
+			if (test)
+				if (that)
+				{
+					if (asdf)
+						do
+							cdasd;
+						while (as
+								df);
+				}
+				else
+					if (asdf)
+						asdf;
+					else
+						asdf;
+		asdf;
+	}
+}
+
+{
+	s = "/*"; b = ';'
+		s = "/*"; b = ';';
+	a = b;
+}
+
+{
+	switch (a)
+	{
+		case a:
+			switch (t)
+			{
+				case 1:
+					cmd;
+					break;
+				case 2:
+					cmd;
+					break;
+			}
+			cmd;
+			break;
+		case b:
+			{
+				int i;
+				cmd;
+			}
+			break;
+		case c: {
+					int i;
+					cmd;
+				}
+		case d: if (cond &&
+						test) {		/* this line doesn't work right */
+					int i;
+					cmd;
+				}
+				break;
+	}
+}
+
+{
+	if (!(vim_strchr(p_cpo, CPO_BUFOPTGLOB) != NULL && entering) &&
+			(bp_to->b_p_initialized ||
+			 (!entering && vim_strchr(p_cpo, CPO_BUFOPT) != NULL)))
+		return;
+label :
+	asdf = asdf ?
+		asdf : asdf;
+	asdf = asdf ?
+		asdf: asdf;
+}
+
+/* Special Comments	: This function has the added complexity (compared  */
+/*					: to addtolist) of having to check for a detail     */
+/*					: texture and add that to the list first.	 	    */
+
+char *(array[100]) = {
+	"testje",
+	"foo",
+	"bar",
+}
+
+enum soppie
+{
+	yes = 0,
+	no,
+	maybe
+};
+
+typedef enum soppie
+{
+	yes = 0,
+	no,
+	maybe
+};
+
+{
+	int a,
+		b;
+}
+
+{
+	struct Type
+	{
+		int i;
+		char *str;
+	} var[] =
+	{
+		0, "zero",
+		1, "one",
+		2, "two",
+		3, "three"
+	};
+
+	float matrix[3][3] =
+	{
+		{
+			0,
+			1,
+			2
+		},
+		{
+			3,
+			4,
+			5
+		},
+		{
+			6,
+			7,
+			8
+		}
+	};
+}
+
+{
+	/* blah ( blah */
+	/* where does this go? */
+
+	/* blah ( blah */
+	cmd;
+
+	func(arg1,
+			/* comment */
+			arg2);
+	a;
+	{
+		b;
+		{
+			c; /* Hey, NOW it indents?! */
+		}
+	}
+
+	{
+		func(arg1,
+				arg2,
+				arg3);
+		/* Hey, what am I doing here?  Is this coz of the ","? */
+	}
+}
+
+main ()
+{
+	if (cond)
+	{
+		a = b;
+	}
+	if (cond) {
+		a = c;
+	}
+	if (cond)
+		a = d;
+	return;
+}
+
+{
+	case 2: if (asdf &&
+					asdfasdf)
+				aasdf;
+			a = 9;
+	case 3: if (asdf)
+				aasdf;
+			a = 9;
+	case 4:    x = 1;
+			   y = 2;
+
+label:	if (asdf)
+			here;
+
+label:  if (asdf &&
+				asdfasdf)
+		{
+		}
+
+label:  if (asdf &&
+				asdfasdf) {
+			there;
+		}
+
+label:  if (asdf &&
+				asdfasdf)
+			there;
+}
+
+{
+	/*
+	   hello with ":set comments= cino=c5"
+	 */
+
+	/*
+	   hello with ":set comments= cino="
+	 */
+}
+
+
+{
+	if (a < b) {
+		a = a + 1;
+	} else
+		a = a + 2;
+
+	if (a)
+		do {
+			testing;
+		} while (asdfasdf);
+	a = b + 1;
+	asdfasdf
+}
+
+class bob
+{
+	int foo() {return 1;}
+	int bar;
+}
+
+main()
+{
+	while(1)
+		if (foo)
+		{
+			bar;
+		}
+		else {
+			asdf;
+		}
+	misplacedline;
+}
+
+{
+	if (clipboard.state == SELECT_DONE
+			&& ((row == clipboard.start.lnum
+					&& col >= clipboard.start.col)
+				|| row > clipboard.start.lnum))
+}
+
+{
+	if (1) {i += 4;}
+	where_am_i;
+	return 0;
+}
+
+{
+	{
+	} // sdf(asdf
+	if (asdf)
+		asd;
+}
+
+{
+label1:
+label2:
+}
+
+{
+	int fooRet = foo(pBar1, false /*fKB*/,
+			true /*fPTB*/, 3 /*nT*/, false /*fDF*/);
+	f() {
+		for ( i = 0;
+				i < m;
+				/* c */ i++ ) {
+			a = b;
+		}
+	}
+}
+
+{
+	f1(/*comment*/);
+	f2();
+}
+
+{
+	do {
+		if (foo) {
+		} else
+			;
+	} while (foo);
+	foo();	// was wrong
+}
+
+int x;	    // no extra indent because of the ;
+void func()
+{
+}
+
+char *tab[] = {"aaa",
+	"};", /* }; */ NULL}
+	int indented;
+{}
+
+char *a[] = {"aaa", "bbb",
+	"ccc", NULL};
+// here
+
+char *tab[] = {"aaa",
+	"xx", /* xx */};    /* asdf */
+int not_indented;
+
+{
+	do {
+		switch (bla)
+		{
+			case 1: if (foo)
+						bar;
+		}
+	} while (boo);
+	wrong;
+}
+
+int	foo,
+	bar;
+int foo;
+
+#if defined(foo) \
+	&& defined(bar)
+char * xx = "asdf\
+			 foo\
+			 bor";
+int x;
+
+char    *foo = "asdf\
+				asdf\
+				asdf",
+		*bar;
+
+void f()
+{
+#if defined(foo) \
+	&& defined(bar)
+	char    *foo = "asdf\
+					asdf\
+					asdf",
+			*bar;
+	{
+		int i;
+		char    *foo = "asdf\
+						asdf\
+						asdf",
+				*bar;
+	}
+#endif
+}
+#endif
+
+int y;		// comment
+// comment
+
+// comment
+
+{
+	Constructor(int a,
+			int b )  : BaseClass(a)
+	{
+	}
+}
+
+void foo()
+{
+	char one,
+		 two;
+	struct bla piet,
+			   jan;
+	enum foo kees,
+			 jannie;
+	static unsigned sdf,
+					krap;
+	unsigned int piet,
+				 jan;
+	int
+		kees,
+		jan;
+}
+
+{
+	t(int f,
+			int d);		// )
+	d();
+}
+
+Constructor::Constructor(int a,
+		int b 
+		)  : 
+	BaseClass(a,
+			b,
+			c),
+	mMember(b),
+{
+}
+
+Constructor::Constructor(int a,
+		int b )  : 
+	BaseClass(a)
+{
+}
+
+Constructor::Constructor(int a,
+		int b ) /*x*/ : /*x*/ BaseClass(a),
+							  member(b)
+{
+}
+
+class CAbc :
+	public BaseClass1,
+	protected BaseClass2
+{
+	int Test() { return FALSE; }
+	int Test1() { return TRUE; }
+
+	CAbc(int a, int b )  : 
+		BaseClass(a)
+	{ 
+		switch(xxx)
+		{
+			case abc:
+				asdf();
+				break;
+
+			case 999:
+				baer();
+				break;
+		}
+	}
+
+	public: // <-- this was incoreectly indented before!!
+	void testfall();
+	protected:
+	void testfall();
+};
+
+class CAbc : public BaseClass1,
+			 protected BaseClass2
+{
+};
+
+static struct
+{
+	int a;
+	int b;
+} variable[COUNT] =
+{
+	{
+		123,
+		456
+	},
+	{
+		123,
+		456
+	}
+};
+
+static struct
+{
+	int a;
+	int b;
+} variable[COUNT] =
+{
+	{ 123, 456 },
+	{ 123, 456 }
+};
+
+void asdf()		/* ind_maxparen may cause trouble here */
+{
+	if ((0
+				&& 1
+				&& 1
+				&& 1
+				&& 1
+				&& 1
+				&& 1
+				&& 1
+				&& 1
+				&& 1
+				&& 1
+				&& 1
+				&& 1
+				&& 1
+				&& 1
+				&& 1
+				&& 1
+				&& 1
+				&& 1
+				&& 1
+				&& 1
+				&& 1
+				&& 1
+				&& 1
+				&& 1
+				&& 1)) break;
+}
+
+/* end of AUTO */
+
+
+{
+
+/* this is
+ * a real serious
+ * about life, the
+ * universe, and the
+ * rest important big
+ * comment
+ */
+	/* insert " about life, the universe, and the rest" after "serious" */
+}
+
+
+{
+	/*
+	 * Testing for comments, without 'cin' set
+	 */
+about life
+
+/*
+* what happens here?
+*/
+there
+
+	/*
+	   the end of the comment, try inserting a line below */
+line
+
+		/* how about
+hello
+		                this one */
+}
+
+
+{
+    var = this + that + vec[0] * vec[0]
+				      + vec[1] * vec[1]
+					  + vec2[2] * vec[2];
+}
+
+
+{
+		asdf asdflkajds f;
+	if (tes & ting) {
+		asdf asdf asdf ;
+		asdfa sdf asdf;
+		}
+	testing1;
+	if (tes & ting)
+	{
+		asdf asdf asdf ;
+		asdfa sdf asdf;
+		}
+	testing2;
+}
+
+
+main ( int first_par, /*
+					   * Comment for
+					   * first par
+					   */
+	   int second_par /*
+					   * Comment for
+					   * second par
+					   */
+	 )
+{
+	func( first_par, /*
+					  * Comment for
+					  * first par
+					  */
+		  second_par /*
+					  * Comment for
+					  * second par
+					  */
+		);
+
+}
+
+
+{
+	do
+	{
+		if ()
+		{
+			if ()
+				asdf;
+			else
+				asdf;
+		}
+	} while ();
+	cmd;		/* this should go under the } */
+}
+
+
+void f()
+{
+	if ( k() ) {
+		l();
+
+	} else { /* Start (two words) end */
+		m();
+	}
+
+	n();
+}
+
+
+void f()
+	{
+	if ( k() )
+		{
+		l();
+		} else { /* Start (two words) end */
+		m();
+		}
+	n();	/* should be under the if () */
+}
+
+
+void bar(void)
+	{
+	static array[2][2] =
+		{
+			{ 1, 2 },
+			{ 3, 4 },
+		}
+
+	while (a)
+		{
+		foo(&a);
+		}
+
+		{
+		int a;
+			{
+			a = a + 1;
+			}
+		}
+	b = a;
+	}
+
+void func(void)
+	{
+	a = 1;
+		{
+		b = 2;
+		}
+	c = 3;
+	d = 4;
+	}
+/* foo */
+
+
+a()
+{
+  do {
+    a = a +
+      a;
+  } while ( a );		/* add text under this line */
+  here
+    if ( a )
+      a;
+}
+
+
+a()
+{
+label1:
+            /* hmm */
+            // comment
+label2: b();
+label3 /* post */:
+/* pre */ label4:
+		f(/*com*/);
+		if (/*com*/)
+			cmd();
+}
+
+
+/*
+ * A simple comment
+ */
+
+/*
+** A different comment
+*/
+
+
+void f()
+{
+
+	/*********
+	  A comment.
+	*********/
+}
+
+
+void f()
+{
+
+	/*********
+	A comment.
+	*********/
+}
+
+
+void f()
+{
+	c = c1 &&
+		(
+		 c2 ||
+		 c3
+		) && c4;
+}
+
+
+void f()
+{
+	c = c1 &&
+		(
+		 c2 ||
+		 c3
+		) && c4;
+}
+
+
+void f()
+{
+	c = c1 &&
+		(
+			c2 ||
+			c3
+		) && c4;
+}
+
+
+void f()
+{
+	if (   c1
+		   && (   c2
+				  || c3))
+		foo;
+}
+
+
+void f()
+{
+	if (   c1
+		&& (   c2
+			|| c3))
+		foo;
+}
+
+
+void f()
+{
+	c = c1 && (
+		c2 ||
+		c3
+		) && c4;
+	if (
+		c1 && c2
+	   )
+		foo;
+}
+
+
+void f()
+{
+	c = c1 && (
+		c2 ||
+		c3
+	) && c4;
+	if (
+		c1 && c2
+	)
+		foo;
+}
+
+
+void f()
+{
+	switch (x)
+	{
+		case 1:
+			a = b;
+		break;
+		default:
+			a = 0;
+		break;
+	}
+}
+
+
+void f()
+{
+	invokeme(
+		 argu,
+		 ment);
+	invokeme(
+		 argu,
+		 ment
+		 );
+	invokeme(argu,
+			 ment
+			);
+}
+
+
+void f()
+{
+	statement;
+		  // comment 1
+		  // comment 2
+}
+
+
+void f()
+{
+	statement;
+	   // comment 1
+	   // comment 2
+}
+
+
+class CAbc
+{
+	int Test() { return FALSE; }
+
+public: // comment
+	void testfall();
+protected:
+	void testfall();
+};
+
+
+{
+	averylongfunctionnamelongfunctionnameaverylongfunctionname()->asd(
+			asdasdf,
+			func(asdf,
+				 asdfadsf),
+			asdfasdf
+			);
+
+	/* those are ugly, but consequent */
+
+	func()->asd(asdasdf,
+				averylongfunctionname(
+						abc,
+						dec)->averylongfunctionname(
+								asdfadsf,
+								asdfasdf,
+								asdfasdf,
+								),
+				func(asdfadf,
+					 asdfasdf
+					),
+				asdasdf
+			   );
+
+	averylongfunctionnameaverylongfunctionnameavery()->asd(fasdf(
+					abc,
+					dec)->asdfasdfasdf(
+							asdfadsf,
+							asdfasdf,
+							asdfasdf,
+							),
+			func(asdfadf,
+				 asdfasdf),
+			asdasdf
+			);
+}
+