Index: src/tests/.expect/fmtLines.txt
===================================================================
--- src/tests/.expect/fmtLines.txt	(revision e06be49ae9f46cd31bab3bd1d4adbb7b048948b3)
+++ src/tests/.expect/fmtLines.txt	(revision e06be49ae9f46cd31bab3bd1d4adbb7b048948b3)
@@ -0,0 +1,78 @@
+// /  / Cf  oral  l Ve  rsio  
+n 1.  0.0   Copy  righ  t (C  
+) 20  17 U  nive  rsit  y of  
+ Wat  erlo  o///  / Th  e co  
+nten  ts o  f th  is f  ile   
+are   cove  red   unde  r th  
+e li  cenc  e ag  reem  ent   
+in t  he//   fil  e "L  ICEN  
+CE"   dist  ribu  ted   with  
+ Cfo  rall  .//   // f  mtLi  
+nes.  cc -  - //   //   Auth  
+or                 : P  eter  
+ A.   Buhr  // C  reat  ed O  
+n           : Su  n Se  p 17  
+ 21:  56:1  5 20  17//   Las  
+t Mo  difi  ed B  y :   Pete  
+r A.   Buh  r//   Last   Mod  
+ifie  d On   : M  on S  ep 1  
+8 11  :35:  57 2  017/  / Up  
+date   Cou  nt       :   31/  
+/ #i  nclu  de <  fstr  eam>  
+#inc  lude   <co  rout  ine>  
+coro  utin  e Fo  rmat   {	c  
+har   ch;	  				  				  		//  
+ use  d fo  r co  mmun  icat  
+ion	  int   g, b  ;			  				  
+				  // g  loba  l be  caus  
+e us  ed i  n de  stru  ctor  
+};vo  id ?  {}(   Form  at &  
+ fmt   ) {        resu  me(   
+fmt   );		  				  				  // s  
+tart   cor  outi  ne}v  oid   
+^?{}  ( Fo  rmat   & f  mt )  
+ {      if   ( f  mt.g   !=   
+0 ||   fmt  .b !  = 0   ) so  
+ut |   end  l;}v  oid   main  
+( Fo  rmat   & f  mt )   {	f  
+or (   ;;   ) {	  				  				  
+	//   for   as m  any   char  
+acte  rs		  for   ( fm  t.g   
+= 0;   fmt  .g <   5;   fmt.  
+g +=   1 )   {		  // g  roup  
+s of   5 b  lock  s			  for   
+( fm  t.b   = 0;   fmt  .b <  
+ 4;   fmt.  b +=   1 )   {	/  
+/ bl  ocks   of   4 ch  arac  
+ters  				  for   ( ;;   ) {  
+				  			/  / fo  r ne  wlin  
+e ch  arac  ters  				  	sus  
+pend  ();	  				  if (   fmt  
+.ch   != '  \n'   ) br  eak;  
+		//   ign  ore   newl  ine	  
+			}   //   for	  			s  out   
+| fm  t.ch  ;			  				  // p  
+rint   cha  ract  er		  	} /  
+/ fo  r			  sout   | "    ";  
+				  				  // p  rint   blo  
+ck s  epar  ator  		}   // f  
+or		  sout   | e  ndl;  				  
+				  	//   prin  t gr  oup   
+sepa  rato  r	}   // f  or}   
+// m  ainv  oid   prt(   For  
+mat   & fm  t, c  har   ch )  
+ {      fm  t.ch   = c  h;    
+  re  sume  ( fm  t );  } //  
+ prt  int   main  () {  	For  
+mat   fmt;  	cha  r ch  ;	fo  
+r (   ;; )   {		  sin   | ch  
+;			  				  			/  / re  ad o  
+ne c  hara  cter  	  i  f (   
+eof(   sin   ) )   bre  ak;	  
+				  		//   eof   ?		  prt(  
+ fmt  , ch   );	  } //   for  
+} //   mai  n//   Loca  l Va  
+riab  les:   ///  / ta  b-wi  
+dth:   4 /  ///   comp  ile-  
+comm  and:   "cf  a fm  tLin  
+es.c  " //  // E  nd:   //
Index: src/tests/.in/fmtLines.txt
===================================================================
--- src/tests/.in/fmtLines.txt	(revision e06be49ae9f46cd31bab3bd1d4adbb7b048948b3)
+++ src/tests/.in/fmtLines.txt	(revision e06be49ae9f46cd31bab3bd1d4adbb7b048948b3)
@@ -0,0 +1,67 @@
+// 
+// Cforall Version 1.0.0 Copyright (C) 2017 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+// 
+// fmtLines.cc -- 
+// 
+// Author           : Peter A. Buhr
+// Created On       : Sun Sep 17 21:56:15 2017
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Mon Sep 18 11:35:57 2017
+// Update Count     : 31
+// 
+
+#include <fstream>
+#include <coroutine>
+
+coroutine Format {
+	char ch;											// used for communication
+	int g, b;											// global because used in destructor
+};
+
+void ?{}( Format & fmt ) {
+    resume( fmt );										// start coroutine
+}
+
+void ^?{}( Format & fmt ) {
+    if ( fmt.g != 0 || fmt.b != 0 ) sout | endl;
+}
+
+void main( Format & fmt ) {
+	for ( ;; ) {										// for as many characters
+		for ( fmt.g = 0; fmt.g < 5; fmt.g += 1 ) {		// groups of 5 blocks
+			for ( fmt.b = 0; fmt.b < 4; fmt.b += 1 ) {	// blocks of 4 characters
+				for ( ;; ) {							// for newline characters
+					suspend();
+					if ( fmt.ch != '\n' ) break;		// ignore newline
+				} // for
+				sout | fmt.ch;							// print character
+			} // for
+			sout | "  ";								// print block separator
+		} // for
+		sout | endl;									// print group separator
+	} // for
+} // main
+
+void prt( Format & fmt, char ch ) {
+    fmt.ch = ch;
+    resume( fmt );
+} // prt
+
+int main() {
+	Format fmt;
+	char ch;
+
+	for ( ;; ) {
+		sin | ch;										// read one character
+	  if ( eof( sin ) ) break;							// eof ?
+		prt( fmt, ch );
+	} // for
+} // main
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa fmtLines.c" //
+// End: //
Index: src/tests/fmtLines.c
===================================================================
--- src/tests/fmtLines.c	(revision e06be49ae9f46cd31bab3bd1d4adbb7b048948b3)
+++ src/tests/fmtLines.c	(revision e06be49ae9f46cd31bab3bd1d4adbb7b048948b3)
@@ -0,0 +1,67 @@
+// 
+// Cforall Version 1.0.0 Copyright (C) 2017 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+// 
+// fmtLines.cc -- 
+// 
+// Author           : Peter A. Buhr
+// Created On       : Sun Sep 17 21:56:15 2017
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Mon Sep 18 11:35:57 2017
+// Update Count     : 31
+// 
+
+#include <fstream>
+#include <coroutine>
+
+coroutine Format {
+	char ch;											// used for communication
+	int g, b;											// global because used in destructor
+};
+
+void ?{}( Format & fmt ) {
+    resume( fmt );										// start coroutine
+}
+
+void ^?{}( Format & fmt ) {
+    if ( fmt.g != 0 || fmt.b != 0 ) sout | endl;
+}
+
+void main( Format & fmt ) {
+	for ( ;; ) {										// for as many characters
+		for ( fmt.g = 0; fmt.g < 5; fmt.g += 1 ) {		// groups of 5 blocks
+			for ( fmt.b = 0; fmt.b < 4; fmt.b += 1 ) {	// blocks of 4 characters
+				for ( ;; ) {							// for newline characters
+					suspend();
+					if ( fmt.ch != '\n' ) break;		// ignore newline
+				} // for
+				sout | fmt.ch;							// print character
+			} // for
+			sout | "  ";								// print block separator
+		} // for
+		sout | endl;									// print group separator
+	} // for
+} // main
+
+void prt( Format & fmt, char ch ) {
+    fmt.ch = ch;
+    resume( fmt );
+} // prt
+
+int main() {
+	Format fmt;
+	char ch;
+
+	for ( ;; ) {
+		sin | ch;										// read one character
+	  if ( eof( sin ) ) break;							// eof ?
+		prt( fmt, ch );
+	} // for
+} // main
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa fmtLines.c" //
+// End: //
