Index: libcfa/src/collections/string.hfa
===================================================================
--- libcfa/src/collections/string.hfa	(revision 5b21636bba032ec700286a9e66bc6fae49054e5f)
+++ libcfa/src/collections/string.hfa	(revision b19b3623da9e91bd1dc2397cc1211cf5def36992)
@@ -10,6 +10,6 @@
 // Created On       : Fri Sep 03 11:00:00 2021
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sun Sep 14 10:58:28 2025
-// Update Count     : 311
+// Last Modified On : Sat May  2 19:09:55 2026
+// Update Count     : 322
 //
 
@@ -87,13 +87,16 @@
 
 static inline {
-	_Ostream_Manip(string) bin( string s ) { return (_Ostream_Manip(string))@{ s, 1, 0, 'b', { .all = 0 } }; }
-	_Ostream_Manip(string) oct( string s ) { return (_Ostream_Manip(string))@{ s, 1, 0, 'o', { .all = 0 } }; }
-	_Ostream_Manip(string) hex( string s ) { return (_Ostream_Manip(string))@{ s, 1, 0, 'x', { .all = 0 } }; }
-	_Ostream_Manip(string) wd( unsigned int w, string s ) { return (_Ostream_Manip(string))@{ s, w, 0, 's', { .all = 0 } }; }
-	_Ostream_Manip(string) wd( unsigned int w, unsigned int pc, string s ) { return (_Ostream_Manip(string))@{ s, w, pc, 's', { .flags.pc = true } }; }
-	_Ostream_Manip(string) & wd( unsigned int w, _Ostream_Manip(string) & fmt ) { fmt.wd = w; return fmt; }
-	_Ostream_Manip(string) & wd( unsigned int w, unsigned int pc, _Ostream_Manip(string) & fmt ) { fmt.wd = w; fmt.pc = pc; fmt.flags.pc = true; return fmt; }
+	_Ostream_Manip(string) bin( string s ) { return (_Ostream_Manip(string))@{ .val = s, .wd = 1, .pc = 0, .base = 'b', { .all = 0 } }; }
+	_Ostream_Manip(string) oct( string s ) { return (_Ostream_Manip(string))@{ .val = s, .wd = 1, .pc = 0, .base = 'o', { .all = 0 } }; }
+	_Ostream_Manip(string) hex( string s ) { return (_Ostream_Manip(string))@{ .val = s, .wd = 1, .pc = 0, .base = 'x', { .all = 0 } }; }
+	_Ostream_Manip(string) quote( string s ) { return (_Ostream_Manip(string))@{ .val = s, .wd = 1, .pc = 0, .base = 's', { .flags.quote = true } }; }
+	_Ostream_Manip(string) wd( unsigned int wd, string s ) { return (_Ostream_Manip(string))@{ .val = s, .wd = wd, .pc = 0, .base = 's', { .all = 0 } }; }
+	_Ostream_Manip(string) wd( unsigned int wd, unsigned int pc, string s ) { return (_Ostream_Manip(string))@{ .val = s, .wd = wd, .pc = pc, .base = 's', { .flags.pc = true } }; }
+	_Ostream_Manip(string) & wd( unsigned int wd, _Ostream_Manip(string) & fmt ) { fmt.wd = wd; return fmt; }
+	_Ostream_Manip(string) & wd( unsigned int wd, unsigned int pc, _Ostream_Manip(string) & fmt ) { fmt.wd = wd; fmt.pc = pc; fmt.flags.pc = true; return fmt; }
 	_Ostream_Manip(string) & left( _Ostream_Manip(string) & fmt ) { fmt.flags.left = true; return fmt; }
 	_Ostream_Manip(string) & nobase( _Ostream_Manip(string) & fmt ) { fmt.flags.nobsdp = true; return fmt; }
+	_Ostream_Manip(string) & upcase( _Ostream_Manip(string) & fmt ) { if ( fmt.base == 'x' || fmt.base == 'b' ) fmt.base -= 32; /* upper case */ return fmt; }
+	_Ostream_Manip(string) & quote( _Ostream_Manip(string) & fmt ) { fmt.flags.quote = true; return fmt; } \
 } // distribution
 
Index: libcfa/src/iostream.cfa
===================================================================
--- libcfa/src/iostream.cfa	(revision 5b21636bba032ec700286a9e66bc6fae49054e5f)
+++ libcfa/src/iostream.cfa	(revision b19b3623da9e91bd1dc2397cc1211cf5def36992)
@@ -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;
Index: libcfa/src/iostream.hfa
===================================================================
--- libcfa/src/iostream.hfa	(revision 5b21636bba032ec700286a9e66bc6fae49054e5f)
+++ libcfa/src/iostream.hfa	(revision b19b3623da9e91bd1dc2397cc1211cf5def36992)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Jan 14 21:23:53 2026
-// Update Count     : 772
+// Last Modified On : Sat May  2 18:48:56 2026
+// Update Count     : 780
 //
 
@@ -193,4 +193,5 @@
 	unsigned char sign:1;								// plus / minus sign
 	unsigned char pad0:1;								// zero pad
+	unsigned char quote:1;								// print quotes
 };
 
@@ -224,7 +225,7 @@
 	_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 val ) { return (_Ostream_Manip(T))@{ .val = val, .wd = 1, .pc = 0, .base = CODE, { .flags.sign = true } }; } \
 	_Ostream_Manip(T) & sign( _Ostream_Manip(T) & fmt ) { fmt.flags.sign = true; return fmt; } \
+	_Ostream_Manip(T) & pad0( _Ostream_Manip(T) & fmt ) { fmt.flags.pad0 = true; return fmt; } \
 } /* distribution */ \
 forall( ostype & | basic_ostream( ostype ) ) { \
@@ -288,9 +289,11 @@
 	_Ostream_Manip(char) oct( char c ) { return (_Ostream_Manip(char))@{ .val = c, .wd = 1, .pc = 0, .base = 'o', { .all = 0 } }; }
 	_Ostream_Manip(char) hex( char c ) { return (_Ostream_Manip(char))@{ .val = c, .wd = 1, .pc = 0, .base = 'x', { .all = 0 } }; }
-	_Ostream_Manip(char) wd( unsigned int wd, char c ) { return (_Ostream_Manip(char))@{ c, wd, 0, .base = 'c', { .all = 0 } }; }
+	_Ostream_Manip(char) quote( char c ) { return (_Ostream_Manip(char))@{ .val = c, .wd = 1, .pc = 0, .base = 'c', { .flags.quote = true } }; }
+	_Ostream_Manip(char) wd( unsigned int wd, char c ) { return (_Ostream_Manip(char))@{ .val = c, .wd = wd, .pc = 0, .base = 'c', { .all = 0 } }; }
 	_Ostream_Manip(char) & wd( unsigned int wd, _Ostream_Manip(char) & fmt ) { fmt.wd = wd; 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; }
 	_Ostream_Manip(char) & nobase( _Ostream_Manip(char) & fmt ) { fmt.flags.nobsdp = true; return fmt; }
+	_Ostream_Manip(char) & quote( _Ostream_Manip(char) & fmt ) { fmt.flags.quote = true; return fmt; }
 } // distribution
 forall( ostype & | basic_ostream( ostype ) ) {
@@ -305,10 +308,13 @@
 	_Ostream_Manip(const char *) oct( const char s[] ) { return (_Ostream_Manip(const char *))@{ .val = s, .wd = 1, .pc = 0, .base = 'o', { .all = 0 } }; }
 	_Ostream_Manip(const char *) hex( const char s[] ) { return (_Ostream_Manip(const char *))@{ .val = s, .wd = 1, .pc = 0, .base = 'x', { .all = 0 } }; }
-	_Ostream_Manip(const char *) wd( unsigned int wd, const char s[] ) { return (_Ostream_Manip(const char *))@{ s, wd, 0, .base = 's', { .all = 0 } }; }
-	_Ostream_Manip(const char *) wd( unsigned int wd, unsigned int pc, const char s[] ) { return (_Ostream_Manip(const char *))@{ s, .wd = wd, .pc = pc, .base = 's', { .flags.pc = true } }; }
+	_Ostream_Manip(const char *) quote( const char s[] ) { return (_Ostream_Manip(const char *))@{ .val = s, .wd = 1, .pc = 0, .base = 's', { .flags.quote = true } }; }
+	_Ostream_Manip(const char *) wd( unsigned int wd, const char s[] ) { return (_Ostream_Manip(const char *))@{ .val = s, .wd = wd, .pc = 0, .base = 's', { .all = 0 } }; }
+	_Ostream_Manip(const char *) wd( unsigned int wd, unsigned int pc, const char s[] ) { return (_Ostream_Manip(const char *))@{ .val = s, .wd = wd, .pc = pc, .base = 's', { .flags.pc = true } }; }
 	_Ostream_Manip(const char *) & wd( unsigned int wd, _Ostream_Manip(const char *) & fmt ) { fmt.wd = wd; return fmt; }
 	_Ostream_Manip(const char *) & wd( unsigned int wd, unsigned int pc, _Ostream_Manip(const char *) & fmt ) { fmt.wd = wd; 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 *) & upcase( _Ostream_Manip(const char *) & fmt ) { if ( fmt.base == 'x' || fmt.base == 'b' ) fmt.base -= 32; /* upper case */ return fmt; }
 	_Ostream_Manip(const char *) & nobase( _Ostream_Manip(const char *) & fmt ) { fmt.flags.nobsdp = true; return fmt; }
+	_Ostream_Manip(const char *) & quote( _Ostream_Manip(const char *) & fmt ) { fmt.flags.quote = true; return fmt; } \
 } // distribution
 forall( ostype & | basic_ostream( ostype ) ) {
