Sun Mar 31 18:07:32 1996 Ulrich Drepper <drepper@gnu.ai.mit.edu>
authorroland <roland>
Tue, 2 Apr 1996 13:24:09 +0000 (13:24 +0000)
committerroland <roland>
Tue, 2 Apr 1996 13:24:09 +0000 (13:24 +0000)
* 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".

14 files changed:
wcsmbs/btowc.c [new file with mode: 0644]
wcsmbs/mbrlen.c [new file with mode: 0644]
wcsmbs/mbsinit.c [new file with mode: 0644]
wcsmbs/mbsrtowcs.c [new file with mode: 0644]
wcsmbs/wchar.h [new file with mode: 0644]
wcsmbs/wcrtomb.c [new file with mode: 0644]
wcsmbs/wcsrtombs.c [new file with mode: 0644]
wcsmbs/wcsstr.c [new file with mode: 0644]
wcsmbs/wctob.c [new file with mode: 0644]
wcsmbs/wmemchr.c [new file with mode: 0644]
wcsmbs/wmemcmp.c [new file with mode: 0644]
wcsmbs/wmemcpy.c [new file with mode: 0644]
wcsmbs/wmemmove.c [new file with mode: 0644]
wcsmbs/wmemset.c [new file with mode: 0644]

diff --git a/wcsmbs/btowc.c b/wcsmbs/btowc.c
new file mode 100644 (file)
index 0000000..062be7e
--- /dev/null
@@ -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 (file)
index 0000000..a50631e
--- /dev/null
@@ -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/mbsinit.c b/wcsmbs/mbsinit.c
new file mode 100644 (file)
index 0000000..d9f0125
--- /dev/null
@@ -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 (file)
index 0000000..cb87938
--- /dev/null
@@ -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 (file)
index 0000000..69ad2d3
--- /dev/null
@@ -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 (file)
index 0000000..493e08f
--- /dev/null
@@ -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 (file)
index 0000000..612a86d
--- /dev/null
@@ -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 (file)
index 0000000..d2c863f
--- /dev/null
@@ -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 (file)
index 0000000..c27bd6b
--- /dev/null
@@ -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 (file)
index 0000000..67c4078
--- /dev/null
@@ -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 (file)
index 0000000..f96cad9
--- /dev/null
@@ -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 (file)
index 0000000..e469122
--- /dev/null
@@ -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 (file)
index 0000000..60d6033
--- /dev/null
@@ -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 (file)
index 0000000..918a232
--- /dev/null
@@ -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;
+}