Index: libcfa/src/fstream.cfa
===================================================================
--- libcfa/src/fstream.cfa	(revision 258a8ae310b4bcab699e01ad2f0ef28d7a9b2475)
+++ libcfa/src/fstream.cfa	(revision 182256b4aa148c77a64e9731dedbd8a503973f2f)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Jun 19 16:24:54 2020
-// Update Count     : 384
+// Last Modified On : Mon Mar  1 21:12:15 2021
+// Update Count     : 424
 //
 
@@ -25,5 +25,4 @@
 #include <errno.h>										// errno
 
-
 // *********************************** ofstream ***********************************
 
@@ -38,4 +37,5 @@
 	os.$prt = false;
 	os.$sawNL = false;
+	os.$acquired = false;
 	$sepSetCur( os, sepGet( os ) );
 	sepSet( os, " " );
@@ -109,4 +109,5 @@
 	if ( &os == &exit ) exit( EXIT_FAILURE );
 	if ( &os == &abort ) abort();
+	if ( os.$acquired ) { os.$acquired = false; release( os ); }
 } // ends
 
@@ -171,4 +172,17 @@
 } // fmt
 
+inline void acquire( ofstream & os ) {
+	lock( os.$lock );
+	if ( ! os.$acquired ) os.$acquired = true;
+	else unlock( os.$lock );
+} // acquire
+
+inline void release( ofstream & os ) {
+	unlock( os.$lock );
+} // release
+
+void ?{}( osacquire & acq, ofstream & os ) { &acq.os = &os; lock( os.$lock ); }
+void ^?{}( osacquire & acq ) { release( acq.os ); }
+
 static ofstream soutFile = { (FILE *)stdout };
 ofstream & sout = soutFile, & stdout = soutFile;
@@ -176,4 +190,7 @@
 ofstream & serr = serrFile, & stderr = serrFile;
 
+static ofstream lsoutFile = { (FILE *)stdout };
+ofstream & lsout = lsoutFile;
+
 static ofstream exitFile = { (FILE *)stdout };
 ofstream & exit = exitFile;
@@ -189,4 +206,5 @@
 	is.$file = file;
 	is.$nlOnOff = false;
+	is.$acquired = false;
 } // ?{}
 
@@ -213,4 +231,8 @@
 	return is.$file == 0p || ferror( (FILE *)(is.$file) );
 } // fail
+
+void ends( ifstream & is ) {
+	if ( is.$acquired ) { is.$acquired = false; release( is ); }
+} // ends
 
 int eof( ifstream & is ) {
@@ -279,4 +301,17 @@
 } // fmt
 
+inline void acquire( ifstream & is ) {
+	lock( is.$lock );
+	if ( ! is.$acquired ) is.$acquired = true;
+	else unlock( is.$lock );
+} // acquire
+
+inline void release( ifstream & is ) {
+	unlock( is.$lock );
+} // release
+
+void ?{}( isacquire & acq, ifstream & is ) { &acq.is = &is; lock( is.$lock ); }
+void ^?{}( isacquire & acq ) { release( acq.is ); }
+
 static ifstream sinFile = { (FILE *)stdin };
 ifstream & sin = sinFile, & stdin = sinFile;
Index: libcfa/src/fstream.hfa
===================================================================
--- libcfa/src/fstream.hfa	(revision 258a8ae310b4bcab699e01ad2f0ef28d7a9b2475)
+++ libcfa/src/fstream.hfa	(revision 182256b4aa148c77a64e9731dedbd8a503973f2f)
@@ -10,11 +10,11 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Jun 19 16:29:17 2020
-// Update Count     : 189
+// Last Modified On : Mon Mar  1 22:45:08 2021
+// Update Count     : 217
 //
 
 #pragma once
 
-#include "bits/weakso_locks.hfa"
+#include "bits/weakso_locks.hfa"						// mutex_lock
 #include "iostream.hfa"
 #include <exception.hfa>
@@ -35,5 +35,6 @@
 	char $separator[sepSize];
 	char $tupleSeparator[sepSize];
-//	multiple_acquisition_lock lock;
+	multiple_acquisition_lock $lock;
+	bool $acquired;
 }; // ofstream
 
@@ -71,4 +72,12 @@
 ofstream & write( ofstream &, const char data[], size_t size );
 int fmt( ofstream &, const char format[], ... ) __attribute__(( format(printf, 2, 3) ));
+void acquire( ofstream & os );
+void release( ofstream & os );
+
+struct osacquire {
+	ofstream & os;
+};
+void ?{}( osacquire & acq, ofstream & os );
+void ^?{}( osacquire & acq );
 
 void ?{}( ofstream & os );
@@ -87,4 +96,6 @@
 	void * $file;
 	bool $nlOnOff;
+	multiple_acquisition_lock $lock;
+	bool $acquired;
 }; // ifstream
 
@@ -93,4 +104,5 @@
 void nlOff( ifstream & );
 bool getANL( ifstream & );
+void ends( ifstream & );
 int fail( ifstream & is );
 int eof( ifstream & is );
@@ -101,4 +113,12 @@
 ifstream & ungetc( ifstream & is, char c );
 int fmt( ifstream &, const char format[], ... ) __attribute__(( format(scanf, 2, 3) ));
+void acquire( ifstream & is );
+void release( ifstream & is );
+
+struct isacquire {
+	ifstream & is;
+};
+void ?{}( isacquire & acq, ifstream & is );
+void ^?{}( isacquire & acq );
 
 void ?{}( ifstream & is );
Index: libcfa/src/iostream.cfa
===================================================================
--- libcfa/src/iostream.cfa	(revision 258a8ae310b4bcab699e01ad2f0ef28d7a9b2475)
+++ libcfa/src/iostream.cfa	(revision 182256b4aa148c77a64e9731dedbd8a503973f2f)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Aug 24 08:31:35 2020
-// Update Count     : 1130
+// Last Modified On : Tue Mar  2 14:51:30 2021
+// Update Count     : 1151
 //
 
@@ -266,5 +266,5 @@
 	} // ?|?
 
-	ostype & ?|?( ostype & os, const char str[] ) {
+	ostype & ?|?( ostype & os, const char s[] ) {
 		enum { Open = 1, Close, OpenClose };
 		static const unsigned char mask[256] @= {
@@ -282,8 +282,8 @@
 		}; // mask
 
-	  if ( str[0] == '\0' ) { sepOff( os ); return os; } // null string => no separator
+	  if ( s[0] == '\0' ) { sepOff( os ); return os; } // null string => no separator
 
 		// first character IS NOT spacing or closing punctuation => add left separator
-		unsigned char ch = str[0];						// must make unsigned
+		unsigned char ch = s[0];						// must make unsigned
 		if ( $sepPrt( os ) && mask[ ch ] != Close && mask[ ch ] != OpenClose ) {
 			fmt( os, "%s", $sepGetCur( os ) );
@@ -294,6 +294,6 @@
 
 		// last character IS spacing or opening punctuation => turn off separator for next item
-		size_t len = strlen( str );
-		ch = str[len - 1];								// must make unsigned
+		size_t len = strlen( s );
+		ch = s[len - 1];								// must make unsigned
 		if ( $sepPrt( os ) && mask[ ch ] != Open && mask[ ch ] != OpenClose ) {
 			sepOn( os );
@@ -302,28 +302,27 @@
 		} // if
 		if ( ch == '\n' ) $setNL( os, true );			// check *AFTER* $sepPrt call above as it resets NL flag
-		return write( os, str, len );
-	} // ?|?
-
-	void ?|?( ostype & os, const char str[] ) {
-		(ostype &)(os | str); ends( os );
-	} // ?|?
-
-// 	ostype & ?|?( ostype & os, const char16_t * str ) {
+		return write( os, s, len );
+	} // ?|?
+	void ?|?( ostype & os, const char s[] ) {
+		(ostype &)(os | s); ends( os );
+	} // ?|?
+
+// 	ostype & ?|?( ostype & os, const char16_t * s ) {
 // 		if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
-// 		fmt( os, "%ls", str );
+// 		fmt( os, "%ls", s );
 // 		return os;
 // 	} // ?|?
 
 // #if ! ( __ARM_ARCH_ISA_ARM == 1 && __ARM_32BIT_STATE == 1 ) // char32_t == wchar_t => ambiguous
-// 	ostype & ?|?( ostype & os, const char32_t * str ) {
+// 	ostype & ?|?( ostype & os, const char32_t * s ) {
 // 		if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
-// 		fmt( os, "%ls", str );
+// 		fmt( os, "%ls", s );
 // 		return os;
 // 	} // ?|?
 // #endif // ! ( __ARM_ARCH_ISA_ARM == 1 && __ARM_32BIT_STATE == 1 )
 
-// 	ostype & ?|?( ostype & os, const wchar_t * str ) {
+// 	ostype & ?|?( ostype & os, const wchar_t * s ) {
 // 		if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
-// 		fmt( os, "%ls", str );
+// 		fmt( os, "%ls", s );
 // 		return os;
 // 	} // ?|?
@@ -340,9 +339,8 @@
 	// manipulators
 	ostype & ?|?( ostype & os, ostype & (* manip)( ostype & ) ) {
-		(ostype &)(manip( os ));
-		return os;
+		return manip( os );
 	} // ?|?
 	void ?|?( ostype & os, ostype & (* manip)( ostype & ) ) {
-		(ostype &)(manip( os ));
+		manip( os );
 		if ( $getPrt( os ) ) ends( os );				// something printed ?
 		$setPrt( os, false );							// turn off
@@ -399,4 +397,9 @@
 		return os;
 	} // nlOff
+
+	ostype & acquire( ostype & os ) {
+		acquire( os );									// call void returning
+		return os;
+	} // acquire
 } // distribution
 
@@ -517,5 +520,7 @@
 		return os; \
 	} /* ?|? */ \
-	void ?|?( ostype & os, _Ostream_Manip(T) f ) { (ostype &)(os | f); ends( os ); } \
+	void ?|?( ostype & os, _Ostream_Manip(T) f ) { \
+		(ostype &)(os | f); ends( os ); \
+	} /* ?|? */ \
 } // distribution
 
@@ -894,4 +899,7 @@
 		return is;
 	} // ?|?
+	void ?|?( istype & is, bool & b ) {
+		(istype &)(is | b); ends( is );
+	} // ?|?
 
 	istype & ?|?( istype & is, char & c ) {
@@ -905,4 +913,7 @@
 		return is;
 	} // ?|?
+	void ?|?( istype & is, char & c ) {
+		(istype &)(is | c); ends( is );
+	} // ?|?
 
 	istype & ?|?( istype & is, signed char & sc ) {
@@ -910,4 +921,7 @@
 		return is;
 	} // ?|?
+	void ?|?( istype & is, signed char & sc ) {
+		(istype &)(is | sc); ends( is );
+	} // ?|?
 
 	istype & ?|?( istype & is, unsigned char & usc ) {
@@ -915,4 +929,7 @@
 		return is;
 	} // ?|?
+	void ?|?( istype & is, unsigned char & usc ) {
+		(istype &)(is | usc); ends( is );
+	} // ?|?
 
 	istype & ?|?( istype & is, short int & si ) {
@@ -920,4 +937,7 @@
 		return is;
 	} // ?|?
+	void ?|?( istype & is, short int & si ) {
+		(istype &)(is | si); ends( is );
+	} // ?|?
 
 	istype & ?|?( istype & is, unsigned short int & usi ) {
@@ -925,4 +945,7 @@
 		return is;
 	} // ?|?
+	void ?|?( istype & is, unsigned short int & usi ) {
+		(istype &)(is | usi); ends( is );
+	} // ?|?
 
 	istype & ?|?( istype & is, int & i ) {
@@ -930,4 +953,7 @@
 		return is;
 	} // ?|?
+	void ?|?( istype & is, int & i ) {
+		(istype &)(is | i); ends( is );
+	} // ?|?
 
 	istype & ?|?( istype & is, unsigned int & ui ) {
@@ -935,4 +961,7 @@
 		return is;
 	} // ?|?
+	void ?|?( istype & is, unsigned int & ui ) {
+		(istype &)(is | ui); ends( is );
+	} // ?|?
 
 	istype & ?|?( istype & is, long int & li ) {
@@ -940,4 +969,7 @@
 		return is;
 	} // ?|?
+	void ?|?( istype & is, long int & li ) {
+		(istype &)(is | li); ends( is );
+	} // ?|?
 
 	istype & ?|?( istype & is, unsigned long int & ulli ) {
@@ -945,4 +977,7 @@
 		return is;
 	} // ?|?
+	void ?|?( istype & is, unsigned long int & ulli ) {
+		(istype &)(is | ulli); ends( is );
+	} // ?|?
 
 	istype & ?|?( istype & is, long long int & lli ) {
@@ -950,4 +985,7 @@
 		return is;
 	} // ?|?
+	void ?|?( istype & is, long long int & lli ) {
+		(istype &)(is | lli); ends( is );
+	} // ?|?
 
 	istype & ?|?( istype & is, unsigned long long int & ulli ) {
@@ -955,11 +993,17 @@
 		return is;
 	} // ?|?
+	void & ?|?( istype & is, unsigned long long int & ulli ) {
+		(istype &)(is | ulli); ends( is );
+	} // ?|?
 
 #if defined( __SIZEOF_INT128__ )
-	istype & ?|?( istype & is, int128 & i128 ) {
-		return (istype &)(is | (unsigned int128 &)i128);
-	} // ?|?
-
-	istype & ?|?( istype & is, unsigned int128 & ui128 ) {
+	istype & ?|?( istype & is, int128 & llli ) {
+		return (istype &)(is | (unsigned int128 &)llli);
+	} // ?|?
+	void ?|?( istype & is, int128 & llli ) {
+		(istype &)(is | llli); ends( is );
+	} // ?|?
+
+	istype & ?|?( istype & is, unsigned int128 & ullli ) {
 		char s[40];
 		bool sign = false;
@@ -968,11 +1012,14 @@
 		// If the input is too large, the value returned is undefined. If there is no input, no value is returned
 		if ( fmt( is, "%39[0-9]%*[0-9]", s ) == 1 ) {	// take first 39 characters, ignore remaining
-			ui128 = 0;
+			ullli = 0;
 			for ( unsigned int i = 0; s[i] != '\0'; i += 1 ) {
-				ui128 = ui128 * 10 + s[i] - '0';
+				ullli = ullli * 10 + s[i] - '0';
 			} // for
-			if ( sign ) ui128 = -ui128;
+			if ( sign ) ullli = -ullli;
 		} else if ( sign ) ungetc( is, '-' );			// return minus when no digits
 		return is;
+	} // ?|?
+	void ?|?( istype & is, unsigned int128 & ullli ) {
+		(istype &)(is | ullli); ends( is );
 	} // ?|?
 #endif // __SIZEOF_INT128__
@@ -982,4 +1029,7 @@
 		return is;
 	} // ?|?
+	void ?|?( istype & is, float & f ) {
+		(istype &)(is | f); ends( is );
+	} // ?|?
 
 	istype & ?|?( istype & is, double & d ) {
@@ -987,4 +1037,7 @@
 		return is;
 	} // ?|?
+	void ?|?( istype & is, double & d ) {
+		(istype &)(is | d); ends( is );
+	} // ?|?
 
 	istype & ?|?( istype & is, long double & ld ) {
@@ -992,5 +1045,7 @@
 		return is;
 	} // ?|?
-
+	void ?|?( istype & is, long double & ld ) {
+		(istype &)(is | ld); ends( is );
+	} // ?|?
 
 	istype & ?|?( istype & is, float _Complex & fc ) {
@@ -1000,4 +1055,7 @@
 		return is;
 	} // ?|?
+	void ?|?( istype & is, float _Complex & fc ) {
+		(istype &)(is | fc); ends( is );
+	} // ?|?
 
 	istype & ?|?( istype & is, double _Complex & dc ) {
@@ -1007,4 +1065,7 @@
 		return is;
 	} // ?|?
+	void ?|?( istype & is, double _Complex & dc ) {
+		(istype &)(is | dc); ends( is );
+	} // ?|?
 
 	istype & ?|?( istype & is, long double _Complex & ldc ) {
@@ -1014,4 +1075,7 @@
 		return is;
 	} // ?|?
+	void ?|?( istype & is, long double _Complex & ldc ) {
+		(istype &)(is | ldc); ends( is );
+	} // ?|?
 
 	// istype & ?|?( istype & is, const char fmt[] ) {
@@ -1020,7 +1084,10 @@
 	// } // ?|?
 
-	istype & ?|?( istype & is, char * s ) {
+	istype & ?|?( istype & is, char s[] ) {
 		fmt( is, "%s", s );
 		return is;
+	} // ?|?
+	void ?|?( istype & is, char s[] ) {
+		(istype &)(is | s); ends( is );
 	} // ?|?
 
@@ -1029,4 +1096,7 @@
 		return manip( is );
 	} // ?|?
+	void ?|?( istype & is, istype & (* manip)( istype & ) ) {
+		manip( is ); ends( is );
+	} // ?|?
 
 	istype & nl( istype & is ) {
@@ -1044,63 +1114,78 @@
 		return is;
 	} // nlOff
+
+	istype & acquire( istype & is ) {
+		acquire( is );									// call void returning
+		return is;
+	} // acquire
 } // distribution
 
 // *********************************** manipulators ***********************************
 
-forall( istype & | istream( istype ) )
-istype & ?|?( istype & is, _Istream_Cstr f ) {
-	// skip xxx
-	if ( ! f.s ) {
-		// printf( "skip %s %d\n", f.scanset, f.wd );
-		if ( f.wd == -1 ) fmt( is, f.scanset, "" );		// no input arguments
-		else for ( f.wd ) fmt( is, "%*c" );
-		return is;
-	} // if
-	size_t len = 0;
-	if ( f.scanset ) len = strlen( f.scanset );
-	char fmtstr[len + 16];
-	int start = 1;
-	fmtstr[0] = '%';
-	if ( f.flags.ignore ) { fmtstr[1] = '*'; start += 1; }
-	if ( f.wd != -1 ) { start += sprintf( &fmtstr[start], "%d", f.wd ); }
-	// cstr %s, %*s, %ws, %*ws
-	if ( ! f.scanset ) {
-		fmtstr[start] = 's'; fmtstr[start + 1] = '\0';
-		// printf( "cstr %s\n", fmtstr );
+forall( istype & | istream( istype ) ) {
+	istype & ?|?( istype & is, _Istream_Cstr f ) {
+		// skip xxx
+		if ( ! f.s ) {
+			// printf( "skip %s %d\n", f.scanset, f.wd );
+			if ( f.wd == -1 ) fmt( is, f.scanset, "" );		// no input arguments
+			else for ( f.wd ) fmt( is, "%*c" );
+			return is;
+		} // if
+		size_t len = 0;
+		if ( f.scanset ) len = strlen( f.scanset );
+		char fmtstr[len + 16];
+		int start = 1;
+		fmtstr[0] = '%';
+		if ( f.flags.ignore ) { fmtstr[1] = '*'; start += 1; }
+		if ( f.wd != -1 ) { start += sprintf( &fmtstr[start], "%d", f.wd ); }
+		// cstr %s, %*s, %ws, %*ws
+		if ( ! f.scanset ) {
+			fmtstr[start] = 's'; fmtstr[start + 1] = '\0';
+			// printf( "cstr %s\n", fmtstr );
+			fmt( is, fmtstr, f.s );
+			return is;
+		} // if
+		// incl %[xxx],  %*[xxx],  %w[xxx],  %*w[xxx]
+		// excl %[^xxx], %*[^xxx], %w[^xxx], %*w[^xxx]
+		fmtstr[start] = '['; start += 1;
+		if ( f.flags.inex ) { fmtstr[start] = '^'; start += 1; }
+		strcpy( &fmtstr[start], f.scanset );				// copy includes '\0'
+		len += start;
+		fmtstr[len] = ']'; fmtstr[len + 1] = '\0';
+		// printf( "incl/excl %s\n", fmtstr );
 		fmt( is, fmtstr, f.s );
 		return is;
-	} // if
-	// incl %[xxx],  %*[xxx],  %w[xxx],  %*w[xxx]
-	// excl %[^xxx], %*[^xxx], %w[^xxx], %*w[^xxx]
-	fmtstr[start] = '['; start += 1;
-	if ( f.flags.inex ) { fmtstr[start] = '^'; start += 1; }
-	strcpy( &fmtstr[start], f.scanset );				// copy includes '\0'
-	len += start;
-	fmtstr[len] = ']'; fmtstr[len + 1] = '\0';
-	// printf( "incl/excl %s\n", fmtstr );
-	fmt( is, fmtstr, f.s );
-	return is;
-} // ?|?
-
-forall( istype & | istream( istype ) )
-istype & ?|?( istype & is, _Istream_Char f ) {
-	fmt( is, "%*c" );									// argument variable unused
-	return is;
-} // ?|?
+	} // ?|?
+	void ?|?( istype & is, _Istream_Cstr f ) {
+		(istype &)(is | f); ends( is );
+	} // ?|?
+
+	istype & ?|?( istype & is, _Istream_Char f ) {
+		fmt( is, "%*c" );									// argument variable unused
+		return is;
+	} // ?|?
+	void ?|?( istype & is, _Istream_Char f ) {
+		(istype &)(is | f); ends( is );
+	} // ?|?
+} // distribution
 
 #define InputFMTImpl( T, CODE ) \
-forall( istype & | istream( istype ) ) \
-istype & ?|?( istype & is, _Istream_Manip(T) f ) { \
-	enum { size = 16 }; \
-	char fmtstr[size]; \
-	if ( f.wd == -1 ) { \
-		snprintf( fmtstr, size, "%%%s%s", f.ignore ? "*" : "", CODE ); \
-	} else { \
-		snprintf( fmtstr, size, "%%%s%d%s", f.ignore ? "*" : "", f.wd, CODE ); \
-	} /* if */ \
-	/* printf( "%d %s %p\n", f.wd, fmtstr, &f.val ); */ \
-	fmt( is, fmtstr, &f.val ); \
-	return is; \
-} // ?|?
+forall( istype & | istream( istype ) ) { \
+	istype & ?|?( istype & is, _Istream_Manip(T) f ) { \
+		enum { size = 16 }; \
+		char fmtstr[size]; \
+		if ( f.wd == -1 ) { \
+			snprintf( fmtstr, size, "%%%s%s", f.ignore ? "*" : "", CODE ); \
+		} else { \
+			snprintf( fmtstr, size, "%%%s%d%s", f.ignore ? "*" : "", f.wd, CODE ); \
+		} /* if */ \
+		/* printf( "%d %s %p\n", f.wd, fmtstr, &f.val ); */ \
+		fmt( is, fmtstr, &f.val ); \
+		return is; \
+	} /* ?|? */ \
+	void ?|?( istype & is, _Istream_Manip(T) f ) { \
+		(istype &)(is | f); ends( is ); \
+	} /* ?|? */ \
+} // distribution
 
 InputFMTImpl( signed char, "hhi" )
@@ -1119,36 +1204,44 @@
 InputFMTImpl( long double, "Lf" )
 
-forall( istype & | istream( istype ) )
-istype & ?|?( istype & is, _Istream_Manip(float _Complex) fc ) {
-	float re, im;
-	_Istream_Manip(float) fmtuc @= { re, fc.wd, fc.ignore };
-	is | fmtuc;
-	&fmtuc.val = &im;
-	is | fmtuc;
-	if ( ! fc.ignore ) fc.val = re + im * _Complex_I;	// re/im are uninitialized for ignore
-	return is;
-} // ?|?
-
-forall( istype & | istream( istype ) )
-istype & ?|?( istype & is, _Istream_Manip(double _Complex) dc ) {
-	double re, im;
-	_Istream_Manip(double) fmtuc @= { re, dc.wd, dc.ignore };
-	is | fmtuc;
-	&fmtuc.val = &im;
-	is | fmtuc;
-	if ( ! dc.ignore ) dc.val = re + im * _Complex_I;	// re/im are uninitialized for ignore
-	return is;
-} // ?|?
-
-forall( istype & | istream( istype ) )
-istype & ?|?( istype & is, _Istream_Manip(long double _Complex) ldc ) {
-	long double re, im;
-	_Istream_Manip(long double) fmtuc @= { re, ldc.wd, ldc.ignore };
-	is | fmtuc;
-	&fmtuc.val = &im;
-	is | fmtuc;
-	if ( ! ldc.ignore ) ldc.val = re + im * _Complex_I;	// re/im are uninitialized for ignore
-	return is;
-} // ?|?
+forall( istype & | istream( istype ) ) {
+	istype & ?|?( istype & is, _Istream_Manip(float _Complex) fc ) {
+		float re, im;
+		_Istream_Manip(float) fmtuc @= { re, fc.wd, fc.ignore };
+		is | fmtuc;
+		&fmtuc.val = &im;
+		is | fmtuc;
+		if ( ! fc.ignore ) fc.val = re + im * _Complex_I; // re/im are uninitialized for ignore
+		return is;
+	} // ?|?
+	void ?|?( istype & is, _Istream_Manip(float _Complex) fc ) {
+		(istype &)(is | fc); ends( is );
+	} // ?|?
+
+	istype & ?|?( istype & is, _Istream_Manip(double _Complex) dc ) {
+		double re, im;
+		_Istream_Manip(double) fmtuc @= { re, dc.wd, dc.ignore };
+		is | fmtuc;
+		&fmtuc.val = &im;
+		is | fmtuc;
+		if ( ! dc.ignore ) dc.val = re + im * _Complex_I; // re/im are uninitialized for ignore
+		return is;
+	} // ?|?
+	void ?|?( istype & is, _Istream_Manip(double _Complex) dc ) {
+		(istype &)(is | dc); ends( is );
+	} // ?|?
+
+	istype & ?|?( istype & is, _Istream_Manip(long double _Complex) ldc ) {
+		long double re, im;
+		_Istream_Manip(long double) fmtuc @= { re, ldc.wd, ldc.ignore };
+		is | fmtuc;
+		&fmtuc.val = &im;
+		is | fmtuc;
+		if ( ! ldc.ignore ) ldc.val = re + im * _Complex_I;	// re/im are uninitialized for ignore
+		return is;
+	} // ?|?
+	void ?|?( istype & is, _Istream_Manip(long double _Complex) ldc ) {
+		(istype &)(is | ldc); ends( is );
+	} // ?|?
+} // distribution
 
 // Local Variables: //
Index: libcfa/src/iostream.hfa
===================================================================
--- libcfa/src/iostream.hfa	(revision 258a8ae310b4bcab699e01ad2f0ef28d7a9b2475)
+++ libcfa/src/iostream.hfa	(revision 182256b4aa148c77a64e9731dedbd8a503973f2f)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Aug 11 22:16:14 2020
-// Update Count     : 350
+// Last Modified On : Tue Mar  2 14:05:08 2021
+// Update Count     : 369
 //
 
@@ -54,4 +54,5 @@
 	ostype & write( ostype &, const char [], size_t );
 	int fmt( ostype &, const char format[], ... ) __attribute__(( format(printf, 2, 3) ));
+	void acquire( ostype & );
 }; // ostream
 
@@ -137,4 +138,5 @@
 	ostype & nlOn( ostype & );
 	ostype & nlOff( ostype & );
+	ostype & acquire( ostype & );
 } // distribution
 
@@ -285,4 +287,6 @@
 	void nlOff( istype & );								// scan newline
 	bool getANL( istype & );							// get scan newline (on/off)
+
+	void ends( istype & os );							// end of output statement
 	int fail( istype & );
 	int eof( istype & );
@@ -292,4 +296,5 @@
 	istype & ungetc( istype &, char );
 	int fmt( istype &, const char format[], ... ) __attribute__(( format(scanf, 2, 3) ));
+	void acquire( istype & );
 }; // istream
 
@@ -300,38 +305,61 @@
 forall( istype & | istream( istype ) ) {
 	istype & ?|?( istype &, bool & );
+	void ?|?( istype &, bool & );
 
 	istype & ?|?( istype &, char & );
+	void ?|?( istype &, char & );
 	istype & ?|?( istype &, signed char & );
+	void ?|?( istype &, signed char & );
 	istype & ?|?( istype &, unsigned char & );
+	void ?|?( istype &, unsigned char & );
 
 	istype & ?|?( istype &, short int & );
+	void ?|?( istype &, short int & );
 	istype & ?|?( istype &, unsigned short int & );
+	void ?|?( istype &, unsigned short int & );
 	istype & ?|?( istype &, int & );
+	void ?|?( istype &, int & );
 	istype & ?|?( istype &, unsigned int & );
+	void ?|?( istype &, unsigned int & );
 	istype & ?|?( istype &, long int & );
+	void ?|?( istype &, long int & );
 	istype & ?|?( istype &, unsigned long int & );
+	void ?|?( istype &, unsigned long int & );
 	istype & ?|?( istype &, long long int & );
+	void ?|?( istype &, long long int & );
 	istype & ?|?( istype &, unsigned long long int & );
+	void ?|?( istype &, unsigned long long int & );
 #if defined( __SIZEOF_INT128__ )
 	istype & ?|?( istype &, int128 & );
+	void ?|?( istype &, int128 & );
 	istype & ?|?( istype &, unsigned int128 & );
+	void ?|?( istype &, unsigned int128 & );
 #endif // __SIZEOF_INT128__
 
 	istype & ?|?( istype &, float & );
+	void ?|?( istype &, float & );
 	istype & ?|?( istype &, double & );
+	void ?|?( istype &, double & );
 	istype & ?|?( istype &, long double & );
+	void ?|?( istype &, long double & );
 
 	istype & ?|?( istype &, float _Complex & );
+	void ?|?( istype &, float _Complex & );
 	istype & ?|?( istype &, double _Complex & );
+	void ?|?( istype &, double _Complex & );
 	istype & ?|?( istype &, long double _Complex & );
+	void ?|?( istype &, long double _Complex & );
 
 //	istype & ?|?( istype &, const char [] );
-	istype & ?|?( istype &, char * );
+	istype & ?|?( istype &, char [] );
+	void ?|?( istype &, char [] );
 
 	// manipulators
 	istype & ?|?( istype &, istype & (*)( istype & ) );
+	void ?|?( istype &, istype & (*)( istype & ) );
 	istype & nl( istype & is );
 	istype & nlOn( istype & );
 	istype & nlOff( istype & );
+	istype & acquire( istype & );
 } // distribution
 
@@ -363,5 +391,8 @@
 	_Istream_Cstr & wdi( unsigned int w, _Istream_Cstr & fmt ) { fmt.wd = w; return fmt; }
 } // distribution
-forall( istype & | istream( istype ) ) istype & ?|?( istype & is, _Istream_Cstr f );
+forall( istype & | istream( istype ) ) {
+	istype & ?|?( istype & is, _Istream_Cstr f );
+	void ?|?( istype & is, _Istream_Cstr f );
+}
 
 struct _Istream_Char {
@@ -373,5 +404,8 @@
 	_Istream_Char & ignore( _Istream_Char & fmt ) { fmt.ignore = true; return fmt; }
 } // distribution
-forall( istype & | istream( istype ) ) istype & ?|?( istype & is, _Istream_Char f );
+forall( istype & | istream( istype ) ) {
+	istype & ?|?( istype & is, _Istream_Char f );
+	void ?|?( istype & is, _Istream_Char f );
+}
 
 forall( T & | sized( T ) )
@@ -391,4 +425,5 @@
 forall( istype & | istream( istype ) ) { \
 	istype & ?|?( istype & is, _Istream_Manip(T) f ); \
+	void ?|?( istype & is, _Istream_Manip(T) f ); \
 } // ?|?
 
