Index: libcfa/src/iostream.cfa
===================================================================
--- libcfa/src/iostream.cfa	(revision 1e6ea4e1482e7977552208c8d2dba74f5f58fed6)
+++ libcfa/src/iostream.cfa	(revision 61c7239fc01dff737fe459a153710b3f7d561d1c)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Jun  4 17:32:34 2019
-// Update Count     : 761
+// Last Modified On : Sun Jun  9 16:27:17 2019
+// Update Count     : 803
 //
 
@@ -28,4 +28,8 @@
 #include <complex.h>									// creal, cimag
 } // extern "C"
+
+
+//*********************************** Ostream ***********************************
+
 
 forall( dtype ostype | ostream( ostype ) ) {
@@ -391,4 +395,18 @@
 } // distribution
 
+// writes the range [begin, end) to the given stream
+forall( dtype ostype, otype elt_type | writeable( elt_type, ostype ), otype iterator_type | iterator( iterator_type, elt_type ) ) {
+	void write( iterator_type begin, iterator_type end, ostype & os ) {
+		void print( elt_type i ) { os | i; }
+		for_each( begin, end, print );
+	} // ?|?
+
+	void write_reverse( iterator_type begin, iterator_type end, ostype & os ) {
+		void print( elt_type i ) { os | i; }
+		for_each_reverse( begin, end, print );
+	} // ?|?
+} // distribution
+
+//*********************************** Manipulators ***********************************
 
 //*********************************** Integral ***********************************
@@ -606,19 +624,4 @@
 } // distribution
 
-//---------------------------------------
-
-// writes the range [begin, end) to the given stream
-forall( dtype ostype, otype elt_type | writeable( elt_type, ostype ), otype iterator_type | iterator( iterator_type, elt_type ) ) {
-	void write( iterator_type begin, iterator_type end, ostype & os ) {
-		void print( elt_type i ) { os | i; }
-		for_each( begin, end, print );
-	} // ?|?
-
-	void write_reverse( iterator_type begin, iterator_type end, ostype & os ) {
-		void print( elt_type i ) { os | i; }
-		for_each_reverse( begin, end, print );
-	} // ?|?
-} // distribution
-
 
 //*********************************** Istream ***********************************
@@ -758,70 +761,39 @@
 } // distribution
 
-_Istream_cstrUC cstr( char * str ) { return (_Istream_cstrUC){ str }; }
+//*********************************** Manipulators ***********************************
+
 forall( dtype istype | istream( istype ) )
-istype & ?|?( istype & is, _Istream_cstrUC cstr ) {
-	fmt( is, "%s", cstr.s );
+istype & ?|?( istype & is, _Istream_Cstr f ) {
+	// skip xxx
+	if ( ! f.s ) {
+		// printf( "skip %s\n", f.scanset );
+		fmt( is, f.scanset, "" );						// no input arguments
+		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;
-} // cstr
-
-_Istream_cstrC cstr( char * str, int size ) { return (_Istream_cstrC){ str, size }; }
-forall( dtype istype | istream( istype ) )
-istype & ?|?( istype & is, _Istream_cstrC cstr ) {
-	char buf[16];
-	sprintf( buf, "%%%ds", cstr.size );
-	fmt( is, buf, cstr.s );
-	return is;
-} // cstr
-
-#if 0
-forall( dtype istype | istream( istype ) )
-istype & ?|?( istype & is, _Istream_skip skip ) {
-	fmt( is, skip.s, "" );								// no input arguments
-	return is;
-} // skip
-
-forall( dtype istype | istream( istype ) )
-istype & ?|?( istype & is, _Istream_incl incl ) {
-	size_t len = strlen( incl.scanset ) + 4;			// extras: "%[]\0"
-	char fmtstr[len];
-	fmtstr[0] = '%'; fmtstr[1] = '[';
-	strcpy( &fmtstr[2], incl.scanset );					// after '[', copy includes '\0'
-	fmtstr[len - 2] = ']'; fmtstr[len - 1] = '\0';
-	fmt( is, fmtstr, incl.s );
-	return is;
-} // incl
-
-forall( dtype istype | istream( istype ) )
-istype & ?|?( istype & is, _Istream_excl excl ) {
-	size_t len = strlen( excl.scanset );
-	char fmtstr[len+5];
-	fmtstr[0] = '%'; fmtstr[1] = '['; fmtstr[2] = '^';
-	strcpy( &fmtstr[3], excl.scanset );					// after '^', copy includes '\0'
-	fmtstr[len - 2] = ']'; fmtstr[len - 1] = '\0';
-	fmt( is, fmtstr, excl.s );
-	return is;
-} // excl
-
-forall( dtype istype | istream( istype ) )
-istype & ?|?( istype & is, _Istream_cstr cstr ) {
-	fmt( is, "%s", cstr.s );
-	return is;
-} // cstr
-
-_Istream_cstrW cstr( char * s, int size ) { return (_Istream_cstrW){ s, size }; }
-forall( dtype istype | istream( istype ) )
-istype & ?|?( istype & is, _Istream_cstrW cstr ) {
-	enum { size = 16 };
-	char fmtstr[size];
-	sprintf( fmtstr, "%%%ds", cstr.size );
-	fmt( is, fmtstr, cstr.s );
-	return is;
-} // cstr
-
-forall( dtype istype | istream( istype ) ) istype & ?|?( istype &, _Istream_Cstr ) {
-	
-}
-
-//*********************************** Manipulators ***********************************
+} // ?|?
 
 #define InputFMTImpl( T, CODE ) \
@@ -830,5 +802,5 @@
 	enum { size = 16 }; \
 	char fmtstr[size]; \
-	if ( f.wd == -1 ) { \
+	if ( f.wd == -1 || strcmp( CODE, "c" ) == 0 ) { /* ignore width with "c" */	\
 		snprintf( fmtstr, size, "%%%s%s", f.ignore ? "*" : "", CODE ); \
 	} else { \
@@ -838,5 +810,5 @@
 	fmt( is, fmtstr, &f.val ); \
 	return is; \
-} /* ?|? */
+} // ?|?
 
 InputFMTImpl( char, "c" )
@@ -856,8 +828,36 @@
 InputFMTImpl( long double, "Lf" )
 
-InputFMTImpl( float _Complex, "ff" )
-InputFMTImpl( double _Complex, "lf" )
-InputFMTImpl( long double _Complex, "Lf" )
-#endif // 0
+forall( dtype 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( dtype 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( dtype 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;
+} // ?|?
 
 // Local Variables: //
Index: libcfa/src/iostream.hfa
===================================================================
--- libcfa/src/iostream.hfa	(revision 1e6ea4e1482e7977552208c8d2dba74f5f58fed6)
+++ libcfa/src/iostream.hfa	(revision 61c7239fc01dff737fe459a153710b3f7d561d1c)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Jun  4 17:33:43 2019
-// Update Count     : 286
+// Last Modified On : Sat Jun  8 17:28:44 2019
+// Update Count     : 312
 //
 
@@ -171,18 +171,22 @@
 //*********************************** Integral ***********************************
 
+// See 6.7.9. 19) The initialization shall occur in initializer list order, each initializer provided for a particular
+// subobject overriding any previously listed initializer for the same subobject; ***all subobjects that are not
+// initialized explicitly shall be initialized implicitly the same as objects that have static storage duration.***
+
 #define IntegralFMTDecl( T, CODE ) \
 static inline { \
-	_Ostream_Manip(T) bin( T v ) { return (_Ostream_Manip(T))@{ v, 1, 0, 'b', { .all : 0 } }; } \
-	_Ostream_Manip(T) oct( T v ) { return (_Ostream_Manip(T))@{ v, 1, 0, 'o', { .all : 0 } }; } \
-	_Ostream_Manip(T) hex( T v ) { return (_Ostream_Manip(T))@{ v, 1, 0, 'x', { .all : 0 } }; } \
-	_Ostream_Manip(T) wd( unsigned char w, T v ) { return (_Ostream_Manip(T))@{ v, w, 0, CODE, { .all : 0 } }; } \
-	_Ostream_Manip(T) wd( unsigned char w, unsigned char p, T v ) { return (_Ostream_Manip(T))@{ v, w, p, CODE, { .flags.pc : true } }; } \
-	_Ostream_Manip(T) & wd( unsigned char w, _Ostream_Manip(T) & fmt ) with(fmt) { wd = w; return fmt; } \
-	_Ostream_Manip(T) & wd( unsigned char w, unsigned char p, _Ostream_Manip(T) & fmt ) with(fmt) { wd = w; pc = p; flags.pc = true; return fmt; } \
+	_Ostream_Manip(T) bin( T val ) { return (_Ostream_Manip(T))@{ val, 1, 0, 'b', { .all : 0 } }; } \
+	_Ostream_Manip(T) oct( T val ) { return (_Ostream_Manip(T))@{ val, 1, 0, 'o', { .all : 0 } }; } \
+	_Ostream_Manip(T) hex( T val ) { return (_Ostream_Manip(T))@{ val, 1, 0, 'x', { .all : 0 } }; } \
+	_Ostream_Manip(T) wd( unsigned char w, T val ) { return (_Ostream_Manip(T))@{ val, w, 0, CODE, { .all : 0 } }; } \
+	_Ostream_Manip(T) wd( unsigned char w, unsigned char pc, T val ) { return (_Ostream_Manip(T))@{ val, w, pc, CODE, { .flags.pc : true } }; } \
+	_Ostream_Manip(T) & wd( unsigned char w, _Ostream_Manip(T) & fmt ) { fmt.wd = w; return fmt; } \
+	_Ostream_Manip(T) & wd( unsigned char w, unsigned char pc, _Ostream_Manip(T) & fmt ) { fmt.wd = w; fmt.pc = pc; fmt.flags.pc = true; return fmt; } \
 	_Ostream_Manip(T) & left( _Ostream_Manip(T) & fmt ) { fmt.flags.left = true; return fmt; } \
 	_Ostream_Manip(T) & upcase( _Ostream_Manip(T) & fmt ) { if ( fmt.base == 'x' || fmt.base == 'b' ) fmt.base -= 32; /* upper case */ return fmt; } \
 	_Ostream_Manip(T) & nobase( _Ostream_Manip(T) & fmt ) { fmt.flags.nobsdp = true; return fmt; } \
 	_Ostream_Manip(T) & pad0( _Ostream_Manip(T) & fmt ) { fmt.flags.pad0 = true; return fmt; } \
-	_Ostream_Manip(T) sign( T v ) { return (_Ostream_Manip(T))@{ v, 1, 0, CODE, { .flags.sign : true } }; } \
+	_Ostream_Manip(T) sign( T val ) { return (_Ostream_Manip(T))@{ val, 1, 0, CODE, { .flags.sign : true } }; } \
 	_Ostream_Manip(T) & sign( _Ostream_Manip(T) & fmt ) { fmt.flags.sign = true; return fmt; } \
 } \
@@ -190,5 +194,5 @@
 	ostype & ?|?( ostype & os, _Ostream_Manip(T) f ); \
 	void ?|?( ostype & os, _Ostream_Manip(T) f ); \
-}
+} // ?|?
 
 IntegralFMTDecl( signed char, 'd' )
@@ -208,18 +212,18 @@
 #define FloatingPointFMTDecl( T ) \
 static inline { \
-	_Ostream_Manip(T) sci( T v ) { return (_Ostream_Manip(T))@{ v, 1, 0, 'e', { .all : 0 } }; } \
-	_Ostream_Manip(T) hex( T v ) { return (_Ostream_Manip(T))@{ v, 1, 0, 'a', { .all : 0 } }; } \
-	_Ostream_Manip(T) wd( unsigned char w, T v ) { return (_Ostream_Manip(T))@{ v, w, 0, 'f', { .all : 0 } }; } \
-	_Ostream_Manip(T) wd( unsigned char w, unsigned char p, T v ) { return (_Ostream_Manip(T))@{ v, w, p, 'f', { .flags.pc : true } }; } \
-	_Ostream_Manip(T) ws( unsigned char w, unsigned char p, T v ) { return (_Ostream_Manip(T))@{ v, w, p, 'g', { .flags.pc : true } }; } \
-	_Ostream_Manip(T) & wd( unsigned char w, _Ostream_Manip(T) & fmt ) with(fmt) { wd = w; return fmt; } \
-	_Ostream_Manip(T) & wd( unsigned char w, unsigned char p, _Ostream_Manip(T) & fmt ) with(fmt) { wd = w; pc = p; flags.pc = true; return fmt; } \
+	_Ostream_Manip(T) hex( T val ) { return (_Ostream_Manip(T))@{ val, 1, 0, 'a', { .all : 0 } }; } \
+	_Ostream_Manip(T) sci( T val ) { return (_Ostream_Manip(T))@{ val, 1, 0, 'e', { .all : 0 } }; } \
+	_Ostream_Manip(T) wd( unsigned char w, T val ) { return (_Ostream_Manip(T))@{ val, w, 0, 'f', { .all : 0 } }; } \
+	_Ostream_Manip(T) wd( unsigned char w, unsigned char pc, T val ) { return (_Ostream_Manip(T))@{ val, w, pc, 'f', { .flags.pc : true } }; } \
+	_Ostream_Manip(T) ws( unsigned char w, unsigned char pc, T val ) { return (_Ostream_Manip(T))@{ val, w, pc, 'g', { .flags.pc : true } }; } \
+	_Ostream_Manip(T) & wd( unsigned char w, _Ostream_Manip(T) & fmt ) { fmt.wd = w; return fmt; } \
+	_Ostream_Manip(T) & wd( unsigned char w, unsigned char pc, _Ostream_Manip(T) & fmt ) { fmt.wd = w; fmt.pc = pc; fmt.flags.pc = true; return fmt; } \
 	_Ostream_Manip(T) & left( _Ostream_Manip(T) & fmt ) { fmt.flags.left = true; return fmt; } \
-	_Ostream_Manip(T) upcase( T v ) { return (_Ostream_Manip(T))@{ v, 1, 0, 'G', { .all : 0 } }; } \
+	_Ostream_Manip(T) upcase( T val ) { return (_Ostream_Manip(T))@{ val, 1, 0, 'G', { .all : 0 } }; } \
 	_Ostream_Manip(T) & upcase( _Ostream_Manip(T) & fmt ) { fmt.base -= 32; /* upper case */ return fmt; } \
 	_Ostream_Manip(T) & pad0( _Ostream_Manip(T) & fmt ) { fmt.flags.pad0 = true; return fmt; } \
-	_Ostream_Manip(T) sign( T v ) { return (_Ostream_Manip(T))@{ v, 1, 0, 'g', { .flags.sign : true } }; } \
+	_Ostream_Manip(T) sign( T val ) { return (_Ostream_Manip(T))@{ val, 1, 0, 'g', { .flags.sign : true } }; } \
 	_Ostream_Manip(T) & sign( _Ostream_Manip(T) & fmt ) { fmt.flags.sign = true; return fmt; } \
-	_Ostream_Manip(T) nodp( T v ) { return (_Ostream_Manip(T))@{ v, 1, 0, 'g', { .flags.nobsdp : true } }; } \
+	_Ostream_Manip(T) nodp( T val ) { return (_Ostream_Manip(T))@{ val, 1, 0, 'g', { .flags.nobsdp : true } }; } \
 	_Ostream_Manip(T) & nodp( _Ostream_Manip(T) & fmt ) { fmt.flags.nobsdp = true; return fmt; } \
 } \
@@ -227,5 +231,5 @@
 	ostype & ?|?( ostype & os, _Ostream_Manip(T) f ); \
 	void ?|?( ostype & os, _Ostream_Manip(T) f ); \
-}
+} // ?|?
 
 FloatingPointFMTDecl( double )
@@ -235,9 +239,9 @@
 
 static inline {
-	_Ostream_Manip(char) bin( char v ) { return (_Ostream_Manip(char))@{ v, 1, 0, 'b', { .all : 0 } }; }
-	_Ostream_Manip(char) oct( char v ) { return (_Ostream_Manip(char))@{ v, 1, 0, 'o', { .all : 0 } }; }
-	_Ostream_Manip(char) hex( char v ) { return (_Ostream_Manip(char))@{ v, 1, 0, 'x', { .all : 0 } }; }
-	_Ostream_Manip(char) wd( unsigned char w, char v ) { return (_Ostream_Manip(char))@{ v, w, 0, 'c', { .all : 0 } }; }
-	_Ostream_Manip(char) & wd( unsigned char w, _Ostream_Manip(char) & fmt ) with(fmt) { wd = w; return fmt; }
+	_Ostream_Manip(char) bin( char val ) { return (_Ostream_Manip(char))@{ val, 1, 0, 'b', { .all : 0 } }; }
+	_Ostream_Manip(char) oct( char val ) { return (_Ostream_Manip(char))@{ val, 1, 0, 'o', { .all : 0 } }; }
+	_Ostream_Manip(char) hex( char val ) { return (_Ostream_Manip(char))@{ val, 1, 0, 'x', { .all : 0 } }; }
+	_Ostream_Manip(char) wd( unsigned char w, char val ) { return (_Ostream_Manip(char))@{ val, w, 0, 'c', { .all : 0 } }; }
+	_Ostream_Manip(char) & wd( unsigned char w, _Ostream_Manip(char) & fmt ) { fmt.wd = w; return fmt; }
 	_Ostream_Manip(char) & left( _Ostream_Manip(char) & fmt ) { fmt.flags.left = true; return fmt; }
 	_Ostream_Manip(char) & upcase( _Ostream_Manip(char) & fmt ) { if ( fmt.base == 'x' || fmt.base == 'b' ) fmt.base -= 32; /* upper case */ return fmt; }
@@ -247,16 +251,16 @@
 	ostype & ?|?( ostype & os, _Ostream_Manip(char) f );
 	void ?|?( ostype & os, _Ostream_Manip(char) f );
-}
+} // ?|?
 
 //*********************************** C String ***********************************
 
 static inline {
-	_Ostream_Manip(const char *) bin( const char * v ) { return (_Ostream_Manip(const char *))@{ v, 1, 0, 'b', { .all : 0 } }; }
-	_Ostream_Manip(const char *) oct( const char * v ) { return (_Ostream_Manip(const char *))@{ v, 1, 0, 'o', { .all : 0 } }; }
-	_Ostream_Manip(const char *) hex( const char * v ) { return (_Ostream_Manip(const char *))@{ v, 1, 0, 'x', { .all : 0 } }; }
-	_Ostream_Manip(const char *) wd( unsigned char w, const char * v ) { return (_Ostream_Manip(const char *))@{ v, w, 0, 's', { .all : 0 } }; }
-	_Ostream_Manip(const char *) wd( unsigned char w, unsigned char p, const char * v ) { return (_Ostream_Manip(const char *))@{ v, w, p, 's', { .flags.pc : true } }; }
-	_Ostream_Manip(const char *) & wd( unsigned char w, _Ostream_Manip(const char *) & fmt ) with(fmt) { wd = w; return fmt; }
-	_Ostream_Manip(const char *) & wd( unsigned char w, unsigned char p, _Ostream_Manip(const char *) & fmt ) with(fmt) { wd = w; pc = p; flags.pc = true; return fmt; }
+	_Ostream_Manip(const char *) bin( const char * val ) { return (_Ostream_Manip(const char *))@{ val, 1, 0, 'b', { .all : 0 } }; }
+	_Ostream_Manip(const char *) oct( const char * val ) { return (_Ostream_Manip(const char *))@{ val, 1, 0, 'o', { .all : 0 } }; }
+	_Ostream_Manip(const char *) hex( const char * val ) { return (_Ostream_Manip(const char *))@{ val, 1, 0, 'x', { .all : 0 } }; }
+	_Ostream_Manip(const char *) wd( unsigned char w, const char * val ) { return (_Ostream_Manip(const char *))@{ val, w, 0, 's', { .all : 0 } }; }
+	_Ostream_Manip(const char *) wd( unsigned char w, unsigned char pc, const char * val ) { return (_Ostream_Manip(const char *))@{ val, w, pc, 's', { .flags.pc : true } }; }
+	_Ostream_Manip(const char *) & wd( unsigned char w, _Ostream_Manip(const char *) & fmt ) { fmt.wd = w; return fmt; }
+	_Ostream_Manip(const char *) & wd( unsigned char w, unsigned char pc, _Ostream_Manip(const char *) & fmt ) { fmt.wd = w; fmt.pc = pc; fmt.flags.pc = true; return fmt; }
 	_Ostream_Manip(const char *) & left( _Ostream_Manip(const char *) & fmt ) { fmt.flags.left = true; return fmt; }
 	_Ostream_Manip(const char *) & nobase( _Ostream_Manip(const char *) & fmt ) { fmt.flags.nobsdp = true; return fmt; }
@@ -265,5 +269,5 @@
 	ostype & ?|?( ostype & os, _Ostream_Manip(const char *) f );
 	void ?|?( ostype & os, _Ostream_Manip(const char *) f );
-}
+} // ?|?
 
 
@@ -312,4 +316,7 @@
 	istype & ?|?( istype &, long double _Complex & );
 
+	// Cannot have char & and char * => cstr manipulator
+	// istype & ?|?( istype &, char * );
+
 	// manipulators
 	istype & ?|?( istype &, istype & (*)( istype & ) );
@@ -319,28 +326,30 @@
 } // distribution
 
-struct _Istream_cstrUC { char * s; };
-_Istream_cstrUC cstr( char * );
-forall( dtype istype | istream( istype ) ) istype & ?|?( istype &, _Istream_cstrUC );
-
-struct _Istream_cstrC { char * s; int size; };
-_Istream_cstrC cstr( char *, int size );
-forall( dtype istype | istream( istype ) ) istype & ?|?( istype &, _Istream_cstrC );
-
-#if 0
+//*********************************** Manipulators ***********************************
+
 struct _Istream_Cstr {
-	char * s, * scanset;
+	char * s;
+	const char * scanset;
 	int wd;												// width
-	bool ignore;										// no input argument
-};
-static inline _Istream_Cstr skip( char * s ) { return (_Istream_Cstr){ 0p, s, -1, false }; }
-static inline _Istream_Cstr incl( const char * scanset, char * s ) { return (_Istream_Cstr){ s, scanset, -1, false }; }
-static inline _Istream_Cstr excl( const char * scanset, char * s ) { return (_Istream_Cstr){ s, scanset, -1, false }; }
-static inline _Istream_Cstr cstr( char * s ) { return (_Istream_Cstr){ s, 0p, -1, false }; }
-static inline _Istream_Cstr ignore( char * s ) { return (_Istream_Cstr)@{ s, 0p, -1, true }; }
-static inline _Istream_Cstr ignore( _Istream_Cstr & fmt ) { fmt.ignore = true; return fmt; }
-static inline _Istream_Cstr wd( unsigned int w, char * s ) { return (_Istream_Cstr)@{ s, 0p, w, false }; }
+	union {
+		unsigned char all;
+		struct {
+			unsigned char ignore:1;						// do not change input argument
+			unsigned char inex:1;						// include/exclude characters in scanset
+		} flags;
+	};
+}; // _Istream_Cstr
+
+static inline _Istream_Cstr skip( const char * scanset ) { return (_Istream_Cstr){ 0p, scanset, -1, { .all : 0 } }; }
+static inline _Istream_Cstr incl( const char * scanset, char * s ) { return (_Istream_Cstr){ s, scanset, -1, { .flags.inex : false } }; }
+static inline _Istream_Cstr incl( const char * scanset, _Istream_Cstr & fmt ) { fmt.flags.inex = false; return fmt; }
+static inline _Istream_Cstr excl( const char * scanset, char * s ) { return (_Istream_Cstr){ s, scanset, -1, { .flags.inex : true } }; }
+static inline _Istream_Cstr excl( const char * scanset, _Istream_Cstr & fmt ) { fmt.flags.inex = true; return fmt; }
+static inline _Istream_Cstr cstr( char * s ) { return (_Istream_Cstr){ s, 0p, -1, { .all : 0 } }; }
+static inline _Istream_Cstr ignore( const char * s ) { return (_Istream_Cstr)@{ s, 0p, -1, { .flags.ignore : true } }; }
+static inline _Istream_Cstr ignore( _Istream_Cstr & fmt ) { fmt.flags.ignore = true; return fmt; }
+static inline _Istream_Cstr wd( unsigned int w, char * s ) { return (_Istream_Cstr)@{ s, 0p, w, { .all : 0 } }; }
+static inline _Istream_Cstr wd( unsigned int w, _Istream_Cstr & fmt ) { fmt.wd = w; return fmt; }
 forall( dtype istype | istream( istype ) ) istype & ?|?( istype &, _Istream_Cstr );
-
-//*********************************** Manipulators ***********************************
 
 forall( otype T )
@@ -348,14 +357,14 @@
 	T & val;											// polymorphic base-type
 	int wd;												// width
-	bool ignore;										// no input argument
+	bool ignore;										// do not change input argument
 }; // _Istream_Manip
 
 #define InputFMTDecl( T ) \
-static inline _Istream_Manip(T) ignore( T & v ) { return (_Istream_Manip(T))@{ v, -1, true }; } \
+static inline _Istream_Manip(T) ignore( const T & val ) { return (_Istream_Manip(T))@{ (T &)val, -1, true }; } \
 static inline _Istream_Manip(T) ignore( _Istream_Manip(T) & fmt ) { fmt.ignore = true; return fmt; } \
-static inline _Istream_Manip(T) wd( unsigned int w, T & v ) { return (_Istream_Manip(T))@{ v, w, false }; } \
+static inline _Istream_Manip(T) wd( unsigned int w, T & val ) { return (_Istream_Manip(T))@{ val, w, false }; } \
 forall( dtype istype | istream( istype ) ) { \
 	istype & ?|?( istype & is, _Istream_Manip(T) f ); \
-}
+} // ?|?
 
 InputFMTDecl( char )
@@ -378,5 +387,4 @@
 InputFMTDecl( double _Complex )
 InputFMTDecl( long double _Complex )
-#endif // 0
 
 
