diff --git a/qse/include/qse/cmn/str.h b/qse/include/qse/cmn/str.h
index a2fc1c12..29ff7dc7 100644
--- a/qse/include/qse/cmn/str.h
+++ b/qse/include/qse/cmn/str.h
@@ -1,5 +1,5 @@
 /*
- * $Id: str.h 410 2011-03-23 15:07:24Z hyunghwan.chung $
+ * $Id: str.h 411 2011-03-24 14:20:55Z hyunghwan.chung $
  *
     Copyright 2006-2009 Chung, Hyung-Hwan.
     This file is part of QSE.
@@ -244,85 +244,196 @@ qse_size_t qse_wcsxncpy (
 #	define qse_strxncpy(buf,bsz,str,len) qse_wcsxncpy(buf,bsz,str,len)
 #endif
 
+qse_size_t qse_mbsput (
+	qse_mchar_t*       buf, 
+	const qse_mchar_t* str
+);
+
+qse_size_t qse_wcsput (
+	qse_wchar_t*       buf, 
+	const qse_wchar_t* str
+);
+
 /**
- * The qse_strxput() function copies the string @a str into the buffer @a buf
+ * The qse_mbsxput() function copies the string @a str into the buffer @a buf
  * of the size @a bsz. Unlike qse_strxcpy(), it does not null-terminate the
  * buffer.
  */
-qse_size_t qse_strxput (
-	qse_char_t*       buf, 
-	qse_size_t        bsz,
-	const qse_char_t* str
-);
-
-qse_size_t qse_strxnput (
-	qse_char_t*       buf,
-	qse_size_t        bsz,
-	const qse_char_t* str,
-	qse_size_t        len
+qse_size_t qse_mbsxput (
+	qse_mchar_t*       buf, 
+	qse_size_t         bsz,
+	const qse_mchar_t* str
 );
 
 /**
- * The qse_strfcpy() function formats a string by position.
+ * The qse_wcsxput() function copies the string @a str into the buffer @a buf
+ * of the size @a bsz. Unlike qse_strxcpy(), it does not null-terminate the
+ * buffer.
+ */
+qse_size_t qse_wcsxput (
+	qse_wchar_t*       buf, 
+	qse_size_t         bsz,
+	const qse_wchar_t* str
+);
+
+qse_size_t qse_mbsxnput (
+	qse_mchar_t*       buf,
+	qse_size_t        bsz,
+	const qse_mchar_t* str,
+	qse_size_t        len
+);
+
+qse_size_t qse_wcsxnput (
+	qse_wchar_t*       buf,
+	qse_size_t         bsz,
+	const qse_wchar_t* str,
+	qse_size_t         len
+);
+
+#ifdef QSE_CHAR_IS_MCHAR
+#	define qse_strput(buf,str)           qse_mbsput(buf,str)
+#	define qse_strxput(buf,bsz,str)      qse_mbsxput(buf,bsz,str)
+#	define qse_strxnput(buf,bsz,str,len) qse_mbsxnput(buf,bsz,str,len)
+#else
+#	define qse_strput(buf,str)           qse_wcsput(buf,str)
+#	define qse_strxput(buf,bsz,str)      qse_wcsxput(buf,bsz,str)
+#	define qse_strxnput(buf,bsz,str,len) qse_wcsxnput(buf,bsz,str,len)
+#endif
+
+/**
+ * The qse_mbsfcpy() function formats a string by position.
  * The position specifier is a number enclosed in ${ and }.
  * When ${ is preceeded by a backslash, it is treated literally. 
  * See the example below:
  * @code
  *  qse_char_t buf[256]
- *  qse_char_t* colors[] = { QSE_T("blue"), QSE_T("green"), QSE_T("red") };
- *  qse_strfcpy(buf, QSE_T("RGB: ${2}, ${1}, ${0}"), colors);
+ *  qse_char_t* colors[] = { QSE_MT("blue"), QSE_MT("green"), QSE_MT("red") };
+ *  qse_mbsfcpy(buf, QSE_MT("RGB: ${2}, ${1}, ${0}"), colors);
  * @endcode
- * @sa qse_strfncpy, qse_strxfcpy, qse_strxfncpy
+ * @sa qse_mbsfncpy, qse_mbsxfcpy, qse_mbsxfncpy
  */
-qse_size_t qse_strfcpy (
-	qse_char_t*       buf,
-	const qse_char_t* fmt,
-	const qse_char_t* str[]
+qse_size_t qse_mbsfcpy (
+	qse_mchar_t*       buf,
+	const qse_mchar_t* fmt,
+	const qse_mchar_t* str[]
 );
 
 /**
- * The qse_strfncpy() function formats a string by position.
- * It differs from qse_strfcpy() in that @a str is an array of the 
- * #qse_cstr_t type.
- * @sa qse_strfcpy, qse_strxfcpy, qse_strxfncpy
+ * The qse_wcsfcpy() function formats a string by position.
+ * The position specifier is a number enclosed in ${ and }.
+ * When ${ is preceeded by a backslash, it is treated literally. 
+ * See the example below:
+ * @code
+ *  qse_char_t buf[256]
+ *  qse_char_t* colors[] = { QSE_WT("blue"), QSE_WT("green"), QSE_WT("red") };
+ *  qse_wcsfcpy(buf, QSE_WT("RGB: ${2}, ${1}, ${0}"), colors);
+ * @endcode
+ * @sa qse_wcsfncpy, qse_wcsxfcpy, qse_wcsxfncpy
  */
-qse_size_t qse_strfncpy (
-	qse_char_t*       buf,
-	const qse_char_t* fmt, 
-	const qse_cstr_t  str[]
+qse_size_t qse_wcsfcpy (
+	qse_wchar_t*       buf,
+	const qse_wchar_t* fmt,
+	const qse_wchar_t* str[]
 );
 
 /**
- * The qse_strxfcpy() function formats a string by position.
+ * The qse_mbsfncpy() function formats a string by position.
+ * It differs from qse_mbsfcpy() in that @a str is an array of the 
+ * #qse_mcstr_t type.
+ * @sa qse_mbsfcpy, qse_mbsxfcpy, qse_mbsxfncpy
+ */
+qse_size_t qse_mbsfncpy (
+	qse_mchar_t*       buf,
+	const qse_mchar_t* fmt,
+	const qse_mcstr_t  str[]
+);
+
+/**
+ * The qse_wcsfncpy() function formats a string by position.
+ * It differs from qse_wcsfcpy() in that @a str is an array of the 
+ * #qse_wcstr_t type.
+ * @sa qse_wcsfcpy, qse_wcsxfcpy, qse_wcsxfncpy
+ */
+qse_size_t qse_wcsfncpy (
+	qse_wchar_t*       buf,
+	const qse_wchar_t* fmt,
+	const qse_wcstr_t  str[]
+);
+
+/**
+ * The qse_mbsxfcpy() function formats a string by position.
  * It differs from qse_strfcpy() in that @a buf is length-bounded of @a bsz
  * characters.
  * @code
- *  qse_char_t buf[256]
- *  qse_char_t* colors[] = { QSE_T("blue"), QSE_T("green"), QSE_T("red") };
- *  qse_strxfcpy(buf, QSE_COUNTOF(buf), QSE_T("RGB: ${2}, ${1}, ${0}"), colors);
+ *  qse_mchar_t buf[256]
+ *  qse_mchar_t* colors[] = { QSE_MT("blue"), QSE_MT("green"), QSE_MT("red") };
+ *  qse_mbsxfcpy(buf, QSE_COUNTOF(buf), QSE_MT("RGB: ${2}, ${1}, ${0}"), colors);
  * @endcode
- * @sa qse_strfcpy, qse_strfncpy, qse_strxfncpy
+ * @sa qse_mbsfcpy, qse_mbsfncpy, qse_mbsxfncpy
  */
-qse_size_t qse_strxfcpy (
-	qse_char_t*       buf,
-	qse_size_t        bsz,
-	const qse_char_t* fmt,
-	const qse_char_t* str[]
+qse_size_t qse_mbsxfcpy (
+	qse_mchar_t*       buf,
+	qse_size_t         bsz, 
+	const qse_mchar_t* fmt,
+	const qse_mchar_t* str[]
 );
 
 /**
- * The qse_strxfncpy() function formats a string by position.
- * It differs from qse_strfcpy() in that @a buf is length-bounded of @a bsz
- * characters and @a str is an array of the #qse_cstr_t type.
- * @sa qse_strfcpy, qse_strfncpy, qse_strxfcpy
+ * The qse_wcsxfcpy() function formats a string by position.
+ * It differs from qse_wcsfcpy() in that @a buf is length-bounded of @a bsz
+ * characters.
+ * @code
+ *  qse_char_t buf[256]
+ *  qse_char_t* colors[] = { QSE_WT("blue"), QSE_WT("green"), QSE_WT("red") };
+ *  qse_wcsxfcpy(buf, QSE_COUNTOF(buf), QSE_WT("RGB: ${2}, ${1}, ${0}"), colors);
+ * @endcode
+ * @sa qse_wcsfcpy, qse_wcsfncpy, qse_wcsxfncpy
  */
-qse_size_t qse_strxfncpy (
-	qse_char_t*       buf,
-	qse_size_t        bsz,
-	const qse_char_t* fmt,
-	const qse_cstr_t  str[]
+qse_size_t qse_wcsxfcpy (
+	qse_wchar_t*       buf,
+	qse_size_t         bsz, 
+	const qse_wchar_t* fmt,
+	const qse_wchar_t* str[]
 );
 
+/**
+ * The qse_mbsxfncpy() function formats a string by position.
+ * It differs from qse_strfcpy() in that @a buf is length-bounded of @a bsz
+ * characters and @a str is an array of the #qse_mcstr_t type.
+ * @sa qse_mbsfcpy, qse_mbsfncpy, qse_mbsxfcpy
+ */
+qse_size_t qse_mbsxfncpy (
+	qse_mchar_t*       buf,
+	qse_size_t         bsz, 
+	const qse_mchar_t* fmt,
+	const qse_mcstr_t  str[]
+);
+
+/**
+ * The qse_wcsxfncpy() function formats a string by position.
+ * It differs from qse_strfcpy() in that @a buf is length-bounded of @a bsz
+ * characters and @a str is an array of the #qse_wcstr_t type.
+ * @sa qse_wcsfcpy, qse_wcsfncpy, qse_wcsxfcpy
+ */
+qse_size_t qse_wcsxfncpy (
+	qse_wchar_t*       buf,
+	qse_size_t         bsz, 
+	const qse_wchar_t* fmt,
+	const qse_wcstr_t  str[]
+);
+
+#ifdef QSE_CHAR_IS_MCHAR
+#	define qse_strfcpy(buf,fmt,str)        qse_mbsfcpy(buf,fmt,str)
+#	define qse_strfncpy(buf,fmt,str)       qse_mbsfncpy(buf,fmt,str)
+#	define qse_strxfcpy(buf,bsz,fmt,str)   qse_mbsxfcpy(buf,bsz,fmt,str)
+#	define qse_strxfncpy(buf,bsz,fmt,str)  qse_mbsxfncpy(buf,bsz,fmt,str)
+#else
+#	define qse_strfcpy(buf,fmt,str)        qse_wcsfcpy(buf,fmt,str)
+#	define qse_strfncpy(buf,fmt,str)       qse_wcsfncpy(buf,fmt,str)
+#	define qse_strxfcpy(buf,bsz,fmt,str)   qse_wcsxfcpy(buf,bsz,fmt,str)
+#	define qse_strxfncpy(buf,bsz,fmt,str)  qse_wcsxfncpy(buf,bsz,fmt,str)
+#endif
+
 /**
  * The qse_strxsubst() function expands @a fmt into a buffer @a buf of the size
  * @a bsz by substituting new values for ${} segments within it. The actual
diff --git a/qse/include/qse/types.h b/qse/include/qse/types.h
index 0f16ded9..7ca25180 100644
--- a/qse/include/qse/types.h
+++ b/qse/include/qse/types.h
@@ -1,5 +1,5 @@
 /*
- * $Id: types.h 402 2011-03-18 15:07:21Z hyunghwan.chung $
+ * $Id: types.h 411 2011-03-24 14:20:55Z hyunghwan.chung $
  *
     Copyright 2006-2009 Chung, Hyung-Hwan.
     This file is part of QSE.
@@ -345,7 +345,7 @@ typedef int qse_mcint_t;
 	typedef wchar_t qse_wcint_t;
 
 	/* all the way down from here for C */
-#elif defined(__WCHAR_TYPE__) && defined(__WINT_TYPE__)
+#elif defined(__GNUC__) && defined(__WCHAR_TYPE__) && defined(__WINT_TYPE__)
 	typedef __WCHAR_TYPE__ qse_wchar_t;
 	typedef __WINT_TYPE__ qse_wcint_t;
 #elif (QSE_SIZEOF_WCHAR_T == 2) || (QSE_SIZEOF_WCHAR_T == 0)
@@ -396,12 +396,12 @@ typedef int qse_mcint_t;
  * The qse_cint_t typep defines a type that can hold a qse_char_t value and 
  * #QSE_CHAR_EOF.
  */
-#if defined(QSE_CHAR_IS_WCHAR)
-	typedef qse_wchar_t qse_char_t;
-	typedef qse_wcint_t qse_cint_t;
-#elif defined(QSE_CHAR_IS_MCHAR)
+#if defined(QSE_CHAR_IS_MCHAR)
 	typedef qse_mchar_t qse_char_t;
 	typedef qse_mcint_t qse_cint_t;
+#elif defined(QSE_CHAR_IS_WCHAR)
+	typedef qse_wchar_t qse_char_t;
+	typedef qse_wcint_t qse_cint_t;
 #else
 	/* If the character type is not determined in the conf_xxx files */
 
@@ -431,29 +431,62 @@ typedef int qse_mcint_t;
 #endif
 
 /**
- * The qse_xstr_t type defines a structure combining a pointer to a character
+ * The qse_mxstr_t type defines a structure combining a pointer to a character
  * string and the number of characters. It is designed to be interchangeable
- * with the #qse_cstr_t type except the constness on the @a ptr field.
+ * with the #qse_mcstr_t type except the constness on the @a ptr field.
  */
-struct qse_xstr_t
+struct qse_mxstr_t
 {
-	qse_char_t* ptr; /**< pointer to a character string */
-	qse_size_t  len; /**< the number of characters */
+	qse_mchar_t* ptr; /**< pointer to a character string */
+	qse_size_t   len; /**< the number of characters */
 };
-typedef struct qse_xstr_t qse_xstr_t;
+typedef struct qse_mxstr_t qse_mxstr_t;
 
 /**
- * The qse_cstr_t type defines a structure combining a pointer to
+ * The qse_wxstr_t type defines a structure combining a pointer to a character
+ * string and the number of characters. It is designed to be interchangeable
+ * with the #qse_wcstr_t type except the constness on the @a ptr field.
+ */
+struct qse_wxstr_t
+{
+	qse_wchar_t* ptr; /**< pointer to a character string */
+	qse_size_t   len; /**< the number of characters */
+};
+typedef struct qse_wxstr_t qse_wxstr_t;
+
+/**
+ * The qse_mcstr_t type defines a structure combining a pointer to
  * a constant character string and the number of characters.
- * It is designed to be interchangeable with the #qse_xstr_t type
+ * It is designed to be interchangeable with the #qse_mxstr_t type
  * except the constness on the @a ptr field.
  */
-struct qse_cstr_t
+struct qse_mcstr_t
 {
-	const qse_char_t* ptr; /**< pointer to a const character string */
-	qse_size_t        len; /**< the number of characters */
+	const qse_mchar_t* ptr; /**< pointer to a const character string */
+	qse_size_t         len; /**< the number of characters */
 };
-typedef struct qse_cstr_t qse_cstr_t;
+typedef struct qse_mcstr_t qse_mcstr_t;
+
+/**
+ * The qse_wcstr_t type defines a structure combining a pointer to
+ * a constant character string and the number of characters.
+ * It is designed to be interchangeable with the #qse_wxstr_t type
+ * except the constness on the @a ptr field.
+ */
+struct qse_wcstr_t
+{
+	const qse_wchar_t* ptr; /**< pointer to a const character string */
+	qse_size_t         len; /**< the number of characters */
+};
+typedef struct qse_wcstr_t qse_wcstr_t;
+
+#if defined(QSE_CHAR_IS_MCHAR)
+	typedef qse_mxstr_t qse_xstr_t;
+	typedef qse_mcstr_t qse_cstr_t;
+#else
+	typedef qse_wxstr_t qse_xstr_t;
+	typedef qse_wcstr_t qse_cstr_t;
+#endif
 
 /** 
  * allocate a memory chunk of the size @a n.
diff --git a/qse/lib/cmn/Makefile.am b/qse/lib/cmn/Makefile.am
index 1882bb29..47d37b1f 100644
--- a/qse/lib/cmn/Makefile.am
+++ b/qse/lib/cmn/Makefile.am
@@ -9,7 +9,8 @@ lib_LTLIBRARIES = libqsecmn.la
 libqsecmn_la_SOURCES = \
 	syscall.h mem.h \
 	mem.c xma.c fma.c chr.c chr_cnv.c rex.c \
-	str_bas.c str_cnv.c str_cpy.c str_dyn.c str_pbrk.c str_spn.c str_utl.c \
+	str_bas.c str_cnv.c str_cpy.c str_dyn.c str_fcpy.c \
+	str_pbrk.c str_put.c str_spn.c str_utl.c \
 	lda.c oht.c htb.c rbt.c sll.c gdl.c dll.c opt.c \
 	tio.c tio_get.c tio_put.c \
 	fio.c pio.c sio.c \
diff --git a/qse/lib/cmn/Makefile.in b/qse/lib/cmn/Makefile.in
index 73e8d103..b3c95b1e 100644
--- a/qse/lib/cmn/Makefile.in
+++ b/qse/lib/cmn/Makefile.in
@@ -73,10 +73,10 @@ am__installdirs = "$(DESTDIR)$(libdir)"
 LTLIBRARIES = $(lib_LTLIBRARIES)
 libqsecmn_la_DEPENDENCIES =
 am_libqsecmn_la_OBJECTS = mem.lo xma.lo fma.lo chr.lo chr_cnv.lo \
-	rex.lo str_bas.lo str_cnv.lo str_dyn.lo str_pbrk.lo str_spn.lo \
-	str_utl.lo lda.lo oht.lo htb.lo rbt.lo sll.lo gdl.lo dll.lo \
-	opt.lo tio.lo tio_get.lo tio_put.lo fio.lo pio.lo sio.lo \
-	alg_search.lo alg_sort.lo time.lo misc.lo assert.lo main.lo \
+	rex.lo str_bas.lo str_cnv.lo str_dyn.lo str_fcpy.lo str_pbrk.lo \
+	str_put.lo str_spn.lo str_utl.lo lda.lo oht.lo htb.lo rbt.lo sll.lo \
+	gdl.lo dll.lo opt.lo tio.lo tio_get.lo tio_put.lo fio.lo pio.lo \
+	sio.lo alg_search.lo alg_sort.lo time.lo misc.lo assert.lo main.lo \
 	stdio.lo
 libqsecmn_la_OBJECTS = $(am_libqsecmn_la_OBJECTS)
 libqsecmn_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
@@ -265,7 +265,8 @@ lib_LTLIBRARIES = libqsecmn.la $(am__append_1)
 libqsecmn_la_SOURCES = \
 	syscall.h mem.h \
 	mem.c xma.c fma.c chr.c chr_cnv.c rex.c \
-	str_bas.c str_cnv.c str_cpy.c str_dyn.c str_pbrk.c str_spn.c str_utl.c \
+	str_bas.c str_cnv.c str_cpy.c str_dyn.c str_fcpy.c \
+	str_pbrk.c str_put.c str_spn.c str_utl.c \
 	lda.c oht.c htb.c rbt.c sll.c gdl.c dll.c opt.c \
 	tio.c tio_get.c tio_put.c \
 	fio.c pio.c sio.c \
@@ -386,7 +387,9 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/str_bas.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/str_cnv.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/str_dyn.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/str_fcpy.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/str_pbrk.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/str_put.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/str_spn.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/str_utl.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/time.Plo@am__quote@
diff --git a/qse/lib/cmn/str_bas.c b/qse/lib/cmn/str_bas.c
index 25585b96..dc26ed0f 100644
--- a/qse/lib/cmn/str_bas.c
+++ b/qse/lib/cmn/str_bas.c
@@ -1,5 +1,5 @@
 /*
- * $Id: str_bas.c 410 2011-03-23 15:07:24Z hyunghwan.chung $
+ * $Id: str_bas.c 411 2011-03-24 14:20:55Z hyunghwan.chung $
  *
     Copyright 2006-2009 Chung, Hyung-Hwan.
     This file is part of QSE.
@@ -43,264 +43,6 @@ qse_size_t qse_strbytes (const qse_char_t* str)
 	return (p - str) * QSE_SIZEOF(qse_char_t);
 }
 
-qse_size_t qse_strxput (
-	qse_char_t* buf, qse_size_t bsz, const qse_char_t* str)
-{
-	qse_char_t* p, * p2;
-
-	p = buf; p2 = buf + bsz;
-
-	while (p < p2) 
-	{
-		if (*str == QSE_T('\0')) break;
-		*p++ = *str++;
-	}
-
-	return p - buf;
-}
-
-qse_size_t qse_strxnput (
-	qse_char_t* buf, qse_size_t bsz, const qse_char_t* str, qse_size_t len)
-{
-	qse_char_t* p, * p2; 
-	const qse_char_t* end;
-
-	p = buf; p2 = buf + bsz; end = str + len;
-
-	while (p < p2) 
-	{
-		if (str >= end) break;
-		*p++ = *str++;
-	}
-
-	return p - buf;
-}
-
-qse_size_t qse_strfcpy (
-	qse_char_t* buf, const qse_char_t* fmt, const qse_char_t* str[])
-{
-	qse_char_t* b = buf;
-	const qse_char_t* f = fmt;
-
-	while (*f != QSE_T('\0'))
-	{
-		if (*f == QSE_T('$'))
-		{
-			if (f[1] == QSE_T('{') && 
-			    (f[2] >= QSE_T('0') && f[2] <= QSE_T('9')))
-			{
-				const qse_char_t* tmp;
-				qse_size_t idx = 0;
-
-				tmp = f;
-				f += 2;
-
-				do idx = idx * 10 + (*f++ - QSE_T('0'));
-				while (*f >= QSE_T('0') && *f <= QSE_T('9'));
-	
-				if (*f != QSE_T('}'))
-				{
-					f = tmp;
-					goto normal;
-				}
-
-				f++;
-
-				tmp = str[idx];
-				while (*tmp != QSE_T('\0')) *b++ = *tmp++;
-				continue;
-			}
-			else if (f[1] == QSE_T('$')) f++;
-		}
-
-	normal:
-		*b++ = *f++;
-	}
-
-	*b = QSE_T('\0');
-	return b - buf;
-}
-
-qse_size_t qse_strfncpy (
-	qse_char_t* buf, const qse_char_t* fmt, const qse_cstr_t str[])
-{
-	qse_char_t* b = buf;
-	const qse_char_t* f = fmt;
-
-	while (*f != QSE_T('\0'))
-	{
-		if (*f == QSE_T('\\'))
-		{
-			// get the escaped character and treat it normally.
-			// if the escaper is the last character, treat it 
-			// normally also.
-			if (f[1] != QSE_T('\0')) f++;
-		}
-		else if (*f == QSE_T('$'))
-		{
-			if (f[1] == QSE_T('{') && 
-			    (f[2] >= QSE_T('0') && f[2] <= QSE_T('9')))
-			{
-				const qse_char_t* tmp, * tmpend;
-				qse_size_t idx = 0;
-
-				tmp = f;
-				f += 2;
-
-				do idx = idx * 10 + (*f++ - QSE_T('0'));
-				while (*f >= QSE_T('0') && *f <= QSE_T('9'));
-	
-				if (*f != QSE_T('}'))
-				{
-					f = tmp;
-					goto normal;
-				}
-
-				f++;
-				
-				tmp = str[idx].ptr;
-				tmpend = tmp + str[idx].len;
-
-				while (tmp < tmpend) *b++ = *tmp++;
-				continue;
-			}
-			else if (f[1] == QSE_T('$')) f++;
-		}
-
-	normal:
-		*b++ = *f++;
-	}
-
-	*b = QSE_T('\0');
-	return b - buf;
-}
-
-qse_size_t qse_strxfcpy (
-	qse_char_t* buf, qse_size_t bsz, 
-	const qse_char_t* fmt, const qse_char_t* str[])
-{
-	qse_char_t* b = buf;
-	qse_char_t* end = buf + bsz - 1;
-	const qse_char_t* f = fmt;
-
-	if (bsz <= 0) return 0;
-
-	while (*f != QSE_T('\0'))
-	{
-		if (*f == QSE_T('\\'))
-		{
-			// get the escaped character and treat it normally.
-			// if the escaper is the last character, treat it 
-			// normally also.
-			if (f[1] != QSE_T('\0')) f++;
-		}
-		else if (*f == QSE_T('$'))
-		{
-			if (f[1] == QSE_T('{') && 
-			    (f[2] >= QSE_T('0') && f[2] <= QSE_T('9')))
-			{
-				const qse_char_t* tmp;
-				qse_size_t idx = 0;
-
-				tmp = f;
-				f += 2;
-
-				do idx = idx * 10 + (*f++ - QSE_T('0'));
-				while (*f >= QSE_T('0') && *f <= QSE_T('9'));
-	
-				if (*f != QSE_T('}'))
-				{
-					f = tmp;
-					goto normal;
-				}
-
-				f++;
-				
-				tmp = str[idx];
-				while (*tmp != QSE_T('\0')) 
-				{
-					if (b >= end) goto fini;
-					*b++ = *tmp++;
-				}
-				continue;
-			}
-			else if (f[1] == QSE_T('$')) f++;
-		}
-
-	normal:
-		if (b >= end) break;
-		*b++ = *f++;
-	}
-
-fini:
-	*b = QSE_T('\0');
-	return b - buf;
-}
-
-qse_size_t qse_strxfncpy (
-	qse_char_t* buf, qse_size_t bsz, 
-	const qse_char_t* fmt, const qse_cstr_t str[])
-{
-	qse_char_t* b = buf;
-	qse_char_t* end = buf + bsz - 1;
-	const qse_char_t* f = fmt;
-
-	if (bsz <= 0) return 0;
-
-	while (*f != QSE_T('\0'))
-	{
-		if (*f == QSE_T('\\'))
-		{
-			// get the escaped character and treat it normally.
-			// if the escaper is the last character, treat it 
-			// normally also.
-			if (f[1] != QSE_T('\0')) f++;
-		}
-		else if (*f == QSE_T('$'))
-		{
-			if (f[1] == QSE_T('{') && 
-			    (f[2] >= QSE_T('0') && f[2] <= QSE_T('9')))
-			{
-				const qse_char_t* tmp, * tmpend;
-				qse_size_t idx = 0;
-
-				tmp = f;
-				f += 2;
-
-				do idx = idx * 10 + (*f++ - QSE_T('0'));
-				while (*f >= QSE_T('0') && *f <= QSE_T('9'));
-	
-				if (*f != QSE_T('}'))
-				{
-					f = tmp;
-					goto normal;
-				}
-
-				f++;
-				
-				tmp = str[idx].ptr;
-				tmpend = tmp + str[idx].len;
-
-				while (tmp < tmpend)
-				{
-					if (b >= end) goto fini;
-					*b++ = *tmp++;
-				}
-				continue;
-			}
-			else if (f[1] == QSE_T('$')) f++;
-		}
-
-	normal:
-		if (b >= end) break;
-		*b++ = *f++;
-	}
-
-fini:
-	*b = QSE_T('\0');
-	return b - buf;
-}
-
 qse_size_t qse_strxsubst (
 	qse_char_t* buf, qse_size_t bsz, const qse_char_t* fmt, 
 	qse_strxsubst_subst_t subst, void* ctx)
diff --git a/qse/lib/cmn/str_cpy.c b/qse/lib/cmn/str_cpy.c
index 81cb3adc..d9f4e523 100644
--- a/qse/lib/cmn/str_cpy.c
+++ b/qse/lib/cmn/str_cpy.c
@@ -1,5 +1,5 @@
 /*
- * $Id: str_cnv.c 402 2011-03-18 15:07:21Z hyunghwan.chung $
+ * $Id$
  *
     Copyright 2006-2009 Chung, Hyung-Hwan.
     This file is part of QSE.
diff --git a/qse/lib/cmn/str_fcpy.c b/qse/lib/cmn/str_fcpy.c
new file mode 100644
index 00000000..9c9ff2f4
--- /dev/null
+++ b/qse/lib/cmn/str_fcpy.c
@@ -0,0 +1,471 @@
+/*
+ * $Id$
+ *
+    Copyright 2006-2009 Chung, Hyung-Hwan.
+    This file is part of QSE.
+
+    QSE is free software: you can redistribute it and/or modify
+    it under the terms of the GNU Lesser General Public License as
+    published by the Free Software Foundation, either version 3 of
+    the License, or (at your option) any later version.
+
+    QSE is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with QSE. If not, see .
+ */
+
+#include 
+
+qse_size_t qse_mbsfcpy (
+	qse_mchar_t* buf, const qse_mchar_t* fmt, const qse_mchar_t* str[])
+{
+	qse_mchar_t* b = buf;
+	const qse_mchar_t* f = fmt;
+
+	while (*f != QSE_MT('\0'))
+	{
+		if (*f == QSE_MT('$'))
+		{
+			if (f[1] == QSE_MT('{') && 
+			    (f[2] >= QSE_MT('0') && f[2] <= QSE_MT('9')))
+			{
+				const qse_mchar_t* tmp;
+				qse_size_t idx = 0;
+
+				tmp = f;
+				f += 2;
+
+				do idx = idx * 10 + (*f++ - QSE_MT('0'));
+				while (*f >= QSE_MT('0') && *f <= QSE_MT('9'));
+	
+				if (*f != QSE_MT('}'))
+				{
+					f = tmp;
+					goto normal;
+				}
+
+				f++;
+
+				tmp = str[idx];
+				while (*tmp != QSE_MT('\0')) *b++ = *tmp++;
+				continue;
+			}
+			else if (f[1] == QSE_MT('$')) f++;
+		}
+
+	normal:
+		*b++ = *f++;
+	}
+
+	*b = QSE_MT('\0');
+	return b - buf;
+}
+
+qse_size_t qse_mbsfncpy (
+	qse_mchar_t* buf, const qse_mchar_t* fmt, const qse_mcstr_t str[])
+{
+	qse_mchar_t* b = buf;
+	const qse_mchar_t* f = fmt;
+
+	while (*f != QSE_MT('\0'))
+	{
+		if (*f == QSE_MT('\\'))
+		{
+			// get the escaped character and treat it normally.
+			// if the escaper is the last character, treat it 
+			// normally also.
+			if (f[1] != QSE_MT('\0')) f++;
+		}
+		else if (*f == QSE_MT('$'))
+		{
+			if (f[1] == QSE_MT('{') && 
+			    (f[2] >= QSE_MT('0') && f[2] <= QSE_MT('9')))
+			{
+				const qse_mchar_t* tmp, * tmpend;
+				qse_size_t idx = 0;
+
+				tmp = f;
+				f += 2;
+
+				do idx = idx * 10 + (*f++ - QSE_MT('0'));
+				while (*f >= QSE_MT('0') && *f <= QSE_MT('9'));
+	
+				if (*f != QSE_MT('}'))
+				{
+					f = tmp;
+					goto normal;
+				}
+
+				f++;
+				
+				tmp = str[idx].ptr;
+				tmpend = tmp + str[idx].len;
+
+				while (tmp < tmpend) *b++ = *tmp++;
+				continue;
+			}
+			else if (f[1] == QSE_MT('$')) f++;
+		}
+
+	normal:
+		*b++ = *f++;
+	}
+
+	*b = QSE_MT('\0');
+	return b - buf;
+}
+
+qse_size_t qse_mbsxfcpy (
+	qse_mchar_t* buf, qse_size_t bsz, 
+	const qse_mchar_t* fmt, const qse_mchar_t* str[])
+{
+	qse_mchar_t* b = buf;
+	qse_mchar_t* end = buf + bsz - 1;
+	const qse_mchar_t* f = fmt;
+
+	if (bsz <= 0) return 0;
+
+	while (*f != QSE_MT('\0'))
+	{
+		if (*f == QSE_MT('\\'))
+		{
+			// get the escaped character and treat it normally.
+			// if the escaper is the last character, treat it 
+			// normally also.
+			if (f[1] != QSE_MT('\0')) f++;
+		}
+		else if (*f == QSE_MT('$'))
+		{
+			if (f[1] == QSE_MT('{') && 
+			    (f[2] >= QSE_MT('0') && f[2] <= QSE_MT('9')))
+			{
+				const qse_mchar_t* tmp;
+				qse_size_t idx = 0;
+
+				tmp = f;
+				f += 2;
+
+				do idx = idx * 10 + (*f++ - QSE_MT('0'));
+				while (*f >= QSE_MT('0') && *f <= QSE_MT('9'));
+	
+				if (*f != QSE_MT('}'))
+				{
+					f = tmp;
+					goto normal;
+				}
+
+				f++;
+				
+				tmp = str[idx];
+				while (*tmp != QSE_MT('\0')) 
+				{
+					if (b >= end) goto fini;
+					*b++ = *tmp++;
+				}
+				continue;
+			}
+			else if (f[1] == QSE_MT('$')) f++;
+		}
+
+	normal:
+		if (b >= end) break;
+		*b++ = *f++;
+	}
+
+fini:
+	*b = QSE_MT('\0');
+	return b - buf;
+}
+
+qse_size_t qse_mbsxfncpy (
+	qse_mchar_t* buf, qse_size_t bsz, 
+	const qse_mchar_t* fmt, const qse_mcstr_t str[])
+{
+	qse_mchar_t* b = buf;
+	qse_mchar_t* end = buf + bsz - 1;
+	const qse_mchar_t* f = fmt;
+
+	if (bsz <= 0) return 0;
+
+	while (*f != QSE_MT('\0'))
+	{
+		if (*f == QSE_MT('\\'))
+		{
+			// get the escaped character and treat it normally.
+			// if the escaper is the last character, treat it 
+			// normally also.
+			if (f[1] != QSE_MT('\0')) f++;
+		}
+		else if (*f == QSE_MT('$'))
+		{
+			if (f[1] == QSE_MT('{') && 
+			    (f[2] >= QSE_MT('0') && f[2] <= QSE_MT('9')))
+			{
+				const qse_mchar_t* tmp, * tmpend;
+				qse_size_t idx = 0;
+
+				tmp = f;
+				f += 2;
+
+				do idx = idx * 10 + (*f++ - QSE_MT('0'));
+				while (*f >= QSE_MT('0') && *f <= QSE_MT('9'));
+	
+				if (*f != QSE_MT('}'))
+				{
+					f = tmp;
+					goto normal;
+				}
+
+				f++;
+				
+				tmp = str[idx].ptr;
+				tmpend = tmp + str[idx].len;
+
+				while (tmp < tmpend)
+				{
+					if (b >= end) goto fini;
+					*b++ = *tmp++;
+				}
+				continue;
+			}
+			else if (f[1] == QSE_MT('$')) f++;
+		}
+
+	normal:
+		if (b >= end) break;
+		*b++ = *f++;
+	}
+
+fini:
+	*b = QSE_MT('\0');
+	return b - buf;
+}
+
+qse_size_t qse_wcsfcpy (
+	qse_wchar_t* buf, const qse_wchar_t* fmt, const qse_wchar_t* str[])
+{
+	qse_wchar_t* b = buf;
+	const qse_wchar_t* f = fmt;
+
+	while (*f != QSE_WT('\0'))
+	{
+		if (*f == QSE_WT('$'))
+		{
+			if (f[1] == QSE_WT('{') && 
+			    (f[2] >= QSE_WT('0') && f[2] <= QSE_WT('9')))
+			{
+				const qse_wchar_t* tmp;
+				qse_size_t idx = 0;
+
+				tmp = f;
+				f += 2;
+
+				do idx = idx * 10 + (*f++ - QSE_WT('0'));
+				while (*f >= QSE_WT('0') && *f <= QSE_WT('9'));
+	
+				if (*f != QSE_WT('}'))
+				{
+					f = tmp;
+					goto normal;
+				}
+
+				f++;
+
+				tmp = str[idx];
+				while (*tmp != QSE_WT('\0')) *b++ = *tmp++;
+				continue;
+			}
+			else if (f[1] == QSE_WT('$')) f++;
+		}
+
+	normal:
+		*b++ = *f++;
+	}
+
+	*b = QSE_WT('\0');
+	return b - buf;
+}
+
+qse_size_t qse_wcsfncpy (
+	qse_wchar_t* buf, const qse_wchar_t* fmt, const qse_wcstr_t str[])
+{
+	qse_wchar_t* b = buf;
+	const qse_wchar_t* f = fmt;
+
+	while (*f != QSE_WT('\0'))
+	{
+		if (*f == QSE_WT('\\'))
+		{
+			// get the escaped character and treat it normally.
+			// if the escaper is the last character, treat it 
+			// normally also.
+			if (f[1] != QSE_WT('\0')) f++;
+		}
+		else if (*f == QSE_WT('$'))
+		{
+			if (f[1] == QSE_WT('{') && 
+			    (f[2] >= QSE_WT('0') && f[2] <= QSE_WT('9')))
+			{
+				const qse_wchar_t* tmp, * tmpend;
+				qse_size_t idx = 0;
+
+				tmp = f;
+				f += 2;
+
+				do idx = idx * 10 + (*f++ - QSE_WT('0'));
+				while (*f >= QSE_WT('0') && *f <= QSE_WT('9'));
+	
+				if (*f != QSE_WT('}'))
+				{
+					f = tmp;
+					goto normal;
+				}
+
+				f++;
+				
+				tmp = str[idx].ptr;
+				tmpend = tmp + str[idx].len;
+
+				while (tmp < tmpend) *b++ = *tmp++;
+				continue;
+			}
+			else if (f[1] == QSE_WT('$')) f++;
+		}
+
+	normal:
+		*b++ = *f++;
+	}
+
+	*b = QSE_WT('\0');
+	return b - buf;
+}
+
+qse_size_t qse_wcsxfcpy (
+	qse_wchar_t* buf, qse_size_t bsz, 
+	const qse_wchar_t* fmt, const qse_wchar_t* str[])
+{
+	qse_wchar_t* b = buf;
+	qse_wchar_t* end = buf + bsz - 1;
+	const qse_wchar_t* f = fmt;
+
+	if (bsz <= 0) return 0;
+
+	while (*f != QSE_WT('\0'))
+	{
+		if (*f == QSE_WT('\\'))
+		{
+			// get the escaped character and treat it normally.
+			// if the escaper is the last character, treat it 
+			// normally also.
+			if (f[1] != QSE_WT('\0')) f++;
+		}
+		else if (*f == QSE_WT('$'))
+		{
+			if (f[1] == QSE_WT('{') && 
+			    (f[2] >= QSE_WT('0') && f[2] <= QSE_WT('9')))
+			{
+				const qse_wchar_t* tmp;
+				qse_size_t idx = 0;
+
+				tmp = f;
+				f += 2;
+
+				do idx = idx * 10 + (*f++ - QSE_WT('0'));
+				while (*f >= QSE_WT('0') && *f <= QSE_WT('9'));
+	
+				if (*f != QSE_WT('}'))
+				{
+					f = tmp;
+					goto normal;
+				}
+
+				f++;
+				
+				tmp = str[idx];
+				while (*tmp != QSE_WT('\0')) 
+				{
+					if (b >= end) goto fini;
+					*b++ = *tmp++;
+				}
+				continue;
+			}
+			else if (f[1] == QSE_WT('$')) f++;
+		}
+
+	normal:
+		if (b >= end) break;
+		*b++ = *f++;
+	}
+
+fini:
+	*b = QSE_WT('\0');
+	return b - buf;
+}
+
+qse_size_t qse_wcsxfncpy (
+	qse_wchar_t* buf, qse_size_t bsz, 
+	const qse_wchar_t* fmt, const qse_wcstr_t str[])
+{
+	qse_wchar_t* b = buf;
+	qse_wchar_t* end = buf + bsz - 1;
+	const qse_wchar_t* f = fmt;
+
+	if (bsz <= 0) return 0;
+
+	while (*f != QSE_WT('\0'))
+	{
+		if (*f == QSE_WT('\\'))
+		{
+			// get the escaped character and treat it normally.
+			// if the escaper is the last character, treat it 
+			// normally also.
+			if (f[1] != QSE_WT('\0')) f++;
+		}
+		else if (*f == QSE_WT('$'))
+		{
+			if (f[1] == QSE_WT('{') && 
+			    (f[2] >= QSE_WT('0') && f[2] <= QSE_WT('9')))
+			{
+				const qse_wchar_t* tmp, * tmpend;
+				qse_size_t idx = 0;
+
+				tmp = f;
+				f += 2;
+
+				do idx = idx * 10 + (*f++ - QSE_WT('0'));
+				while (*f >= QSE_WT('0') && *f <= QSE_WT('9'));
+	
+				if (*f != QSE_WT('}'))
+				{
+					f = tmp;
+					goto normal;
+				}
+
+				f++;
+				
+				tmp = str[idx].ptr;
+				tmpend = tmp + str[idx].len;
+
+				while (tmp < tmpend)
+				{
+					if (b >= end) goto fini;
+					*b++ = *tmp++;
+				}
+				continue;
+			}
+			else if (f[1] == QSE_WT('$')) f++;
+		}
+
+	normal:
+		if (b >= end) break;
+		*b++ = *f++;
+	}
+
+fini:
+	*b = QSE_WT('\0');
+	return b - buf;
+}
diff --git a/qse/lib/cmn/str_pbrk.c b/qse/lib/cmn/str_pbrk.c
index c26a5f73..028181e9 100644
--- a/qse/lib/cmn/str_pbrk.c
+++ b/qse/lib/cmn/str_pbrk.c
@@ -1,5 +1,5 @@
 /*
- * $Id: str_cnv.c 402 2011-03-18 15:07:21Z hyunghwan.chung $
+ * $Id$
  *
     Copyright 2006-2009 Chung, Hyung-Hwan.
     This file is part of QSE.
diff --git a/qse/lib/cmn/str_put.c b/qse/lib/cmn/str_put.c
new file mode 100644
index 00000000..d12674cd
--- /dev/null
+++ b/qse/lib/cmn/str_put.c
@@ -0,0 +1,101 @@
+/*
+ * $Id$
+ *
+    Copyright 2006-2009 Chung, Hyung-Hwan.
+    This file is part of QSE.
+
+    QSE is free software: you can redistribute it and/or modify
+    it under the terms of the GNU Lesser General Public License as
+    published by the Free Software Foundation, either version 3 of
+    the License, or (at your option) any later version.
+
+    QSE is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with QSE. If not, see .
+ */
+
+#include 
+
+qse_size_t qse_mbsput (qse_mchar_t* buf, const qse_mchar_t* str)
+{
+	qse_mchar_t* org = buf;
+	while (*str != QSE_MT('\0')) *buf++ = *str++;
+	return buf - org;
+}
+
+qse_size_t qse_wcsput (qse_wchar_t* buf, const qse_wchar_t* str)
+{
+	qse_wchar_t* org = buf;
+	while (*str != QSE_WT('\0')) *buf++ = *str++;
+	return buf - org;
+}
+
+qse_size_t qse_mbsxput (
+	qse_mchar_t* buf, qse_size_t bsz, const qse_mchar_t* str)
+{
+	qse_mchar_t* p, * p2;
+
+	p = buf; p2 = buf + bsz;
+
+	while (p < p2) 
+	{
+		if (*str == QSE_MT('\0')) break;
+		*p++ = *str++;
+	}
+
+	return p - buf;
+}
+
+qse_size_t qse_mbsxnput (
+	qse_mchar_t* buf, qse_size_t bsz, const qse_mchar_t* str, qse_size_t len)
+{
+	qse_mchar_t* p, * p2; 
+	const qse_mchar_t* end;
+
+	p = buf; p2 = buf + bsz; end = str + len;
+
+	while (p < p2) 
+	{
+		if (str >= end) break;
+		*p++ = *str++;
+	}
+
+	return p - buf;
+}
+
+qse_size_t qse_wcsxput (
+	qse_wchar_t* buf, qse_size_t bsz, const qse_wchar_t* str)
+{
+	qse_wchar_t* p, * p2;
+
+	p = buf; p2 = buf + bsz;
+
+	while (p < p2) 
+	{
+		if (*str == QSE_WT('\0')) break;
+		*p++ = *str++;
+	}
+
+	return p - buf;
+}
+
+qse_size_t qse_wcsxnput (
+	qse_wchar_t* buf, qse_size_t bsz, const qse_wchar_t* str, qse_size_t len)
+{
+	qse_wchar_t* p, * p2; 
+	const qse_wchar_t* end;
+
+	p = buf; p2 = buf + bsz; end = str + len;
+
+	while (p < p2) 
+	{
+		if (str >= end) break;
+		*p++ = *str++;
+	}
+
+	return p - buf;
+}
diff --git a/qse/lib/cmn/str_spn.c b/qse/lib/cmn/str_spn.c
index 47fba528..84f5cc45 100644
--- a/qse/lib/cmn/str_spn.c
+++ b/qse/lib/cmn/str_spn.c
@@ -1,5 +1,5 @@
 /*
- * $Id: str_cnv.c 402 2011-03-18 15:07:21Z hyunghwan.chung $
+ * $Id$
  *
     Copyright 2006-2009 Chung, Hyung-Hwan.
     This file is part of QSE.
diff --git a/qse/watcom/debug/os2/lib/cmn/qsecmn.tgt b/qse/watcom/debug/os2/lib/cmn/qsecmn.tgt
index 081e5c28..aac1f5ab 100755
--- a/qse/watcom/debug/os2/lib/cmn/qsecmn.tgt
+++ b/qse/watcom/debug/os2/lib/cmn/qsecmn.tgt
@@ -42,7 +42,7 @@ WVList
 0
 10
 WPickList
-38
+40
 11
 MItem
 3
@@ -548,7 +548,7 @@ WVList
 123
 MItem
 33
-..\..\..\..\..\lib\cmn\str_pbrk.c
+..\..\..\..\..\lib\cmn\str_fcpy.c
 124
 WString
 4
@@ -565,8 +565,8 @@ WVList
 0
 127
 MItem
-32
-..\..\..\..\..\lib\cmn\str_spn.c
+33
+..\..\..\..\..\lib\cmn\str_pbrk.c
 128
 WString
 4
@@ -584,7 +584,7 @@ WVList
 131
 MItem
 32
-..\..\..\..\..\lib\cmn\str_utl.c
+..\..\..\..\..\lib\cmn\str_put.c
 132
 WString
 4
@@ -601,8 +601,8 @@ WVList
 0
 135
 MItem
-29
-..\..\..\..\..\lib\cmn\time.c
+32
+..\..\..\..\..\lib\cmn\str_spn.c
 136
 WString
 4
@@ -619,8 +619,8 @@ WVList
 0
 139
 MItem
-28
-..\..\..\..\..\lib\cmn\tio.c
+32
+..\..\..\..\..\lib\cmn\str_utl.c
 140
 WString
 4
@@ -637,8 +637,8 @@ WVList
 0
 143
 MItem
-32
-..\..\..\..\..\lib\cmn\tio_get.c
+29
+..\..\..\..\..\lib\cmn\time.c
 144
 WString
 4
@@ -655,8 +655,8 @@ WVList
 0
 147
 MItem
-32
-..\..\..\..\..\lib\cmn\tio_put.c
+28
+..\..\..\..\..\lib\cmn\tio.c
 148
 WString
 4
@@ -673,8 +673,8 @@ WVList
 0
 151
 MItem
-28
-..\..\..\..\..\lib\cmn\xma.c
+32
+..\..\..\..\..\lib\cmn\tio_get.c
 152
 WString
 4
@@ -691,44 +691,44 @@ WVList
 0
 155
 MItem
-3
-*.h
+32
+..\..\..\..\..\lib\cmn\tio_put.c
 156
 WString
-3
-NIL
+4
+COBJ
 157
 WVList
 0
 158
 WVList
 0
--1
+11
 1
 1
 0
 159
 MItem
 28
-..\..\..\..\..\lib\cmn\mem.h
+..\..\..\..\..\lib\cmn\xma.c
 160
 WString
-3
-NIL
+4
+COBJ
 161
 WVList
 0
 162
 WVList
 0
-155
+11
 1
 1
 0
 163
 MItem
-32
-..\..\..\..\..\lib\cmn\syscall.h
+3
+*.h
 164
 WString
 3
@@ -739,7 +739,43 @@ WVList
 166
 WVList
 0
-155
+-1
+1
+1
+0
+167
+MItem
+28
+..\..\..\..\..\lib\cmn\mem.h
+168
+WString
+3
+NIL
+169
+WVList
+0
+170
+WVList
+0
+163
+1
+1
+0
+171
+MItem
+32
+..\..\..\..\..\lib\cmn\syscall.h
+172
+WString
+3
+NIL
+173
+WVList
+0
+174
+WVList
+0
+163
 1
 1
 0
diff --git a/qse/watcom/qse.wpj b/qse/watcom/qse.wpj
index 8aac96cf..c6406b09 100755
--- a/qse/watcom/qse.wpj
+++ b/qse/watcom/qse.wpj
@@ -60,14 +60,14 @@ WRect
 1680
 5700
 4240
-1
+0
 0
 16
 WFileName
 30
 release/os2/lib/cmn/qsecmn.tgt
 24
-25
+27
 17
 VComponent
 18
@@ -120,8 +120,8 @@ release/os2/lib/scm/qsescm.tgt
 VComponent
 27
 WRect
-430
-320
+1340
+413
 5700
 4240
 0
@@ -130,8 +130,8 @@ WRect
 WFileName
 28
 debug/os2/lib/cmn/qsecmn.tgt
-19
-22
+21
+24
 29
 VComponent
 30
@@ -180,4 +180,4 @@ WFileName
 debug/os2/cmd/scm/qsescm.tgt
 0
 1
-35
+26
diff --git a/qse/watcom/release/os2/lib/cmn/qsecmn.tgt b/qse/watcom/release/os2/lib/cmn/qsecmn.tgt
index 2d01f0ea..98d929fc 100755
--- a/qse/watcom/release/os2/lib/cmn/qsecmn.tgt
+++ b/qse/watcom/release/os2/lib/cmn/qsecmn.tgt
@@ -42,7 +42,7 @@ WVList
 0
 10
 WPickList
-38
+40
 11
 MItem
 3
@@ -612,7 +612,7 @@ WVList
 139
 MItem
 33
-..\..\..\..\..\lib\cmn\str_pbrk.c
+..\..\..\..\..\lib\cmn\str_fcpy.c
 140
 WString
 4
@@ -629,8 +629,8 @@ WVList
 0
 143
 MItem
-32
-..\..\..\..\..\lib\cmn\str_spn.c
+33
+..\..\..\..\..\lib\cmn\str_pbrk.c
 144
 WString
 4
@@ -648,29 +648,31 @@ WVList
 147
 MItem
 32
-..\..\..\..\..\lib\cmn\str_utl.c
+..\..\..\..\..\lib\cmn\str_put.c
 148
 WString
 4
 COBJ
 149
 WVList
-1
+0
 150
-MVState
+WVList
+0
+11
+1
+1
+0
 151
-WString
-3
-WCC
+MItem
+32
+..\..\..\..\..\lib\cmn\str_spn.c
 152
 WString
-25
-o?2??Include directories:
-1
+4
+COBJ
 153
-WString
-54
-"$(%watcom)/h;$(%watcom)/h/os2;..\..\..\..\..\include"
+WVList
 0
 154
 WVList
@@ -681,32 +683,30 @@ WVList
 0
 155
 MItem
-29
-..\..\..\..\..\lib\cmn\time.c
+32
+..\..\..\..\..\lib\cmn\str_utl.c
 156
 WString
 4
 COBJ
 157
 WVList
-0
+1
 158
-WVList
-0
-11
-1
-1
-0
+MVState
 159
-MItem
-28
-..\..\..\..\..\lib\cmn\tio.c
+WString
+3
+WCC
 160
 WString
-4
-COBJ
+25
+o?2??Include directories:
+1
 161
-WVList
+WString
+54
+"$(%watcom)/h;$(%watcom)/h/os2;..\..\..\..\..\include"
 0
 162
 WVList
@@ -717,8 +717,8 @@ WVList
 0
 163
 MItem
-32
-..\..\..\..\..\lib\cmn\tio_get.c
+29
+..\..\..\..\..\lib\cmn\time.c
 164
 WString
 4
@@ -735,8 +735,8 @@ WVList
 0
 167
 MItem
-32
-..\..\..\..\..\lib\cmn\tio_put.c
+28
+..\..\..\..\..\lib\cmn\tio.c
 168
 WString
 4
@@ -753,8 +753,8 @@ WVList
 0
 171
 MItem
-28
-..\..\..\..\..\lib\cmn\xma.c
+32
+..\..\..\..\..\lib\cmn\tio_get.c
 172
 WString
 4
@@ -771,44 +771,44 @@ WVList
 0
 175
 MItem
-3
-*.h
+32
+..\..\..\..\..\lib\cmn\tio_put.c
 176
 WString
-3
-NIL
+4
+COBJ
 177
 WVList
 0
 178
 WVList
 0
--1
+11
 1
 1
 0
 179
 MItem
 28
-..\..\..\..\..\lib\cmn\mem.h
+..\..\..\..\..\lib\cmn\xma.c
 180
 WString
-3
-NIL
+4
+COBJ
 181
 WVList
 0
 182
 WVList
 0
-175
+11
 1
 1
 0
 183
 MItem
-32
-..\..\..\..\..\lib\cmn\syscall.h
+3
+*.h
 184
 WString
 3
@@ -819,7 +819,43 @@ WVList
 186
 WVList
 0
-175
+-1
+1
+1
+0
+187
+MItem
+28
+..\..\..\..\..\lib\cmn\mem.h
+188
+WString
+3
+NIL
+189
+WVList
+0
+190
+WVList
+0
+183
+1
+1
+0
+191
+MItem
+32
+..\..\..\..\..\lib\cmn\syscall.h
+192
+WString
+3
+NIL
+193
+WVList
+0
+194
+WVList
+0
+183
 1
 1
 0