Index: src/libcfa/iostream
===================================================================
--- src/libcfa/iostream	(revision ccbf6830ee98add8ce6d4f897c860e7cf72fe3c1)
+++ src/libcfa/iostream	(revision 2b9ddf26317dcf5f2c92b44c8a865bb13d1a8de5)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Dec 21 13:55:41 2017
-// Update Count     : 145
+// Last Modified On : Thu Jan 25 13:08:39 2018
+// Update Count     : 149
 //
 
@@ -124,4 +124,6 @@
 }; // readable
 
+forall( dtype istype | istream( istype ) ) istype & ?|?( istype &, _Bool & );
+
 forall( dtype istype | istream( istype ) ) istype & ?|?( istype &, char & );
 forall( dtype istype | istream( istype ) ) istype & ?|?( istype &, signed char & );
@@ -145,4 +147,8 @@
 forall( dtype istype | istream( istype ) ) istype & ?|?( istype &, long double _Complex & );
 
+// manipulators
+forall( dtype istype | istream( istype ) ) istype & ?|?( istype &, istype & (*)( istype & ) );
+forall( dtype istype | istream( istype ) ) istype & endl( istype & is );
+
 struct _Istream_cstrUC { char * s; };
 _Istream_cstrUC cstr( char * );
Index: src/libcfa/iostream.c
===================================================================
--- src/libcfa/iostream.c	(revision ccbf6830ee98add8ce6d4f897c860e7cf72fe3c1)
+++ src/libcfa/iostream.c	(revision 2b9ddf26317dcf5f2c92b44c8a865bb13d1a8de5)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Dec 21 13:55:09 2017
-// Update Count     : 427
+// Last Modified On : Thu Jan 25 13:09:28 2018
+// Update Count     : 467
 //
 
@@ -19,5 +19,7 @@
 #include <stdio.h>
 #include <stdbool.h>									// true/false
-#include <string.h>										// strlen
+//#include <string.h>										// strlen, strcmp
+extern int strcmp (const char *__s1, const char *__s2) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));
+extern size_t strlen (const char *__s) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1)));
 #include <float.h>										// DBL_DIG, LDBL_DIG
 #include <complex.h>									// creal, cimag
@@ -301,4 +303,17 @@
 
 forall( dtype istype | istream( istype ) )
+istype & ?|?( istype & is, _Bool & b ) {
+	char val[6];
+	fmt( is, "%5s", val );
+	if ( strcmp( val, "true" ) == 0 ) b = true;
+	else if ( strcmp( val, "false" ) == 0 ) b = false;
+	else {
+		fprintf( stderr, "invalid _Bool constant\n" );
+		abort();
+	} // if
+	return is;
+} // ?|?
+
+forall( dtype istype | istream( istype ) )
 istype & ?|?( istype & is, char & c ) {
 	fmt( is, "%c", &c );								// must pass pointer through varg to fmt
@@ -410,4 +425,15 @@
 } // ?|?
 
+forall( dtype istype | istream( istype ) )
+istype & ?|?( istype & is, istype & (* manip)( istype & ) ) {
+	return manip( is );
+} // ?|?
+
+forall( dtype istype | istream( istype ) )
+istype & endl( istype & is ) {
+	fmt( is, "%*[ \t\f\n\r\v]" );						// ignore whitespace
+	return is;
+} // endl
+
 _Istream_cstrUC cstr( char * str ) { return (_Istream_cstrUC){ str }; }
 forall( dtype istype | istream( istype ) )
