Index: libcfa/src/iostream.cfa
===================================================================
--- libcfa/src/iostream.cfa	(revision 0528d798fb35724a11e41393acbcc3a4ae458586)
+++ libcfa/src/iostream.cfa	(revision 3bfa80f8617d6b54dd1bf0bc96e1a0e9b68cc5be)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sun May 18 08:23:40 2025
-// Update Count     : 2175
+// Last Modified On : Sun May  3 08:08:29 2026
+// Update Count     : 2241
 //
 
@@ -52,5 +52,5 @@
 		fmt( os, "%c", c );
 		if ( c == '\n' ) setNL$( os, true );
-		return nosep( os );
+		return nosep( os );								// no separator after char
 	} // ?|?
 	OSTYPE_VOID_IMPL( os, char )
@@ -204,5 +204,4 @@
 	ostype & ?|?( ostype & os, float _Complex fc ) with ( basic_ostream_table ) {
 		if ( sepPrt$( os ) ) fmt( os, "%s", sepGetCur$( os ) );
-//		os | crealf( fc ) | nonl;
 		PRINT_WITH_DP( os, "%'g", crealf( fc ) );
 		PRINT_WITH_DP( os, "%'+g", cimagf( fc ) );
@@ -271,5 +270,4 @@
 		if ( ch == '\n' ) setNL$( os, true );			// check *AFTER* sepPrt$ call above as it resets NL flag
 		return os;
-//		return write( os, s, len );
 	} // ?|?
 	OSTYPE_VOID_IMPL( os, const char * )
@@ -645,5 +643,5 @@
 #define FLOATING_POINT_FMT_IMPL( T, DFMTNP, DFMTP ) \
 forall( ostype & | basic_ostream( ostype ) ) { \
-	static void eng( T &value, int & pc, int & exp10 ) { \
+	static void eng( T & value, int & pc, int & exp10 ) { \
 		exp10 = lrint( floor( log10( abs( value ) ) ) ); /* round to desired precision */ \
 		if ( exp10 < 0 ) exp10 -= 2; \
@@ -697,12 +695,18 @@
 			fmtuc.flags.pc = f.flags.pc;
 			fmtuc.flags.nobsdp = f.flags.nobsdp;
-//			os | fmtuc | nonl;
+			return (ostype &)(os | fmtuc);
+		} // if
+		if ( f.flags.quote ) {							// print as string
+			char qv[] = "' '";
+			qv[1] = f.val;
+			f.flags.quote = false;						// already quoted
+			_Ostream_Manip(const char *) fmtuc @= { qv, f.wd, f.pc, 's', {f.all} };
 			(ostype &)(os | fmtuc);
-			return os;
-		} // if
-
-		if ( sepPrt$( os ) ) fmt( os, "%s", sepGetCur$( os ) );
-
-		#define CFMTNP "% * "
+			return nosep( os );							// no separator after char
+		} // if
+
+		if ( sepPrt$( os ) ) fmt( os, "%s", sepGetCur$( os ) );
+
+		#define CFMTNP "% *c"
 		char fmtstr[sizeof(CFMTNP)];					// sizeof includes '\0'
 		memcpy( &fmtstr, CFMTNP, sizeof(CFMTNP) );
@@ -713,8 +717,7 @@
 		fmtstr[star] = '%';
 
-		fmtstr[sizeof(CFMTNP)-2] = f.base;				// sizeof includes '\0'
 		// printf( "%d %s\n", f.wd, &fmtstr[star] );
 		fmt( os, &fmtstr[star], f.wd, f.val );
-		return os;
+		return nosep( os );								// no separator after char
 	} // ?|?
 	OSTYPE_VOID_IMPL( os, _Ostream_Manip(char) )
@@ -733,15 +736,25 @@
 			for ( i; 0 ~ @ : @; f.val[i] != '\0' ) {
 				fmtuc.val = f.val[i];
-//				os | fmtuc | nonl;
 				(ostype &)(os | fmtuc);
 			} // for
 			return os;
 		} // if
+		if ( f.flags.quote ) {							// print as string
+			int len = strlen( f.val );
+			char qv[len + 3];							// space for quotes and '\0'
+			qv[0] = '"';								// copy string surrounded with quotes
+			strcpy( &qv[1], f.val );
+			qv[len + 1] = '"';
+			qv[len + 2] = '\0';
+			f.flags.quote = false;						// already quoted
+			_Ostream_Manip(const char *) fmtuc @= { qv, f.wd, f.pc, 's', {f.all} };
+			return (ostype &)(os | fmtuc);
+		} // if
 
 		if ( f.val[0] != '\0' &&						// null string => no leading separator
 			 sepPrt$( os ) ) fmt( os, "%s", sepGetCur$( os ) );
 
-		#define SFMTNP "% * "
-		#define SFMTP "% *.* "
+		#define SFMTNP "% *s"
+		#define SFMTP "% *.*s"
 		char fmtstr[sizeof(SFMTP)];						// sizeof includes '\0'
 		if ( ! f.flags.pc ) memcpy( &fmtstr, SFMTNP, sizeof(SFMTNP) );
@@ -755,8 +768,6 @@
 		if ( ! f.flags.pc ) {							// no precision
 			// printf( "%d %s\n", f.wd, &fmtstr[star] );
-			fmtstr[sizeof(SFMTNP)-2] = f.base;			// sizeof includes '\0'
 			fmt( os, &fmtstr[star], f.wd, f.val );
 		} else {										// precision
-			fmtstr[sizeof(SFMTP)-2] = f.base;			// sizeof includes '\0'
 			// printf( "%d %d %s\n", f.wd, f.pc, &fmtstr[star] );
 			fmt( os, &fmtstr[star], f.wd, f.pc, f.val );
@@ -796,8 +807,8 @@
 		for () {
 			int args = fmt( is, "%c", &temp );			// can be called with EOF on
-			if ( eof( is ) ) throwResume ExceptionInst( end_of_file );
+		  if ( eof( is ) ) throwResume ExceptionInst( end_of_file );
 			assert( args == 1 );						// if not EOF => a single character must be read
 			// do not overwrite parameter with newline unless appropriate
-			if ( temp != '\n' || getANL$( is ) ) { c = temp; break; }
+		  if ( temp != '\n' || getANL$( is ) ) { c = temp; break; }
 		} // for
 		return is;
