Index: src/libcfa/fstream
===================================================================
--- src/libcfa/fstream	(revision c4187dfdc90c9b81d834a500c87748caadbe8476)
+++ src/libcfa/fstream	(revision 37f98609afa93d18643e97867221804216dbda7b)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Mar  7 14:48:08 2017
-// Update Count     : 91
+// Last Modified On : Tue Mar 21 15:57:24 2017
+// Update Count     : 102
 //
 
@@ -21,8 +21,10 @@
 enum { separateSize = 16 };
 struct ofstream {
-	void *file;
+	void * file;
 	_Bool sepDefault;
 	_Bool sepOnOff;
+	const char * sepCur;
 	char separator[separateSize];
+	char tupleSeparator[separateSize];
 }; // ofstream
 
@@ -32,6 +34,10 @@
 void sepReset( ofstream * );
 void sepReset( ofstream *, _Bool );
+const char * sepGetCur( ofstream * );
+void sepSetCur( ofstream *, const char * );
 const char * sepGet( ofstream * );
 void sepSet( ofstream *, const char * );
+const char * sepGetTuple( ofstream * );
+void sepSetTuple( ofstream *, const char * );
 _Bool sepDisable( ofstream * );
 _Bool sepEnable( ofstream * );
@@ -42,5 +48,7 @@
 void close( ofstream * );
 ofstream * write( ofstream *, const char * data, unsigned long int size );
-int prtfmt( ofstream *, const char fmt[], ... );
+int fmt( ofstream *, const char fmt[], ... );
+
+void ?{}( ofstream * );
 
 extern ofstream * sout, * serr;
@@ -48,5 +56,5 @@
 // implement context istream
 struct ifstream {
-	void *file;
+	void * file;
 }; // ifstream
 
@@ -57,7 +65,7 @@
 ifstream * read( ifstream * is, char * data, unsigned long int size );
 ifstream * ungetc( ifstream * is, char c );
-int scanfmt( ifstream *, const char fmt[], ... );
+int fmt( ifstream *, const char fmt[], ... );
 
-extern ifstream *sin;
+extern ifstream * sin;
 
 #endif // __FSTREAM_H__
Index: src/libcfa/fstream.c
===================================================================
--- src/libcfa/fstream.c	(revision c4187dfdc90c9b81d834a500c87748caadbe8476)
+++ src/libcfa/fstream.c	(revision 37f98609afa93d18643e97867221804216dbda7b)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Mar  7 14:48:09 2017
-// Update Count     : 192
+// Last Modified On : Wed Mar 22 16:17:21 2017
+// Update Count     : 221
 //
 
@@ -25,4 +25,5 @@
 #include <complex.h>									// creal, cimag
 }
+#include "assert"
 
 #define IO_MSG "I/O error: "
@@ -33,9 +34,22 @@
 void sepReset( ofstream * os ) { os->sepOnOff = os->sepDefault; }
 void sepReset( ofstream * os, _Bool reset ) { os->sepDefault = reset; os->sepOnOff = os->sepDefault; }
-const char * sepGet( ofstream * os ) { return &(os->separator[0]); }
+
+const char * sepGetCur( ofstream * os ) { return os->sepCur; }
+void sepSetCur( ofstream * os, const char * sepCur ) { os->sepCur = sepCur; }
+
+const char * sepGet( ofstream * os ) { return os->separator; }
 
 void sepSet( ofstream * os, const char * s ) {
-	strncpy( &(os->separator[0]), s, separateSize - 1 );
+	assert( s );
+	strncpy( os->separator, s, separateSize - 1 );
 	os->separator[separateSize - 1] = '\0';
+} // sepSet
+
+const char * sepGetTuple( ofstream * os ) { return os->tupleSeparator; }
+
+void sepSetTuple( ofstream * os, const char * s ) {
+	assert( s );
+	strncpy( os->tupleSeparator, s, separateSize - 1 );
+	os->tupleSeparator[separateSize - 1] = '\0';
 } // sepSet
 
@@ -95,8 +109,8 @@
 } // write
 
-int prtfmt( ofstream * os, const char fmt[], ... ) {
+int fmt( ofstream * os, const char format[], ... ) {
 	va_list args;
-	va_start( args, fmt );
-	int len = vfprintf( (FILE *)(os->file), fmt, args );
+	va_start( args, format );
+	int len = vfprintf( (FILE *)(os->file), format, args );
 	if ( len == EOF ) {
 		if ( ferror( (FILE *)(os->file) ) ) {
@@ -109,10 +123,18 @@
 	sepReset( os );										// reset separator
 	return len;
-} // prtfmt
-
-
-static ofstream soutFile = { (FILE *)(&_IO_2_1_stdout_), 1, 0, { ' ', '\0' } };
+} // fmt
+
+void ?{}( ofstream * this, void * file, _Bool sepDefault, _Bool sepOnOff, const char * separator, const char * tupleSeparator ) {
+	this->file = file;
+	this->sepDefault = sepDefault;
+	this->sepOnOff = sepOnOff;
+	sepSet( this, separator );
+	sepSetCur( this, sepGet( this ) );
+	sepSetTuple( this, tupleSeparator );
+}
+
+static ofstream soutFile = { (FILE *)(&_IO_2_1_stdout_), 1, 0, " ", ", " };
 ofstream *sout = &soutFile;
-static ofstream serrFile = { (FILE *)(&_IO_2_1_stderr_), 1, 0, { ' ', '\0' } };
+static ofstream serrFile = { (FILE *)(&_IO_2_1_stderr_), 1, 0, " ", ", " };
 ofstream *serr = &serrFile;
 
@@ -173,9 +195,9 @@
 } // ungetc
 
-int scanfmt( ifstream * is, const char fmt[], ... ) {
+int fmt( ifstream * is, const char format[], ... ) {
 	va_list args;
 
-	va_start( args, fmt );
-	int len = vfscanf( (FILE *)(is->file), fmt, args );
+	va_start( args, format );
+	int len = vfscanf( (FILE *)(is->file), format, args );
 	if ( len == EOF ) {
 		if ( ferror( (FILE *)(is->file) ) ) {
@@ -186,5 +208,5 @@
 	va_end( args );
 	return len;
-} // prtfmt
+} // fmt
 
 
Index: src/libcfa/iostream
===================================================================
--- src/libcfa/iostream	(revision c4187dfdc90c9b81d834a500c87748caadbe8476)
+++ src/libcfa/iostream	(revision 37f98609afa93d18643e97867221804216dbda7b)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Mar  6 20:51:35 2017
-// Update Count     : 98
+// Last Modified On : Tue Mar 21 15:57:29 2017
+// Update Count     : 104
 //
 
@@ -25,6 +25,10 @@
 	void sepReset( ostype * );							// set separator state to default state
 	void sepReset( ostype *, _Bool );					// set separator and default state
+	const char * sepGetCur( ostype * );					// get current separator string
+	void sepSetCur( ostype *, const char * );			// set current separator string
+	const char * sepGet( ostype * );					// get separator string
 	void sepSet( ostype *, const char * );				// set separator to string (15 character maximum)
-	const char * sepGet( ostype * );					// get separator string
+	const char * sepGetTuple( ostype * );				// get tuple separator string
+	void sepSetTuple( ostype *, const char * );			// set tuple separator to string (15 character maximum)
 	_Bool sepDisable( ostype * );						// set default state to off, and return previous state
 	_Bool sepEnable( ostype * );						// set default state to on, and return previous state
@@ -35,5 +39,5 @@
 	void close( ostype * os );
 	ostype * write( ostype *, const char *, unsigned long int );
-	int prtfmt( ostype *, const char fmt[], ... );
+	int fmt( ostype *, const char fmt[], ... );
 };
 
@@ -95,5 +99,5 @@
 	istype * read( istype *, char *, unsigned long int );
 	istype * ungetc( istype *, char );
-	int scanfmt( istype *, const char fmt[], ... );
+	int fmt( istype *, const char fmt[], ... );
 };
 
Index: src/libcfa/iostream.c
===================================================================
--- src/libcfa/iostream.c	(revision c4187dfdc90c9b81d834a500c87748caadbe8476)
+++ src/libcfa/iostream.c	(revision 37f98609afa93d18643e97867221804216dbda7b)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Mar  6 20:52:02 2017
-// Update Count     : 313
+// Last Modified On : Wed Mar 22 17:21:23 2017
+// Update Count     : 358
 //
 
@@ -24,103 +24,103 @@
 
 forall( dtype ostype | ostream( ostype ) )
-ostype * ?|?( ostype *os, char c ) {
-	prtfmt( os, "%c", c );
-	sepOff( os );
-	return os;
-} // ?|?
-
-forall( dtype ostype | ostream( ostype ) )
-ostype * ?|?( ostype *os, signed char c ) {
-	prtfmt( os, "%hhd", c );
-	sepOff( os );
-	return os;
-} // ?|?
-
-forall( dtype ostype | ostream( ostype ) )
-ostype * ?|?( ostype *os, unsigned char c ) {
-	prtfmt( os, "%hhu", c );
-	sepOff( os );
-	return os;
-} // ?|?
-
-forall( dtype ostype | ostream( ostype ) )
-ostype * ?|?( ostype *os, short int si ) {
-	if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
-	prtfmt( os, "%hd", si );
-	return os;
-} // ?|?
-
-forall( dtype ostype | ostream( ostype ) )
-ostype * ?|?( ostype *os, unsigned short int usi ) {
-	if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
-	prtfmt( os, "%hu", usi );
-	return os;
-} // ?|?
-
-forall( dtype ostype | ostream( ostype ) )
-ostype * ?|?( ostype *os, int i ) {
-	if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
-	prtfmt( os, "%d", i );
-	return os;
-} // ?|?
-
-forall( dtype ostype | ostream( ostype ) )
-ostype * ?|?( ostype *os, unsigned int ui ) {
-	if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
-	prtfmt( os, "%u", ui );
-	return os;
-} // ?|?
-
-forall( dtype ostype | ostream( ostype ) )
-ostype * ?|?( ostype *os, long int li ) {
-	if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
-	prtfmt( os, "%ld", li );
-	return os;
-} // ?|?
-
-forall( dtype ostype | ostream( ostype ) )
-ostype * ?|?( ostype *os, unsigned long int uli ) {
-	if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
-	prtfmt( os, "%lu", uli );
-	return os;
-} // ?|?
-
-forall( dtype ostype | ostream( ostype ) )
-ostype * ?|?( ostype *os, long long int lli ) {
-	if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
-	prtfmt( os, "%lld", lli );
-	return os;
-} // ?|?
-
-forall( dtype ostype | ostream( ostype ) )
-ostype * ?|?( ostype *os, unsigned long long int ulli ) {
-	if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
-	prtfmt( os, "%llu", ulli );
-	return os;
-} // ?|?
-
-forall( dtype ostype | ostream( ostype ) )
-ostype * ?|?( ostype *os, float f ) {
-	if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
-	prtfmt( os, "%g", f );
-	return os;
-} // ?|?
-
-forall( dtype ostype | ostream( ostype ) )
-ostype * ?|?( ostype *os, double d ) {
-	if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
-	prtfmt( os, "%.*lg", DBL_DIG, d );
-	return os;
-} // ?|?
-
-forall( dtype ostype | ostream( ostype ) )
-ostype * ?|?( ostype *os, long double ld ) {
-	if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
-	prtfmt( os, "%.*Lg", LDBL_DIG, ld );
-	return os;
-} // ?|?
-
-forall( dtype ostype | ostream( ostype ) )
-ostype * ?|?( ostype *os, float _Complex fc ) {
+ostype * ?|?( ostype * os, char c ) {
+	fmt( os, "%c", c );
+	sepOff( os );
+	return os;
+} // ?|?
+
+forall( dtype ostype | ostream( ostype ) )
+ostype * ?|?( ostype * os, signed char c ) {
+	fmt( os, "%hhd", c );
+	sepOff( os );
+	return os;
+} // ?|?
+
+forall( dtype ostype | ostream( ostype ) )
+ostype * ?|?( ostype * os, unsigned char c ) {
+	fmt( os, "%hhu", c );
+	sepOff( os );
+	return os;
+} // ?|?
+
+forall( dtype ostype | ostream( ostype ) )
+ostype * ?|?( ostype * os, short int si ) {
+	if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
+	fmt( os, "%hd", si );
+	return os;
+} // ?|?
+
+forall( dtype ostype | ostream( ostype ) )
+ostype * ?|?( ostype * os, unsigned short int usi ) {
+	if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
+	fmt( os, "%hu", usi );
+	return os;
+} // ?|?
+
+forall( dtype ostype | ostream( ostype ) )
+ostype * ?|?( ostype * os, int i ) {
+	if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
+	fmt( os, "%d", i );
+	return os;
+} // ?|?
+
+forall( dtype ostype | ostream( ostype ) )
+ostype * ?|?( ostype * os, unsigned int ui ) {
+	if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
+	fmt( os, "%u", ui );
+	return os;
+} // ?|?
+
+forall( dtype ostype | ostream( ostype ) )
+ostype * ?|?( ostype * os, long int li ) {
+	if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
+	fmt( os, "%ld", li );
+	return os;
+} // ?|?
+
+forall( dtype ostype | ostream( ostype ) )
+ostype * ?|?( ostype * os, unsigned long int uli ) {
+	if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
+	fmt( os, "%lu", uli );
+	return os;
+} // ?|?
+
+forall( dtype ostype | ostream( ostype ) )
+ostype * ?|?( ostype * os, long long int lli ) {
+	if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
+	fmt( os, "%lld", lli );
+	return os;
+} // ?|?
+
+forall( dtype ostype | ostream( ostype ) )
+ostype * ?|?( ostype * os, unsigned long long int ulli ) {
+	if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
+	fmt( os, "%llu", ulli );
+	return os;
+} // ?|?
+
+forall( dtype ostype | ostream( ostype ) )
+ostype * ?|?( ostype * os, float f ) {
+	if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
+	fmt( os, "%g", f );
+	return os;
+} // ?|?
+
+forall( dtype ostype | ostream( ostype ) )
+ostype * ?|?( ostype * os, double d ) {
+	if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
+	fmt( os, "%.*lg", DBL_DIG, d );
+	return os;
+} // ?|?
+
+forall( dtype ostype | ostream( ostype ) )
+ostype * ?|?( ostype * os, long double ld ) {
+	if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
+	fmt( os, "%.*Lg", LDBL_DIG, ld );
+	return os;
+} // ?|?
+
+forall( dtype ostype | ostream( ostype ) )
+ostype * ?|?( ostype * os, float _Complex fc ) {
 	os | crealf( fc );
 	_Bool temp = sepDisable( os );						// disable separators within complex value
@@ -132,5 +132,5 @@
 
 forall( dtype ostype | ostream( ostype ) )
-ostype * ?|?( ostype *os, double _Complex dc ) {
+ostype * ?|?( ostype * os, double _Complex dc ) {
 	os | creal( dc );
 	_Bool temp = sepDisable( os );						// disable separators within complex value
@@ -142,5 +142,5 @@
 
 forall( dtype ostype | ostream( ostype ) )
-ostype * ?|?( ostype *os, long double _Complex ldc ) {
+ostype * ?|?( ostype * os, long double _Complex ldc ) {
 	os | creall( ldc );
 	_Bool temp = sepDisable( os );						// disable separators within complex value
@@ -152,15 +152,15 @@
 
 forall( dtype ostype | ostream( ostype ) )
-ostype * ?|?( ostype *os, const char *cp ) {
+ostype * ?|?( ostype * os, const char * cp ) {
 	enum { Open = 1, Close, OpenClose };
 	static const unsigned char mask[256] = {
 		// opening delimiters, no space after
 		['('] : Open, ['['] : Open, ['{'] : Open,
-		['$'] : Open, ['='] : Open, [(unsigned char)'£'] : Open, [(unsigned char)'¥'] : Open,
+		['='] : Open, ['$'] : Open, [(unsigned char)'£'] : Open, [(unsigned char)'¥'] : Open,
 		[(unsigned char)'¡'] : Open, [(unsigned char)'¿'] : Open, [(unsigned char)'«'] : Open,
 		// closing delimiters, no space before
 		[','] : Close, ['.'] : Close, [':'] : Close, [';'] : Close, ['!'] : Close, ['?'] : Close,
+		['%'] : Close, [(unsigned char)'¢'] : Close, [(unsigned char)'»'] : Close,
 		[')'] : Close, [']'] : Close, ['}'] : Close,
-		['%'] : Close, [(unsigned char)'¢'] : Close, [(unsigned char)'»'] : Close,
 		// opening-closing delimiters, no space before or after
 		['\''] : OpenClose, ['`'] : OpenClose, ['"'] : OpenClose,
@@ -173,5 +173,5 @@
 	unsigned char ch = cp[0];							// must make unsigned
 	if ( sepPrt( os ) && mask[ ch ] != Close && mask[ ch ] != OpenClose ) {
-		prtfmt( os, "%s", sepGet( os ) );
+		fmt( os, "%s", sepGetCur( os ) );
 	} // if
 
@@ -191,7 +191,7 @@
 
 forall( dtype ostype | ostream( ostype ) )
-ostype * ?|?( ostype *os, const void *p ) {
-	if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
-	prtfmt( os, "%p", p );
+ostype * ?|?( ostype * os, const void * p ) {
+	if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
+	fmt( os, "%p", p );
 	return os;
 } // ?|?
@@ -201,6 +201,12 @@
 forall( dtype ostype, otype T, ttype Params | ostream( ostype ) | writeable( T ) | { ostype * ?|?( ostype *, Params ); } )
 ostype * ?|?( ostype * os, T arg, Params rest ) {
-	os | arg | ", ";
-	os | rest;
+	forall( ttype Params ) ostype * prtTuple( ostype * os, T arg, Params rest ) {
+		os | arg;										// print first argument
+		os | rest;										// print remaining arguments
+		return os;
+	} // prtTuple
+	sepSetCur( os, sepGetTuple( os ) );					// switch to tuple separator
+	prtTuple( os, arg, rest );							// recursively print tuple
+	sepSetCur( os, sepGet( os ) );						// switch to regular separator
 	return os;
 } // ?|?
@@ -248,5 +254,5 @@
 
 forall( otype elttype | writeable( elttype ), otype iteratortype | iterator( iteratortype, elttype ), dtype ostype | ostream( ostype ) )
-void write( iteratortype begin, iteratortype end, ostype *os ) {
+void write( iteratortype begin, iteratortype end, ostype * os ) {
 	void print( elttype i ) { os | i; }
 	for_each( begin, end, print );
@@ -254,5 +260,5 @@
 
 forall( otype elttype | writeable( elttype ), otype iteratortype | iterator( iteratortype, elttype ), dtype ostype | ostream( ostype ) )
-void write_reverse( iteratortype begin, iteratortype end, ostype *os ) {
+void write_reverse( iteratortype begin, iteratortype end, ostype * os ) {
 	void print( elttype i ) { os | i; }
 	for_each_reverse( begin, end, print );
@@ -263,5 +269,5 @@
 forall( dtype istype | istream( istype ) )
 istype * ?|?( istype * is, char * c ) {
-	scanfmt( is, "%c", c );
+	fmt( is, "%c", c );
 	return is;
 } // ?|?
@@ -269,5 +275,5 @@
 forall( dtype istype | istream( istype ) )
 istype * ?|?( istype * is, short int * si ) {
-	scanfmt( is, "%hd", si );
+	fmt( is, "%hd", si );
 	return is;
 } // ?|?
@@ -275,5 +281,5 @@
 forall( dtype istype | istream( istype ) )
 istype * ?|?( istype * is, unsigned short int * usi ) {
-	scanfmt( is, "%hu", usi );
+	fmt( is, "%hu", usi );
 	return is;
 } // ?|?
@@ -281,5 +287,5 @@
 forall( dtype istype | istream( istype ) )
 istype * ?|?( istype * is, int * i ) {
-	scanfmt( is, "%d", i );
+	fmt( is, "%d", i );
 	return is;
 } // ?|?
@@ -287,5 +293,5 @@
 forall( dtype istype | istream( istype ) )
 istype * ?|?( istype * is, unsigned int * ui ) {
-	scanfmt( is, "%u", ui );
+	fmt( is, "%u", ui );
 	return is;
 } // ?|?
@@ -293,5 +299,5 @@
 forall( dtype istype | istream( istype ) )
 istype * ?|?( istype * is, long int * li ) {
-	scanfmt( is, "%ld", li );
+	fmt( is, "%ld", li );
 	return is;
 } // ?|?
@@ -299,5 +305,5 @@
 forall( dtype istype | istream( istype ) )
 istype * ?|?( istype * is, unsigned long int * ulli ) {
-	scanfmt( is, "%lu", ulli );
+	fmt( is, "%lu", ulli );
 	return is;
 } // ?|?
@@ -305,5 +311,5 @@
 forall( dtype istype | istream( istype ) )
 istype * ?|?( istype * is, long long int * lli ) {
-	scanfmt( is, "%lld", lli );
+	fmt( is, "%lld", lli );
 	return is;
 } // ?|?
@@ -311,5 +317,5 @@
 forall( dtype istype | istream( istype ) )
 istype * ?|?( istype * is, unsigned long long int * ulli ) {
-	scanfmt( is, "%llu", ulli );
+	fmt( is, "%llu", ulli );
 	return is;
 } // ?|?
@@ -318,5 +324,5 @@
 forall( dtype istype | istream( istype ) )
 istype * ?|?( istype * is, float * f ) {
-	scanfmt( is, "%f", f );
+	fmt( is, "%f", f );
 	return is;
 } // ?|?
@@ -324,5 +330,5 @@
 forall( dtype istype | istream( istype ) )
 istype * ?|?( istype * is, double * d ) {
-	scanfmt( is, "%lf", d );
+	fmt( is, "%lf", d );
 	return is;
 } // ?|?
@@ -330,5 +336,5 @@
 forall( dtype istype | istream( istype ) )
 istype * ?|?( istype * is, long double * ld ) {
-	scanfmt( is, "%Lf", ld );
+	fmt( is, "%Lf", ld );
 	return is;
 } // ?|?
@@ -338,5 +344,5 @@
 istype * ?|?( istype * is, float _Complex * fc ) {
 	float re, im;
-	scanfmt( is, "%g%gi", &re, &im );
+	fmt( is, "%g%gi", &re, &im );
 	*fc = re + im * _Complex_I;
 	return is;
@@ -346,5 +352,5 @@
 istype * ?|?( istype * is, double _Complex * dc ) {
 	double re, im;
-	scanfmt( is, "%lf%lfi", &re, &im );
+	fmt( is, "%lf%lfi", &re, &im );
 	*dc = re + im * _Complex_I;
 	return is;
@@ -354,5 +360,5 @@
 istype * ?|?( istype * is, long double _Complex * ldc ) {
 	long double re, im;
-	scanfmt( is, "%Lf%Lfi", &re, &im );
+	fmt( is, "%Lf%Lfi", &re, &im );
 	*ldc = re + im * _Complex_I;
 	return is;
@@ -362,5 +368,5 @@
 forall( dtype istype | istream( istype ) )
 istype * ?|?( istype * is, _Istream_cstrUC cstr ) {
-	scanfmt( is, "%s", cstr.s );
+	fmt( is, "%s", cstr.s );
 	return is;
 } // cstr
@@ -371,5 +377,5 @@
 	char buf[16];
 	sprintf( buf, "%%%ds", cstr.size );
-	scanfmt( is, buf, cstr.s );
+	fmt( is, buf, cstr.s );
 	return is;
 } // cstr
Index: src/tests/.expect/io.txt
===================================================================
--- src/tests/.expect/io.txt	(revision c4187dfdc90c9b81d834a500c87748caadbe8476)
+++ src/tests/.expect/io.txt	(revision 37f98609afa93d18643e97867221804216dbda7b)
@@ -18,6 +18,6 @@
 abc, $xyz
 
-v(27 v[27 v{27 $27 £27 ¥27 ¡27 ¿27 «27
-25, 25. 25: 25; 25! 25? 25) 25] 25} 25% 25¢ 25»
+v(27 v[27 v{27 $27 =27 £27 ¥27 ¡27 ¿27 «27
+25, 25. 25: 25; 25! 25? 25% 25¢ 25» 25) 25] 25}
 25'27 25`27 25"27 25 27 25
 27 25
@@ -25,2 +25,7 @@
 27 25	27 25
 27
+3, 4, a, 7.2
+3, 4, a, 7.2
+3 4 a 7.2
+ 3 4 a 7.234a7.2 3 4 a 7.2
+3-4-a-7.2^3^4-3-4-a-7.2
Index: src/tests/io.c
===================================================================
--- src/tests/io.c	(revision c4187dfdc90c9b81d834a500c87748caadbe8476)
+++ src/tests/io.c	(revision 37f98609afa93d18643e97867221804216dbda7b)
@@ -10,6 +10,6 @@
 // Created On       : Wed Mar  2 16:56:02 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Jul  5 18:29:23 2016
-// Update Count     : 31
+// Last Modified On : Tue Mar 21 22:36:06 2017
+// Update Count     : 48
 // 
 
@@ -62,6 +62,6 @@
 
 	sepSet( sout, ", $" );										// change separator, maximum of 15 characters
-	sout | f | d | ld | endl									// floating point without separator
-		 | fc | dc | ldc | endl									// complex without separator
+	sout | f | d | ld | endl
+		 | fc | dc | ldc | endl
 		 | s1 | s2 | endl;
 	sout | endl;
@@ -74,4 +74,5 @@
 		| "v{" | 27
 		| "$" | 27
+		| "=" | 27
 		| "£" | 27
 		| "¥" | 27
@@ -87,10 +88,10 @@
 		| 25 | "!"
 		| 25 | "?"
+		| 25 | "%"
+		| 25 | "¢"
+		| 25 | "»"
 		| 25 | ")"
 		| 25 | "]"
 		| 25 | "}"
-		| 25 | "%"
-		| 25 | "¢"
-		| 25 | "»"
 		| endl
 		// opening-closing delimiters
@@ -105,4 +106,14 @@
 		| 25 | "\v" | 27
 		| endl;
+
+	[int, int, const char *, double] t = { 3, 4, "a", 7.2 };
+	sout | [ 3, 4, "a", 7.2 ] | endl;
+	sout | t | endl;
+	sepSetTuple( sout, " " );
+	sout | t | endl;
+	sout | sepOn | t | sepDisable | t | sepEnable | t | endl;
+	sepSet( sout, "^" );
+	sepSetTuple( sout, "-" );
+	sout | t | 3 | 4 | t | endl;
 }
 
