Index: libcfa/src/fstream.cfa
===================================================================
--- libcfa/src/fstream.cfa	(revision 2dfdae3144c813f6364c134d7ef6550688eb0f50)
+++ libcfa/src/fstream.cfa	(revision f5d9c375ee9772424c2093334df7e1252c4d9076)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Jun 17 08:51:12 2023
-// Update Count     : 528
+// Last Modified On : Thu Jun 29 11:09:52 2023
+// Update Count     : 533
 //
 
@@ -43,4 +43,8 @@
 } // ?{}
 
+inline bool getNL$( ofstream & os ) { return os.sawNL$; }
+inline void setNL$( ofstream & os, bool state ) { os.sawNL$ = state; }
+inline bool getANL$( ofstream & os ) { return os.nlOnOff$; }
+
 inline bool sepPrt$( ofstream & os ) { setNL$( os, false ); return os.sepOnOff$; }
 inline void sepReset$( ofstream & os ) { os.sepOnOff$ = os.sepDefault$; }
@@ -48,7 +52,5 @@
 inline const char * sepGetCur$( ofstream & os ) { return os.sepCur$; }
 inline void sepSetCur$( ofstream & os, const char sepCur[] ) { os.sepCur$ = sepCur; }
-inline bool getNL$( ofstream & os ) { return os.sawNL$; }
-inline void setNL$( ofstream & os, bool state ) { os.sawNL$ = state; }
-inline bool getANL$( ofstream & os ) { return os.nlOnOff$; }
+
 inline bool getPrt$( ofstream & os ) { return os.prt$; }
 inline void setPrt$( ofstream & os, bool state ) { os.prt$ = state; }
@@ -63,23 +65,23 @@
 void ^?{}( ofstream & os ) { close( os ); }
 
-void sepOn( ofstream & os ) { os.sepOnOff$ = ! getNL$( os ); }
-void sepOff( ofstream & os ) { os.sepOnOff$ = false; }
-
-bool sepDisable( ofstream & os ) {
+void nlOn( ofstream & os ) { os.nlOnOff$ = true; }
+void nlOff( ofstream & os ) { os.nlOnOff$ = false; }
+
+void sep( ofstream & os ) { os.sepOnOff$ = ! getNL$( os ); }
+void nosep( ofstream & os ) { os.sepOnOff$ = false; }
+
+bool sepOn( ofstream & os ) {
+	bool temp = os.sepDefault$;
+	os.sepDefault$ = true;
+	if ( os.sepOnOff$ ) sepReset$( os );				// start of line ?
+	return temp;
+} // sepOn
+
+bool sepOff( ofstream & os ) {
 	bool temp = os.sepDefault$;
 	os.sepDefault$ = false;
 	sepReset$( os );
 	return temp;
-} // sepDisable
-
-bool sepEnable( ofstream & os ) {
-	bool temp = os.sepDefault$;
-	os.sepDefault$ = true;
-	if ( os.sepOnOff$ ) sepReset$( os );				// start of line ?
-	return temp;
-} // sepEnable
-
-void nlOn( ofstream & os ) { os.nlOnOff$ = true; }
-void nlOff( ofstream & os ) { os.nlOnOff$ = false; }
+} // sepOff
 
 const char * sepGet( ofstream & os ) { return os.separator$; }
Index: libcfa/src/fstream.hfa
===================================================================
--- libcfa/src/fstream.hfa	(revision 2dfdae3144c813f6364c134d7ef6550688eb0f50)
+++ libcfa/src/fstream.hfa	(revision f5d9c375ee9772424c2093334df7e1252c4d9076)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Jun  5 22:00:20 2023
-// Update Count     : 246
+// Last Modified On : Thu Jun 29 11:08:31 2023
+// Update Count     : 251
 //
 
@@ -40,4 +40,8 @@
 
 // private
+bool getNL$( ofstream & );
+void setNL$( ofstream &, bool );
+bool getANL$( ofstream & );
+
 bool sepPrt$( ofstream & );
 void sepReset$( ofstream & );
@@ -45,7 +49,5 @@
 const char * sepGetCur$( ofstream & );
 void sepSetCur$( ofstream &, const char [] );
-bool getNL$( ofstream & );
-void setNL$( ofstream &, bool );
-bool getANL$( ofstream & );
+
 bool getPrt$( ofstream & );
 void setPrt$( ofstream &, bool );
@@ -55,11 +57,11 @@
 
 // public
-void sepOn( ofstream & );
-void sepOff( ofstream & );
-bool sepDisable( ofstream & );
-bool sepEnable( ofstream & );
 void nlOn( ofstream & );
 void nlOff( ofstream & );
 
+void sep( ofstream & );
+void nosep( ofstream & );
+bool sepOn( ofstream & );
+bool sepOff( ofstream & );
 const char * sepGet( ofstream & );
 void sepSet( ofstream &, const char [] );
Index: libcfa/src/iostream.cfa
===================================================================
--- libcfa/src/iostream.cfa	(revision 2dfdae3144c813f6364c134d7ef6550688eb0f50)
+++ libcfa/src/iostream.cfa	(revision f5d9c375ee9772424c2093334df7e1252c4d9076)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Jan  9 09:27:58 2023
-// Update Count     : 1361
+// Last Modified On : Thu Jun 29 10:12:39 2023
+// Update Count     : 1380
 //
 
@@ -50,5 +50,5 @@
 		fmt( os, "%c", c );
 		if ( c == '\n' ) setNL$( os, true );
-		return sepOff( os );
+		return nosep( os );
 	} // ?|?
 	void ?|?( ostype & os, char c ) {
@@ -284,5 +284,5 @@
 
 	  if ( s == 0p ) { fmt( os, "%s", "0p" ); return os; } // null pointer
-	  if ( s[0] == '\0' ) { sepOff( os ); return os; } // null string => no separator
+	  if ( s[0] == '\0' ) { nosep( os ); return os; }	// null string => no leading/trailing separator
 
 		// first character IS NOT spacing or closing punctuation => add left separator
@@ -300,7 +300,7 @@
 		fmt( os, "%s", s );								// fmt resets seperator, but reset it again
 		if ( sepPrt$( os ) && mask[ ch ] != Open && mask[ ch ] != OpenClose ) {
-			sepOn( os );
+			sep( os );
 		} else {
-			sepOff( os );
+			nosep( os );
 		} // if
 		if ( ch == '\n' ) setNL$( os, true );			// check *AFTER* sepPrt$ call above as it resets NL flag
@@ -351,17 +351,9 @@
 	} // ?|?
 
-	ostype & sep( ostype & os ) {
-		return (ostype &)(os | sepGet( os ));
-	} // sep
-
-	ostype & sepTuple( ostype & os ) {
-		return os | sepGetTuple( os );
-	} // sepTuple
-
 	ostype & nl( ostype & os ) {
 		(ostype &)(os | '\n');
 		setPrt$( os, false );							// turn off
 		setNL$( os, true );
-		return sepOff( os );							// prepare for next line
+		return nosep( os );								// prepare for next line
 	} // nl
 
@@ -371,4 +363,32 @@
 	} // nonl
 
+	ostype & nlOn( ostype & os ) {
+		nlOn( os );										// call void returning
+		return os;
+	} // nlOn
+
+	ostype & nlOff( ostype & os ) {
+		nlOff( os );									// call void returning
+		return os;
+	} // nlOff
+
+	ostype & sepVal( ostype & os ) {
+		return (ostype &)(os | sepGet( os ));
+	} // sepVal
+
+	ostype & sepTupleVal( ostype & os ) {
+		return os | sepGetTuple( os );
+	} // sepTupleVal
+
+	ostype & sep( ostype & os ) {
+		sep( os );										// call void returning
+		return os;
+	} // sep
+
+	ostype & nosep( ostype & os ) {
+		nosep( os );									// call void returning
+		return os;
+	} // nosep
+
 	ostype & sepOn( ostype & os ) {
 		sepOn( os );									// call void returning
@@ -380,24 +400,4 @@
 		return os;
 	} // sepOff
-
-	ostype & sepEnable( ostype & os ) {
-		sepEnable( os );								// call void returning
-		return os;
-	} // sepEnable
-
-	ostype & sepDisable( ostype & os ) {
-		sepDisable( os );								// call void returning
-		return os;
-	} // sepDisable
-
-	ostype & nlOn( ostype & os ) {
-		nlOn( os );										// call void returning
-		return os;
-	} // nlOn
-
-	ostype & nlOff( ostype & os ) {
-		nlOff( os );									// call void returning
-		return os;
-	} // nlOff
 } // distribution
 
@@ -550,5 +550,5 @@
 		if ( cnt == 1 ) {
 			if ( f.flags.left ) { wd -= maxdig; f.wd = wd < 0 ? 1 : wd; } // update and restore f.wd for printing end chunk
-			sepOff( os );								// no seperator between chunks
+			nosep( os );								// no seperator between chunks
 		} // if
 	} else {											// print start chunk
@@ -595,5 +595,5 @@
 		else { f.pc = maxdig; f.flags.pc = true; }		// left pad with precision
 
-		if ( cnt != 0 ) sepOff( os );					// no seperator between chunks
+		if ( cnt != 0 ) nosep( os );					// no seperator between chunks
 		f.wd = wd;										// reset f.wd for next chunk
 		f.flags.sign = false;							// no leading +/- sign
@@ -773,5 +773,6 @@
 		} // if
 
-		if ( sepPrt$( os ) ) fmt( os, "%s", sepGetCur$( os ) );
+		if ( f.val[0] != '\0' &&						// null string => no leading separator
+			 sepPrt$( os ) ) fmt( os, "%s", sepGetCur$( os ) );
 
 		#define SFMTNP "% * "
@@ -795,4 +796,5 @@
 			fmt( os, &fmtstr[star], f.wd, f.pc, f.val );
 		} // if
+		if ( f.val[0] == '\0' ) { nosep( os ); }		// null string => no trailing separator
 		return os;
 	} // ?|?
Index: libcfa/src/iostream.hfa
===================================================================
--- libcfa/src/iostream.hfa	(revision 2dfdae3144c813f6364c134d7ef6550688eb0f50)
+++ libcfa/src/iostream.hfa	(revision f5d9c375ee9772424c2093334df7e1252c4d9076)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Jun 15 22:34:31 2023
-// Update Count     : 411
+// Last Modified On : Thu Jun 29 11:07:25 2023
+// Update Count     : 427
 //
 
@@ -36,11 +36,11 @@
 	void setPrt$( ostype &, bool );						// set fmt called in output cascade
 	// public
-	void sepOn( ostype & );								// turn separator state on
-	void sepOff( ostype & );							// turn separator state off
-	bool sepDisable( ostype & );						// set default state to off, and return previous state
-	bool sepEnable( ostype & );							// set default state to on, and return previous state
 	void nlOn( ostype & );								// turn auto-newline state on
 	void nlOff( ostype & );								// turn auto-newline state off
 
+	void sep( ostype & );								// turn separator state on
+	void nosep( ostype & );								// turn separator state off
+	bool sepOn( ostype & );								// set default state to on, and return previous state
+	bool sepOff( ostype & );							// set default state to off, and return previous state
 	const char * sepGet( ostype & );					// get separator string
 	void sepSet( ostype &, const char [] );				// set separator to string (15 character maximum)
@@ -135,14 +135,16 @@
 	ostype & ?|?( ostype &, ostype & (*)( ostype & ) );
 	void ?|?( ostype &, ostype & (*)( ostype & ) );
+
 	ostype & nl( ostype & );
 	ostype & nonl( ostype & );
+	ostype & nlOn( ostype & );
+	ostype & nlOff( ostype & );
+
+	ostype & sepVal( ostype & );
+	ostype & sepTupleVal( ostype & );
 	ostype & sep( ostype & );
-	ostype & sepTuple( ostype & );
+	ostype & nosep( ostype & );
 	ostype & sepOn( ostype & );
 	ostype & sepOff( ostype & );
-	ostype & sepDisable( ostype & );
-	ostype & sepEnable( ostype & );
-	ostype & nlOn( ostype & );
-	ostype & nlOff( ostype & );
 } // distribution
 
Index: libcfa/src/strstream.cfa
===================================================================
--- libcfa/src/strstream.cfa	(revision 2dfdae3144c813f6364c134d7ef6550688eb0f50)
+++ libcfa/src/strstream.cfa	(revision f5d9c375ee9772424c2093334df7e1252c4d9076)
@@ -10,6 +10,6 @@
 // Created On       : Thu Apr 22 22:24:35 2021
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sun Oct 10 16:13:20 2021
-// Update Count     : 101
+// Last Modified On : Thu Jun 29 10:59:00 2023
+// Update Count     : 105
 //
 
@@ -32,4 +32,7 @@
 
 // private
+inline bool getNL$( ostrstream & os ) { return os.sawNL$; }
+inline void setNL$( ostrstream & os, bool state ) { os.sawNL$ = state; }
+inline bool getANL$( ostrstream & os ) { return os.nlOnOff$; }
 inline bool sepPrt$( ostrstream & os ) { setNL$( os, false ); return os.sepOnOff$; }
 inline void sepReset$( ostrstream & os ) { os.sepOnOff$ = os.sepDefault$; }
@@ -37,11 +40,11 @@
 inline const char * sepGetCur$( ostrstream & os ) { return os.sepCur$; }
 inline void sepSetCur$( ostrstream & os, const char sepCur[] ) { os.sepCur$ = sepCur; }
-inline bool getNL$( ostrstream & os ) { return os.sawNL$; }
-inline void setNL$( ostrstream & os, bool state ) { os.sawNL$ = state; }
-inline bool getANL$( ostrstream & os ) { return os.nlOnOff$; }
 inline bool getPrt$( ostrstream & os ) { return os.prt$; }
 inline void setPrt$( ostrstream & os, bool state ) { os.prt$ = state; }
 
 // public
+void nlOn( ostrstream & os ) { os.nlOnOff$ = true; }
+void nlOff( ostrstream & os ) { os.nlOnOff$ = false; }
+
 void ?{}( ostrstream & os, char buf[], size_t size ) {
 	os.buf$ = buf;
@@ -58,23 +61,20 @@
 } // ?{}
 
-void sepOn( ostrstream & os ) { os.sepOnOff$ = ! getNL$( os ); }
-void sepOff( ostrstream & os ) { os.sepOnOff$ = false; }
+void sep( ostrstream & os ) { os.sepOnOff$ = ! getNL$( os ); }
+void nosep( ostrstream & os ) { os.sepOnOff$ = false; }
 
-bool sepDisable( ostrstream & os ) {
+bool sepOn( ostrstream & os ) {
+	bool temp = os.sepDefault$;
+	os.sepDefault$ = true;
+	if ( os.sepOnOff$ ) sepReset$( os );				// start of line ?
+	return temp;
+} // sepOn
+
+bool sepOff( ostrstream & os ) {
 	bool temp = os.sepDefault$;
 	os.sepDefault$ = false;
 	sepReset$( os );
 	return temp;
-} // sepDisable
-
-bool sepEnable( ostrstream & os ) {
-	bool temp = os.sepDefault$;
-	os.sepDefault$ = true;
-	if ( os.sepOnOff$ ) sepReset$( os );				// start of line ?
-	return temp;
-} // sepEnable
-
-void nlOn( ostrstream & os ) { os.nlOnOff$ = true; }
-void nlOff( ostrstream & os ) { os.nlOnOff$ = false; }
+} // sepOff
 
 const char * sepGet( ostrstream & os ) { return os.separator$; }
Index: libcfa/src/strstream.hfa
===================================================================
--- libcfa/src/strstream.hfa	(revision 2dfdae3144c813f6364c134d7ef6550688eb0f50)
+++ libcfa/src/strstream.hfa	(revision f5d9c375ee9772424c2093334df7e1252c4d9076)
@@ -10,6 +10,6 @@
 // Created On       : Thu Apr 22 22:20:59 2021
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sun Oct 10 10:14:22 2021
-// Update Count     : 47
+// Last Modified On : Thu Jun 29 10:58:58 2023
+// Update Count     : 51
 // 
 
@@ -53,11 +53,11 @@
 
 // public
-void sepOn( ostrstream & );
-void sepOff( ostrstream & );
-bool sepDisable( ostrstream & );
-bool sepEnable( ostrstream & );
 void nlOn( ostrstream & );
 void nlOff( ostrstream & );
 
+void sep( ostrstream & );
+void nosep( ostrstream & );
+bool sepOn( ostrstream & );
+bool sepOff( ostrstream & );
 const char * sepGet( ostrstream & );
 void sepSet( ostrstream &, const char [] );
