about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>1996-04-02 13:27:17 +0000
committerRoland McGrath <roland@gnu.org>1996-04-02 13:27:17 +0000
commit30de3b18a526acc837957865129b7fa6d8ac91d1 (patch)
treeddf650f2b280f8ce0e52157e98f459a13e16931c
parentb80510574cffbf64378fbcb25574955ebc4b92e9 (diff)
downloadglibc-30de3b18a526acc837957865129b7fa6d8ac91d1.tar.gz
glibc-30de3b18a526acc837957865129b7fa6d8ac91d1.tar.xz
glibc-30de3b18a526acc837957865129b7fa6d8ac91d1.zip
Mon Apr 1 13:34:55 1996 Roland McGrath <roland@whiz-bang.gnu.ai.mit.edu> cvs/libc-960403
	* stdio-common/tst-printf.c (main): Add new test case.

	* sysdeps/generic/setenv.c (unsetenv): Use old-style definition.

Mon Apr  1 11:39:10  Ulrich Drepper  <drepper@gnu.ai.mit.edu>

	* stdlib/strtod.c (STRTOD): Fix handling of American style FP
	numbers.

	* stdio-common/vfprintf.c (vfprintf): Don't increment format
	string pointer twice after seeing `*'.

Sun Mar 31 17:31:54 1996  Roland McGrath  <roland@whiz-bang.gnu.ai.mit.edu>

	* MakeTAGS (po/SYS_libc.pot): Prepend header processed from
 	po/header.pot.

Sun Mar 31 18:07:32 1996  Ulrich Drepper  <drepper@gnu.ai.mit.edu>

	* locale/Makefile (others, install-bin): Compiling locale works
        again.
	(locale-modules): locale has no --dump option anymore.  Remove
	ctypedump.

	* locale/programs/config.h: Don't declare euidaccess.
	Use #include_next to get libc's config.h.

	* locale/programs/ctypedump.c: Not needed anymore.  Dump option
	of locale is removed.

	* locale/programs/locale.c: Adapt for new locale implementation.

	* stdio-common/_itoa.h (_itoa_word): Define as inline function.
	* stdio-common/_itoa.c (_itoa_lower_digits, _itoa_upper_digits):
	Don't declare static because used in _itoa_word inline function.

	* stdio-common/printf-parse.h: Prepare for use in wide-char
	stdio implementation.
	(find_spec): Take additional argument to work with mbrlen instead
	of mblen.
	(parse_one_spec): Ditto.

	* stdio-common/printf-prs.c: Prepare for use in wide-char
	stdio implementation.

	* stdio-common/printf.h: Mark change for wide-char handling.
	Changing it now would result in incompatibilities.

	* stdio-common/vfprintf.c: New and fast implementation.

	* wcsmbs/Makefile (routines): Remove pre-ISO C multibyte functions
	mbsadvance, mbscat, mbschr, mbscmp, mbscpy, mbsdup, mbslen,
	mbsncat, mbsncmp, mbsncpy, mbsrchr, mbstomb.
	Change wcswcs to wcsstr.
	Add wmemchr, wmemcmp, wmemcpy, wmemmove, wmemset, btowc, wctob,
	mbsinit, mbrlen, mbrtowc, wcrtomb, mbsrtowcs, wcsrtombs.

	* wcsmbs/btowc.c, wcsmbs/mbrlen.c, wcsmbs/mbrtowc.c,
        wcsmbs/mbsinit.c, wcsmbs/mbsrtowcs.c, wcsmbs/wchar.h,
        wcsmbs/wcrtomb.c, wcsmbs/wcsrtombs.c, wcsmbs/wcsstr.c,
        wcsmbs/wctob.c, wcsmbs/wmemchr.c, wcsmbs/wmemcmp.c,
        wcsmbs/wmemcpy.c, wcsmbs/wmemmove.c, wcsmbs/wmemset.c: New
        function according to ISO C amendment 1.
	* wchar.h: Wrapper around "wcsmbs/wchar.h".

	* wcsmbs/wcscat.c, wcsmbs/wcschr.c, wcsmbs/wcscmp.c,
        wcsmbs/wcscpy.c, wcsmbs/wcscspn.c, wcsmbs/wcsdup.c,
        wcsmbs/wcslen.c, wcsmbs/wcsncat.c, wcsmbs/wcsncmp.c,
        wcsmbs/wcsncpy.c, wcsmbs/wcspbrk.c, wcsmbs/wcsrchr.c,
        wcsmbs/wcsspn.c, wcsmbs/wcstok.c: Changed to conform with ISO C
        amendment 1.

	* wcsmbs/mbsadvance.c, wcsmbs/mbscat.c, wcsmbs/mbschr.c,
        wcsmbs/mbscmp.c, wcsmbs/mbscpy.c, wcsmbs/mbsdup.c,
        wcsmbs/mbslen.c, wcsmbs/mbsncat.c, wcsmbs/mbsncmp.c,
        wcsmbs/mbsncpy.c, wcsmbs/mbsrchr.c, wcsmbs/mbstomb.c,
        wcsmbs/mbstr.h, wcsmbs/wcstr.h, wcsmbs/wcswcs.c: Removed.
        Implement functions from early drafts, not part of final standard.

Sun Mar 31 16:50:41 1996  Roland McGrath  <roland@whiz-bang.gnu.ai.mit.edu>

	* setjmp/setjmp.h (jmp_buf): Change gratuitous struct tag name to
	__jmp_bug_tag so its C++ implicit typedef does not conflict with the
	__jmp_buf typedef.

	* Makerules (BUILD_CFLAGS) [! objdir]: Use $(..)config.h when
	compiling in the source directories.

Fri Mar 29 16:26:35 1996  Roland McGrath  <roland@whiz-bang.gnu.ai.mit.edu>

	* sysdeps/libm-ieee754/w_gamma.c: Use signgam instead of __signgam.
	* sysdeps/libm-ieee754/s_signgam.c: Undo last change.
-rw-r--r--ChangeLog95
-rw-r--r--sysdeps/libm-ieee754/s_signgam.c3
-rw-r--r--sysdeps/libm-ieee754/w_gamma.c10
-rw-r--r--wchar.h1
-rw-r--r--wcsmbs/btowc.c36
-rw-r--r--wcsmbs/mbrlen.c35
-rw-r--r--wcsmbs/mbrtowc.c61
-rw-r--r--wcsmbs/mbsinit.c33
-rw-r--r--wcsmbs/mbsrtowcs.c57
-rw-r--r--wcsmbs/wchar.h168
-rw-r--r--wcsmbs/wcrtomb.c60
-rw-r--r--wcsmbs/wcsrtombs.c64
-rw-r--r--wcsmbs/wcsstr.c97
-rw-r--r--wcsmbs/wctob.c34
-rw-r--r--wcsmbs/wmemchr.c62
-rw-r--r--wcsmbs/wmemcmp.c84
-rw-r--r--wcsmbs/wmemcpy.c31
-rw-r--r--wcsmbs/wmemmove.c31
-rw-r--r--wcsmbs/wmemset.c55
19 files changed, 1010 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog
index 42f7e4be81..f8c952fa76 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,98 @@
+Mon Apr  1 13:34:55 1996  Roland McGrath  <roland@whiz-bang.gnu.ai.mit.edu>
+
+	* stdio-common/tst-printf.c (main): Add new test case.
+
+	* sysdeps/generic/setenv.c (unsetenv): Use old-style definition.
+
+Mon Apr  1 11:39:10  Ulrich Drepper  <drepper@gnu.ai.mit.edu>
+
+	* stdlib/strtod.c (STRTOD): Fix handling of American style FP
+	numbers.
+
+	* stdio-common/vfprintf.c (vfprintf): Don't increment format
+	string pointer twice after seeing `*'.
+
+Sun Mar 31 17:31:54 1996  Roland McGrath  <roland@whiz-bang.gnu.ai.mit.edu>
+
+	* MakeTAGS (po/SYS_libc.pot): Prepend header processed from
+ 	po/header.pot.
+
+Sun Mar 31 18:07:32 1996  Ulrich Drepper  <drepper@gnu.ai.mit.edu>
+
+	* locale/Makefile (others, install-bin): Compiling locale works
+        again.
+	(locale-modules): locale has no --dump option anymore.  Remove
+	ctypedump.
+
+	* locale/programs/config.h: Don't declare euidaccess.
+	Use #include_next to get libc's config.h.
+
+	* locale/programs/ctypedump.c: Not needed anymore.  Dump option
+	of locale is removed.
+
+	* locale/programs/locale.c: Adapt for new locale implementation.
+
+	* stdio-common/_itoa.h (_itoa_word): Define as inline function.
+	* stdio-common/_itoa.c (_itoa_lower_digits, _itoa_upper_digits):
+	Don't declare static because used in _itoa_word inline function.
+
+	* stdio-common/printf-parse.h: Prepare for use in wide-char
+	stdio implementation.
+	(find_spec): Take additional argument to work with mbrlen instead
+	of mblen.
+	(parse_one_spec): Ditto.
+
+	* stdio-common/printf-prs.c: Prepare for use in wide-char
+	stdio implementation.
+
+	* stdio-common/printf.h: Mark change for wide-char handling.
+	Changing it now would result in incompatibilities.
+
+	* stdio-common/vfprintf.c: New and fast implementation.
+
+	* wcsmbs/Makefile (routines): Remove pre-ISO C multibyte functions
+	mbsadvance, mbscat, mbschr, mbscmp, mbscpy, mbsdup, mbslen,
+	mbsncat, mbsncmp, mbsncpy, mbsrchr, mbstomb.
+	Change wcswcs to wcsstr.
+	Add wmemchr, wmemcmp, wmemcpy, wmemmove, wmemset, btowc, wctob,
+	mbsinit, mbrlen, mbrtowc, wcrtomb, mbsrtowcs, wcsrtombs.
+
+	* wcsmbs/btowc.c, wcsmbs/mbrlen.c, wcsmbs/mbrtowc.c,
+        wcsmbs/mbsinit.c, wcsmbs/mbsrtowcs.c, wcsmbs/wchar.h,
+        wcsmbs/wcrtomb.c, wcsmbs/wcsrtombs.c, wcsmbs/wcsstr.c,
+        wcsmbs/wctob.c, wcsmbs/wmemchr.c, wcsmbs/wmemcmp.c,
+        wcsmbs/wmemcpy.c, wcsmbs/wmemmove.c, wcsmbs/wmemset.c: New
+        function according to ISO C amendment 1.
+	* wchar.h: Wrapper around "wcsmbs/wchar.h".
+
+	* wcsmbs/wcscat.c, wcsmbs/wcschr.c, wcsmbs/wcscmp.c,
+        wcsmbs/wcscpy.c, wcsmbs/wcscspn.c, wcsmbs/wcsdup.c,
+        wcsmbs/wcslen.c, wcsmbs/wcsncat.c, wcsmbs/wcsncmp.c,
+        wcsmbs/wcsncpy.c, wcsmbs/wcspbrk.c, wcsmbs/wcsrchr.c,
+        wcsmbs/wcsspn.c, wcsmbs/wcstok.c: Changed to conform with ISO C
+        amendment 1.
+
+	* wcsmbs/mbsadvance.c, wcsmbs/mbscat.c, wcsmbs/mbschr.c,
+        wcsmbs/mbscmp.c, wcsmbs/mbscpy.c, wcsmbs/mbsdup.c,
+        wcsmbs/mbslen.c, wcsmbs/mbsncat.c, wcsmbs/mbsncmp.c,
+        wcsmbs/mbsncpy.c, wcsmbs/mbsrchr.c, wcsmbs/mbstomb.c,
+        wcsmbs/mbstr.h, wcsmbs/wcstr.h, wcsmbs/wcswcs.c: Removed.
+        Implement functions from early drafts, not part of final standard.
+
+Sun Mar 31 16:50:41 1996  Roland McGrath  <roland@whiz-bang.gnu.ai.mit.edu>
+
+	* setjmp/setjmp.h (jmp_buf): Change gratuitous struct tag name to
+	__jmp_bug_tag so its C++ implicit typedef does not conflict with the
+	__jmp_buf typedef.
+
+	* Makerules (BUILD_CFLAGS) [! objdir]: Use $(..)config.h when
+	compiling in the source directories.
+
+Fri Mar 29 16:26:35 1996  Roland McGrath  <roland@whiz-bang.gnu.ai.mit.edu>
+
+	* sysdeps/libm-ieee754/w_gamma.c: Use signgam instead of __signgam.
+	* sysdeps/libm-ieee754/s_signgam.c: Undo last change.
+
 Fri Mar 29 11:29:46 1996  Roland McGrath  <roland@charlie-brown.gnu.ai.mit.edu>
 
 	* sysdeps/libm-ieee754/s_signgam.c (signgam): Renamed to __signgam,
diff --git a/sysdeps/libm-ieee754/s_signgam.c b/sysdeps/libm-ieee754/s_signgam.c
index 2ab5924a2a..d67d5918ec 100644
--- a/sysdeps/libm-ieee754/s_signgam.c
+++ b/sysdeps/libm-ieee754/s_signgam.c
@@ -1,4 +1,3 @@
 #include "math.h"
 #include "math_private.h"
-int __signgam = 0;
-weak_alias (__signgam, signgam)
+int signgam = 0;
diff --git a/sysdeps/libm-ieee754/w_gamma.c b/sysdeps/libm-ieee754/w_gamma.c
index de618b38ed..8a0a18079a 100644
--- a/sysdeps/libm-ieee754/w_gamma.c
+++ b/sysdeps/libm-ieee754/w_gamma.c
@@ -5,7 +5,7 @@
  *
  * Developed at SunPro, a Sun Microsystems, Inc. business.
  * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice 
+ * software is freely granted, provided that this notice
  * is preserved.
  * ====================================================
  */
@@ -23,7 +23,7 @@ static char rcsid[] = "$NetBSD: w_gamma.c,v 1.7 1995/11/20 22:06:43 jtc Exp $";
 #include "math.h"
 #include "math_private.h"
 
-extern int __signgam;
+extern int signgam;
 
 #ifdef __STDC__
 	double __gamma(double x)
@@ -33,10 +33,10 @@ extern int __signgam;
 #endif
 {
 #ifdef _IEEE_LIBM
-	return __ieee754_lgamma_r(x,&__signgam);
+	return __ieee754_lgamma_r(x,&signgam);
 #else
         double y;
-        y = __ieee754_lgamma_r(x,&__signgam);
+        y = __ieee754_lgamma_r(x,&signgam);
         if(_LIB_VERSION == _IEEE_) return y;
         if(!__finite(y)&&__finite(x)) {
             if(__floor(x)==x&&x<=0.0)
@@ -46,5 +46,5 @@ extern int __signgam;
         } else
             return y;
 #endif
-}             
+}
 weak_alias (__gamma, gamma)
diff --git a/wchar.h b/wchar.h
new file mode 100644
index 0000000000..c87ffb851b
--- /dev/null
+++ b/wchar.h
@@ -0,0 +1 @@
+#include <wcsmbs/wchar.h>
diff --git a/wcsmbs/btowc.c b/wcsmbs/btowc.c
new file mode 100644
index 0000000000..062be7ec02
--- /dev/null
+++ b/wcsmbs/btowc.c
@@ -0,0 +1,36 @@
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include <stdio.h>
+#include <wchar.h>
+
+
+wint_t
+btowc (c)
+     int c;
+{
+  /*************************************************************\
+  |* This is no complete implementation.  While the multi-byte *|
+  |* character handling is not finished this will do.	       *|
+  \*************************************************************/
+  if (WEOF != (wint_t) EOF)
+    return WEOF;
+  else
+    return c;
+}
diff --git a/wcsmbs/mbrlen.c b/wcsmbs/mbrlen.c
new file mode 100644
index 0000000000..a50631e8d1
--- /dev/null
+++ b/wcsmbs/mbrlen.c
@@ -0,0 +1,35 @@
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include <wchar.h>
+
+
+/* The mbrlen function has an internal shift state which gets used if
+   the PS parameter is NULL.  */
+static mbstate_t internal;
+
+
+size_t
+mbrlen (s, n, ps)
+     const char *s;
+     size_t n;
+     mbstate_t *ps;
+{
+  return mbrtowc (NULL, s, n, ps ?: &internal);
+}
diff --git a/wcsmbs/mbrtowc.c b/wcsmbs/mbrtowc.c
new file mode 100644
index 0000000000..17083196bd
--- /dev/null
+++ b/wcsmbs/mbrtowc.c
@@ -0,0 +1,61 @@
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include <wchar.h>
+
+
+size_t
+mbrtowc (pwc, s, n, ps)
+     wchar_t *pwc;
+     const char *s;
+     size_t n;
+     mbstate_t *ps;
+{
+  wchar_t to_wide;
+
+  /*************************************************************\
+  |* This is no complete implementation.  While the multi-byte *|
+  |* character handling is not finished this will do.	       *|
+  \*************************************************************/
+
+  if (s == NULL)
+    {
+      pwc = NULL;
+      s = "";
+      n = 1;
+    }
+
+  if (n == 0)
+    return (size_t) -2;
+
+  /* For now.  */
+  to_wide = (wchar_t) *s;
+
+  if (pwc != NULL)
+    *pwc = to_wide;
+
+  if (pwc == L'\0')
+    {
+      *ps = 0;		/* This is required.  */
+      return 0;
+    }
+
+  /* Return code (size_t)-1 cannot happend for now.  */
+  return 1;
+}
diff --git a/wcsmbs/mbsinit.c b/wcsmbs/mbsinit.c
new file mode 100644
index 0000000000..d9f01256d5
--- /dev/null
+++ b/wcsmbs/mbsinit.c
@@ -0,0 +1,33 @@
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include <wchar.h>
+
+
+int
+mbsinit (ps)
+     const mbstate_t *ps;
+{
+  /*************************************************************\
+  |* This is no complete implementation.  While the multi-byte *|
+  |* character handling is not finished this will do.	       *|
+  \*************************************************************/
+
+  return *ps == 0;
+}
diff --git a/wcsmbs/mbsrtowcs.c b/wcsmbs/mbsrtowcs.c
new file mode 100644
index 0000000000..cb87938e5d
--- /dev/null
+++ b/wcsmbs/mbsrtowcs.c
@@ -0,0 +1,57 @@
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include <wchar.h>
+
+
+size_t
+mbsrtowcs (dst, src, len, ps)
+     wchar_t *dst;
+     const char **src;
+     size_t len;
+     mbstate_t *ps;
+{
+  size_t result = 0;
+  /*************************************************************\
+  |* This is no complete implementation.  While the multi-byte *|
+  |* character handling is not finished this will do.	       *|
+  \*************************************************************/
+
+  while (len > 0 && **src != '\0')
+    {
+      /* For now there is no possibly illegal MB char sequence.  */
+      if (dst != NULL)
+	dst[result] = (wchar_t) **src;
+      ++result;
+      ++(*src);
+      --len;
+    }
+
+  if (len > 0)
+    {
+      if (dst != NULL)
+	{
+	  dst[result] = L'\0';
+	  *ps = 0;
+	}
+      *src = NULL;
+    }
+
+  return result;
+}
diff --git a/wcsmbs/wchar.h b/wcsmbs/wchar.h
new file mode 100644
index 0000000000..69ad2d3c67
--- /dev/null
+++ b/wcsmbs/wchar.h
@@ -0,0 +1,168 @@
+/* Copyright (C) 1995, 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+/*
+ *      ISO Standard: 7.16.4 General wide-string utilities	<wchar.h>
+ */
+
+#ifndef _WCHAR_H
+
+#define _WCHAR_H 1
+#include <features.h>
+
+__BEGIN_DECLS
+
+/* Get size_t, wchar_t, uwchar_t and NULL from <stddef.h>.  */
+#define __need_size_t
+#define __need_wchar_t
+/* #define __need_uwchar_t */
+#define __need_NULL
+/* __need_WCHAR_MAX */
+/* __need_WCHAR_MIN */
+#include <stddef.h>
+
+/* FIXME: Should go with this or another name in stddef.h.  */
+typedef unsigned int uwchar_t;
+
+/* Conversion state information.  */
+typedef int mbstate_t; /* FIXME */
+
+/* Should come from <stddef.h> */
+#define WCHAR_MIN ((wchar_t) 0)	/* FIXME */
+#define WCHAR_MAX (~WCHAR_MIN)	/* FIXME */
+
+#ifndef WEOF
+# define WEOF (0xffffffffu)
+#endif
+
+/* FIXME: should this go into <stddef.h>???  */
+#if 0
+#define __need_wint_t
+#include <stddef.h>
+#else
+/* Integral type unchanged by default argument promotions that can
+   hold any value corresponding to members of the extended character
+   set, as well as at least one value that does not correspond to any
+   member of the extended character set.  */
+typedef unsigned int wint_t;
+#endif
+
+
+/* Copy SRC to DEST.  */
+extern wchar_t *wcscpy __P ((wchar_t *__dest, __const wchar_t *__src));
+/* Copy no more than N wide-characters of SRC to DEST.  */
+extern wchar_t *wcsncpy __P ((wchar_t *__dest, __const wchar_t *__src,
+			      size_t __n));
+
+/* Append SRC onto DEST.  */
+extern wchar_t *wcscat __P ((wchar_t *__dest, __const wchar_t *__src));
+/* Append no more than N wide-characters of SRC onto DEST.  */
+extern wchar_t *wcsncat __P ((wchar_t *__dest, __const wchar_t *__src,
+			      size_t __n));
+
+/* Compare S1 and S2.  */
+extern int wcscmp __P ((__const wchar_t *__s1, __const wchar_t *__s2));
+/* Compare N wide-characters of S1 and S2.  */
+extern int wcsncmp __P ((__const wchar_t *__s1, __const wchar_t *__s2,
+			 size_t __n));
+
+/* Duplicate S, returning an identical malloc'd string.  */
+extern wchar_t *wcsdup __P ((__const wchar_t *__s));
+
+/* Find the first occurence of WC in WCS.  */
+extern wchar_t *wcschr __P ((__const wchar_t *__wcs, wchar_t __wc));
+/* Find the last occurence of WC in WCS.  */
+extern wchar_t *wcsrchr __P ((__const wchar_t *__wcs, wchar_t __wc));
+
+/* Return the length of the initial segmet of WCS which
+   consists entirely of wide-characters not in REJECT.  */
+extern size_t wcscspn __P ((__const wchar_t *__wcs,
+			    __const wchar_t *__reject));
+/* Return the length of the initial segmet of WCS which
+   consists entirely of wide-characters in  ACCEPT.  */
+extern size_t wcsspn __P ((__const wchar_t *__wcs, __const wchar_t *__accept));
+/* Find the first occurence in WCS of any character in ACCEPT.  */
+extern wchar_t *wcspbrk __P ((__const wchar_t *__wcs,
+			      __const wchar_t *__accept));
+/* Find the first occurence of NEEDLE in HAYSTACK.  */
+extern wchar_t *wcsstr __P ((__const wchar_t *__haystack,
+			     __const wchar_t *__needle));
+/* Divide WCS into tokens separated by characters in DELIM.  */
+extern wchar_t *wcstok __P ((wchar_t *__s, __const wchar_t *__delim,
+			     wchar_t **ptr));
+
+/* Return the number of wide-characters in S.  */
+extern size_t wcslen __P ((__const wchar_t *__s));
+
+
+/* Search N bytes of S for C.  */
+extern wchar_t *wmemchr __P ((__const wchar_t *__s, wchar_t __c, size_t __n));
+
+/* Compare N bytes of S1 and S2.  */
+extern int wmemcmp __P ((__const wchar_t *__s1, __const wchar_t *__s2,
+			 size_t __n));
+
+/* Copy N bytes of SRC to DEST.  */
+extern wchar_t *wmemcpy __P ((wchar_t *__s1, __const wchar_t *__s2,
+			      size_t __n));
+
+/* Copy N bytes of SRC to DEST, guaranteeing
+   correct behavior for overlapping strings.  */
+extern wchar_t *wmemmove __P ((wchar_t *__s1, __const wchar_t *__s2,
+			       size_t __N));
+
+/* Set N bytes of S to C.  */
+extern wchar_t *wmemset __P ((wchar_t *__s, wchar_t __c, size_t __n));
+
+
+/* Determine whether C constitutes a valid (one-byte) multibyte
+   character.  */
+extern wint_t btowc __P ((int __c));
+
+/* Determine whether C corresponds to a member of the extended
+   character set whose multibyte representation is a single byte.  */
+extern int wctob __P ((wint_t __c));
+
+/* Determine whether PS points to an object representing the initial
+   state.  */
+extern int mbsinit __P ((__const mbstate_t *__ps));
+
+/* Return number of bytes in multibyte character pointed to by S.  */
+extern size_t mbrlen __P ((__const char *__s, size_t __n, mbstate_t *ps));
+
+/* Write wide character representation of multibyte character pointed
+   to by S to PWC.  */
+extern size_t mbrtowc __P ((wchar_t *__pwc, __const char *__s, size_t __n,
+			    mbstate_t *__p));
+
+/* Write multibyte representation of wide character WC to S.  */
+extern size_t wcrtomb __P ((char *__s, wchar_t __wc, mbstate_t *__ps));
+
+/* Write wide character representation of multibyte chracter string SRC
+   to DST.  */
+extern size_t mbsrtowcs __P ((wchar_t *__dst, __const char **__src,
+			      size_t __len, mbstate_t *__ps));
+
+/* Write multibyte character representation of wide character string
+   SRC to DST.  */
+extern size_t wcsrtombs __P ((char *__dst, __const wchar_t **__src,
+			      size_t __len, mbstate_t *__ps));
+
+__END_DECLS
+
+#endif /* wchar.h  */
diff --git a/wcsmbs/wcrtomb.c b/wcsmbs/wcrtomb.c
new file mode 100644
index 0000000000..493e08f77d
--- /dev/null
+++ b/wcsmbs/wcrtomb.c
@@ -0,0 +1,60 @@
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include <errno.h>
+#include <wchar.h>
+
+
+size_t
+wcrtomb (s, wc, ps)
+     char *s;
+     wchar_t wc;
+     mbstate_t *ps;
+{
+  /*************************************************************\
+  |* This is no complete implementation.  While the multi-byte *|
+  |* character handling is not finished this will do.	       *|
+  \*************************************************************/
+
+  char fake[1];
+
+  if (s == NULL)
+    {
+      s = fake;
+      wc = L'\0';
+    }
+
+  if (wc == L'\0')
+    {
+      /* FIXME Write any shift sequence to get to *PS == NULL.  */
+      *ps = 0;
+      *s = '\0';
+      return 1;
+    }
+
+  /* FIXME For now we don't handle real multi-byte encodings.  */
+  if ((wc & ~0xff) != 0)
+    {
+      errno = EILSEQ;
+      return (size_t) -1;
+    }
+
+  *s = (char) wc;
+  return 1;
+}
diff --git a/wcsmbs/wcsrtombs.c b/wcsmbs/wcsrtombs.c
new file mode 100644
index 0000000000..612a86d437
--- /dev/null
+++ b/wcsmbs/wcsrtombs.c
@@ -0,0 +1,64 @@
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include <errno.h>
+#include <wchar.h>
+
+
+size_t
+wcsrtombs (dst, src, len, ps)
+     char *dst;
+     const wchar_t **src;
+     size_t len;
+     mbstate_t *ps;
+{
+  size_t result = 0;
+
+  /*************************************************************\
+  |* This is no complete implementation.  While the multi-byte *|
+  |* character handling is not finished this will do.	       *|
+  \*************************************************************/
+
+  while (len > 0 && **src != L'\0')
+    {
+      if ((**src & ~0xff) != 0)
+	{
+	  errno = EILSEQ;
+	  return (size_t) -1;
+	}
+
+      if (dst != NULL)
+	dst[result] = (char) **src;
+      ++result;
+      ++(*src);
+      --len;
+    }
+
+  if (len > 0)
+    {
+      if (dst != NULL)
+	{
+	  dst[result] = '\0';
+	  *ps = 0;
+	}
+      *src = NULL;
+    }
+
+  return result;
+}
diff --git a/wcsmbs/wcsstr.c b/wcsmbs/wcsstr.c
new file mode 100644
index 0000000000..d2c863fff3
--- /dev/null
+++ b/wcsmbs/wcsstr.c
@@ -0,0 +1,97 @@
+/* Copyright (C) 1995, 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.	 If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+/*
+ * The original strstr() file contains the following comment:
+ *
+ * My personal strstr() implementation that beats most other algorithms.
+ * Until someone tells me otherwise, I assume that this is the
+ * fastest implementation of strstr() in C.
+ * I deliberately chose not to comment it.  You should have at least
+ * as much fun trying to understand it, as I had to write it :-).
+ *
+ * Stephen R. van den Berg, berg@pool.informatik.rwth-aachen.de */
+
+#include <wchar.h>
+
+wchar_t *
+wcsstr (haystack, needle)
+     const wchar_t *haystack;
+     const wchar_t *needle;
+{
+  register wchar_t b, c;
+
+  if ((b = *needle) != L'\0')
+    {
+      haystack--;				/* possible ANSI violation */
+      do
+	if ((c = *++haystack) == L'\0')
+	  goto ret0;
+      while (c != b);
+
+      if (!(c = *++needle))
+	goto foundneedle;
+      ++needle;
+      goto jin;
+
+      for (;;)
+	{
+	  register wchar_t a;
+	  register const wchar_t *rhaystack, *rneedle;
+
+	  do
+	    {
+	      if (!(a = *++haystack))
+		goto ret0;
+	      if (a == b)
+		break;
+	      if ((a = *++haystack) == L'\0')
+		goto ret0;
+shloop:	      ;
+	    }
+	  while (a != b);
+
+jin:	  if (!(a = *++haystack))
+	    goto ret0;
+
+	  if (a != c)
+	    goto shloop;
+
+	  if (*(rhaystack = haystack-- + 1) == (a = *(rneedle = needle)))
+	    do
+	      {
+		if (a == L'\0')
+		  goto foundneedle;
+		if (*++rhaystack != (a = *++needle))
+		  break;
+		if (a == L'\0')
+		  goto foundneedle;
+	      }
+	    while (*++rhaystack == (a = *++needle));
+
+	  needle = rneedle;		  /* took the register-poor approach */
+
+	  if (a == L'\0')
+	    break;
+	}
+    }
+foundneedle:
+  return (wchar_t*) haystack;
+ret0:
+  return NULL;
+}
diff --git a/wcsmbs/wctob.c b/wcsmbs/wctob.c
new file mode 100644
index 0000000000..c27bd6baba
--- /dev/null
+++ b/wcsmbs/wctob.c
@@ -0,0 +1,34 @@
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include <stdio.h>
+#include <wchar.h>
+
+
+int
+wctob (c)
+     wint_t c;
+{
+  /*************************************************************\
+  |* This is no complete implementation.  While the multi-byte *|
+  |* character handling is not finished this will do.	       *|
+  \*************************************************************/
+
+  return (c & ~0xff) == 0 ? c : EOF;
+}
diff --git a/wcsmbs/wmemchr.c b/wcsmbs/wmemchr.c
new file mode 100644
index 0000000000..67c407836d
--- /dev/null
+++ b/wcsmbs/wmemchr.c
@@ -0,0 +1,62 @@
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include <wchar.h>
+
+wchar_t *
+wmemchr (s, c, n)
+     register const wchar_t *s;
+     register wchar_t c;
+     register size_t n;
+{
+  /* For performance reasons unfold the loop four times.  */
+  while (n >= 4)
+    {
+      if (s[0] == c)
+	return (wchar_t *) s;
+      if (s[1] == c)
+	return (wchar_t *) &s[1];
+      if (s[2] == c)
+	return (wchar_t *) &s[2];
+      if (s[3] == c)
+	return (wchar_t *) &s[3];
+      s += 4;
+      n -= 4;
+    }
+
+  if (n > 0)
+    {
+      if (*s == c)
+	return (wchar_t *) s;
+      ++s;
+      --n;
+    }
+  if (n > 0)
+    {
+      if (*s == c)
+	return (wchar_t *) s;
+      ++s;
+      --n;
+    }
+  if (n > 0)
+    if (*s == c)
+      return (wchar_t *) s;
+
+  return NULL;
+}
diff --git a/wcsmbs/wmemcmp.c b/wcsmbs/wmemcmp.c
new file mode 100644
index 0000000000..f96cad9c0e
--- /dev/null
+++ b/wcsmbs/wmemcmp.c
@@ -0,0 +1,84 @@
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include <wchar.h>
+
+
+int
+wmemcmp (s1, s2, n)
+     const wchar_t *s1;
+     const wchar_t *s2;
+     size_t n;
+{
+  register uwchar_t c1;
+  register uwchar_t c2;
+
+  while (n >= 4)
+    {
+      c1 = (uwchar_t) s1[0];
+      c2 = (uwchar_t) s2[0];
+      if (c1 - c2 != 0)
+	return c1 - c2;
+      c1 = (uwchar_t) s1[1];
+      c2 = (uwchar_t) s2[1];
+      if (c1 - c2 != 0)
+	return c1 - c2;
+      c1 = (uwchar_t) s1[2];
+      c2 = (uwchar_t) s2[2];
+      if (c1 - c2 != 0)
+	return c1 - c2;
+      c1 = (uwchar_t) s1[3];
+      c2 = (uwchar_t) s2[3];
+      if (c1 - c2 != 0)
+	return c1 - c2;
+      s1 += 4;
+      s2 += 4;
+      n -= 4;
+    }
+
+  if (n > 0)
+    {
+      c1 = (uwchar_t) s1[0];
+      c2 = (uwchar_t) s2[0];
+      if (c1 - c2 != 0)
+	return c1 - c2;
+      ++s1;
+      ++s2;
+      --n;
+    }
+  if (n > 0)
+    {
+      c1 = (uwchar_t) s1[0];
+      c2 = (uwchar_t) s2[0];
+      if (c1 - c2 != 0)
+	return c1 - c2;
+      ++s1;
+      ++s2;
+      --n;
+    }
+  if (n > 0)
+    {
+      c1 = (uwchar_t) s1[0];
+      c2 = (uwchar_t) s2[0];
+      if (c1 - c2 != 0)
+	return c1 - c2;
+    }
+
+  return 0;
+}
diff --git a/wcsmbs/wmemcpy.c b/wcsmbs/wmemcpy.c
new file mode 100644
index 0000000000..e469122197
--- /dev/null
+++ b/wcsmbs/wmemcpy.c
@@ -0,0 +1,31 @@
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include <wchar.h>
+#include <string.h>
+
+
+wchar_t *
+wmemcpy (s1, s2, n)
+     wchar_t *s1;
+     const wchar_t *s2;
+     size_t n;
+{
+  return (wchar_t *) memcpy ((char *) s1, (char *) s2, n * sizeof (wchar_t));
+}
diff --git a/wcsmbs/wmemmove.c b/wcsmbs/wmemmove.c
new file mode 100644
index 0000000000..60d60338cb
--- /dev/null
+++ b/wcsmbs/wmemmove.c
@@ -0,0 +1,31 @@
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include <wchar.h>
+#include <string.h>
+
+
+wchar_t *
+wmemmove (s1, s2, n)
+     wchar_t *s1;
+     const wchar_t *s2;
+     size_t n;
+{
+  return (wchar_t *) memmove ((char *) s1, (char *) s2, n * sizeof (wchar_t));
+}
diff --git a/wcsmbs/wmemset.c b/wcsmbs/wmemset.c
new file mode 100644
index 0000000000..918a232775
--- /dev/null
+++ b/wcsmbs/wmemset.c
@@ -0,0 +1,55 @@
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include <wchar.h>
+
+
+wchar_t *
+wmemset (s, c, n)
+     wchar_t *s;
+     wchar_t c;
+     size_t n;
+{
+  register wchar_t *wp = s;
+
+  while (n >= 4)
+    {
+      wp[0] = c;
+      wp[1] = c;
+      wp[2] = c;
+      wp[3] = c;
+      wp += 4;
+      n -= 4;
+    }
+
+  if (n > 0)
+    {
+      *wp++ = c;
+      --n;
+    }
+  if (n > 0)
+    {
+      *wp++ = c;
+      --n;
+    }
+  if (n > 0)
+    *wp = c;
+
+  return s;
+}