Index: src/libcfa/iostream
===================================================================
--- src/libcfa/iostream	(revision 3f8dd01362faf0f98d59ad95a39521b5ccefbad9)
+++ src/libcfa/iostream	(revision b2e2e34f66eea1dc99bc4c6e66a524ce5760688b)
@@ -10,10 +10,12 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Aug 24 08:14:29 2017
-// Update Count     : 133
+// Last Modified On : Mon Sep 11 09:17:07 2017
+// Update Count     : 137
 //
 
 #pragma once
 
+#include <uchar.h>
+#include <wchar.h>
 #include "iterator"
 
@@ -78,4 +80,7 @@
 
 forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, const char * );
+forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, const char16_t * );
+forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, const char32_t * );
+forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, const wchar_t * );
 forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, const void * );
 
@@ -118,4 +123,6 @@
 
 forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, char & );
+forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, signed char & );
+forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, unsigned char & );
 
 forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, short int & );
Index: src/libcfa/iostream.c
===================================================================
--- src/libcfa/iostream.c	(revision 3f8dd01362faf0f98d59ad95a39521b5ccefbad9)
+++ src/libcfa/iostream.c	(revision b2e2e34f66eea1dc99bc4c6e66a524ce5760688b)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Aug 24 08:41:53 2017
-// Update Count     : 405
+// Last Modified On : Mon Sep 11 09:21:24 2017
+// Update Count     : 420
 //
 
@@ -145,5 +145,5 @@
 
 forall( dtype ostype | ostream( ostype ) )
-ostype * ?|?( ostype * os, const char * cp ) {
+ostype * ?|?( ostype * os, const char * str ) {
 	enum { Open = 1, Close, OpenClose };
 	static const unsigned char mask[256] @= {
@@ -161,8 +161,8 @@
 	}; // mask
 
-  if ( cp[0] == '\0' ) { sepOff( os ); return os; }		// null string => no separator
+  if ( str[0] == '\0' ) { sepOff( os ); return os; }		// null string => no separator
 
 	// first character IS NOT spacing or closing punctuation => add left separator
-	unsigned char ch = cp[0];							// must make unsigned
+	unsigned char ch = str[0];							// must make unsigned
 	if ( sepPrt( os ) && mask[ ch ] != Close && mask[ ch ] != OpenClose ) {
 		fmt( os, "%s", sepGetCur( os ) );
@@ -173,6 +173,6 @@
 
 	// last character IS spacing or opening punctuation => turn off separator for next item
-	size_t len = strlen( cp );
-	ch = cp[len - 1];									// must make unsigned
+	size_t len = strlen( str );
+	ch = str[len - 1];									// must make unsigned
 	if ( sepPrt( os ) && mask[ ch ] != Open && mask[ ch ] != OpenClose ) {
 		sepOn( os );
@@ -181,5 +181,26 @@
 	} // if
 	if ( ch == '\n' ) setNL( os, true );				// check *AFTER* sepPrt call above as it resets NL flag
-	return write( os, cp, len );
+	return write( os, str, len );
+} // ?|?
+
+forall( dtype ostype | ostream( ostype ) )
+ostype * ?|?( ostype * os, const char16_t * str ) {
+	if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
+	fmt( os, "%ls", str );
+	return os;
+} // ?|?
+
+forall( dtype ostype | ostream( ostype ) )
+ostype * ?|?( ostype * os, const char32_t * str ) {
+	if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
+	fmt( os, "%ls", str );
+	return os;
+} // ?|?
+
+forall( dtype ostype | ostream( ostype ) )
+ostype * ?|?( ostype * os, const wchar_t * str ) {
+	if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
+	fmt( os, "%ls", str );
+	return os;
 } // ?|?
 
@@ -277,4 +298,16 @@
 
 forall( dtype istype | istream( istype ) )
+istype * ?|?( istype * is, signed char & sc ) {
+	fmt( is, "%hhd", &sc );
+	return is;
+} // ?|?
+
+forall( dtype istype | istream( istype ) )
+istype * ?|?( istype * is, unsigned char & usc ) {
+	fmt( is, "%hhu", &usc );
+	return is;
+} // ?|?
+
+forall( dtype istype | istream( istype ) )
 istype * ?|?( istype * is, short int & si ) {
 	fmt( is, "%hd", &si );
