New wide char/multibyte char functions from drepper.
authorroland <roland>
Thu, 8 Feb 1996 02:24:13 +0000 (02:24 +0000)
committerroland <roland>
Thu, 8 Feb 1996 02:24:13 +0000 (02:24 +0000)
30 files changed:
wcsmbs/Makefile [new file with mode: 0644]
wcsmbs/mbsadvance.c [new file with mode: 0644]
wcsmbs/mbscat.c [new file with mode: 0644]
wcsmbs/mbschr.c [new file with mode: 0644]
wcsmbs/mbscmp.c [new file with mode: 0644]
wcsmbs/mbscpy.c [new file with mode: 0644]
wcsmbs/mbsdup.c [new file with mode: 0644]
wcsmbs/mbslen.c [new file with mode: 0644]
wcsmbs/mbsncat.c [new file with mode: 0644]
wcsmbs/mbsncmp.c [new file with mode: 0644]
wcsmbs/mbsncpy.c [new file with mode: 0644]
wcsmbs/mbsrchr.c [new file with mode: 0644]
wcsmbs/mbstomb.c [new file with mode: 0644]
wcsmbs/mbstr.h [new file with mode: 0644]
wcsmbs/wcscat.c [new file with mode: 0644]
wcsmbs/wcschr.c [new file with mode: 0644]
wcsmbs/wcscmp.c [new file with mode: 0644]
wcsmbs/wcscpy.c [new file with mode: 0644]
wcsmbs/wcscspn.c [new file with mode: 0644]
wcsmbs/wcsdup.c [new file with mode: 0644]
wcsmbs/wcslen.c [new file with mode: 0644]
wcsmbs/wcsncat.c [new file with mode: 0644]
wcsmbs/wcsncmp.c [new file with mode: 0644]
wcsmbs/wcsncpy.c [new file with mode: 0644]
wcsmbs/wcspbrk.c [new file with mode: 0644]
wcsmbs/wcsrchr.c [new file with mode: 0644]
wcsmbs/wcsspn.c [new file with mode: 0644]
wcsmbs/wcstok.c [new file with mode: 0644]
wcsmbs/wcstr.h [new file with mode: 0644]
wcsmbs/wcswcs.c [new file with mode: 0644]

diff --git a/wcsmbs/Makefile b/wcsmbs/Makefile
new file mode 100644 (file)
index 0000000..6d75c7b
--- /dev/null
@@ -0,0 +1,31 @@
+# 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.
+
+#
+#      Sub-makefile for wcsmbs portion of the library.
+#
+subdir := wcsmbs
+
+headers        := wcstr.h mbstr.h
+
+routines := mbsadvance mbscat mbschr mbscmp mbscpy mbsdup mbslen       \
+           mbsncat mbsncmp mbsncpy mbsrchr mbstomb wcscat wcschr wcscmp\
+           wcscpy wcscspn wcsdup wcslen wcsncat wcsncmp wcsncpy wcspbrk\
+           wcsrchr wcsspn wcstok wcswcs
+
+include ../Rules
diff --git a/wcsmbs/mbsadvance.c b/wcsmbs/mbsadvance.c
new file mode 100644 (file)
index 0000000..b664993
--- /dev/null
@@ -0,0 +1,38 @@
+/* Copyright (C) 1995 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.  */
+
+#include <mbstr.h>
+#include <stdlib.h>
+
+
+/* Advance pointer to multibyte string by one character.  */
+char *
+mbsadvance (mbs)
+    const char *mbs;
+{
+  int clen;
+
+  /* Reset multibyte characters to their initial state.         */
+  (void) mblen ((char *) NULL, 0);
+
+  clen = mblen (mbs, MB_CUR_MAX);
+
+  /* FIXME: when current character is illegal return same character.  */
+  return clen <= 0 ? (char *) mbs : (char *) (mbs + clen);
+}
+
diff --git a/wcsmbs/mbscat.c b/wcsmbs/mbscat.c
new file mode 100644 (file)
index 0000000..324cad9
--- /dev/null
@@ -0,0 +1,56 @@
+/* Copyright (C) 1995 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.  */
+
+#include <mbstr.h>
+#include <stdlib.h>
+
+
+/* Append SRC onto DEST.  */
+char *
+mbscat (dest, src)
+    char *dest;
+    const char *src;
+{
+  const char * const d = dest;
+  size_t len = 0;
+  int clen = 0;
+
+  /* Reset multibyte characters to their initial state.         */
+  (void) mblen ((char *) NULL, 0);
+
+  do
+    {
+      dest += clen;
+      clen = mblen (dest, MB_CUR_MAX);
+    }
+  while (clen > 0);
+
+  clen = 0;
+  do
+    {
+      len += clen;
+      clen = mblen (&src[len], MB_CUR_MAX);
+    }
+  while (clen > 0);
+
+  (void) memcpy ((void *) dest, (void *) src, len);
+  dest[len] = '\0';        /* '\0' is the multibyte representation of L'\0' */
+
+  return (char *) d;
+}
+
diff --git a/wcsmbs/mbschr.c b/wcsmbs/mbschr.c
new file mode 100644 (file)
index 0000000..f8a7d21
--- /dev/null
@@ -0,0 +1,60 @@
+/* Copyright (C) 1995 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.  */
+
+#include <mbstr.h>
+#include <stdlib.h>
+
+#define __need_wchar_t
+#include <stddef.h>
+
+
+/* Find the first occurence of MBC in MBS.  */
+char *
+mbschr (mbs, mbc)
+    const char *mbs;
+    mbchar_t mbc;
+{
+  int clen;
+  wchar_t wc;
+  wchar_t c;
+
+  /* Reset multibyte characters to their initial state.         */
+  (void) mblen ((char *) NULL, 0);
+
+  clen = mbtowc (&wc, (char *) &mbc, MB_CUR_MAX);
+  if (clen < 0)
+    /* FIXME: search character is illegal.  */
+    return NULL;
+  else if (clen == 0)
+    wc = L'\0';
+
+  clen = 0;
+  do
+    {
+      mbs += clen;
+      clen = mbtowc (&c, mbs, MB_CUR_MAX);
+    }
+  while (clen > 0 && c != wc);
+
+  if (clen < 0 || (clen == 0 && wc != L'\0'))
+    /* FIXME: clen < 0 means illegal character in string.  */
+    return NULL;
+
+  return (char *) mbs;
+}
+
diff --git a/wcsmbs/mbscmp.c b/wcsmbs/mbscmp.c
new file mode 100644 (file)
index 0000000..04f6f47
--- /dev/null
@@ -0,0 +1,63 @@
+/* Copyright (C) 1995 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.  */
+
+#include <mbstr.h>
+#include <stdlib.h>
+
+#define __need_wchar_t
+/* FIXME: should be defined in stddef.h.
+!!! #define __need_uwchar_t  */
+typedef unsigned int uwchar_t;
+#include <stddef.h>
+
+
+/* Compare MBS1 and MBS2.  */
+int
+mbscmp (mbs1, mbs2)
+    const char *mbs1;
+    const char *mbs2;
+{
+  int len1 = 0;
+  int len2 = 0;
+  uwchar_t c1;
+  uwchar_t c2;
+
+  /* Reset multibyte characters to their initial state.         */
+  (void) mblen ((char *) NULL, 0);
+
+  do
+    {
+      len1 = mbtowc ((wchar_t *) &c1, mbs1, MB_CUR_MAX);
+      len2 = mbtowc ((wchar_t *) &c2, mbs2, MB_CUR_MAX);
+
+      if (len1 == 0)
+       return len2 == 0 ? 0 : -1;
+      if (len2 == 0)
+       return 1;
+      if (len1 < 0 || len2 < 0)
+       /* FIXME: an illegal character appears.  What to do?  */
+       return c1 - c2;
+
+      mbs1 += len1;
+      mbs2 += len2;
+    }
+  while (c1 == c2);
+
+  return c1 - c2;
+}
+
diff --git a/wcsmbs/mbscpy.c b/wcsmbs/mbscpy.c
new file mode 100644 (file)
index 0000000..8f354ce
--- /dev/null
@@ -0,0 +1,47 @@
+/* Copyright (C) 1995 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.  */
+
+#include <mbstr.h>
+#include <stdlib.h>
+
+
+/* Copy SRC to DEST.  */
+char *
+mbscpy (dest, src)
+    char *dest;
+    const char *src;
+{
+  size_t len = 0;
+  int clen = 0;
+
+  /* Reset multibyte characters to their initial state.         */
+  (void) mblen ((char *) NULL, 0);
+
+  do
+    {
+      len += clen;
+      clen = mblen (&src[len], MB_CUR_MAX);
+    }
+  while (clen > 0);
+
+  (void) memcpy ((void *) dest, (void *) src, len);
+  dest[len] = '\0';        /* '\0' is the multibyte representation of L'\0' */
+
+  return dest;
+}
+
diff --git a/wcsmbs/mbsdup.c b/wcsmbs/mbsdup.c
new file mode 100644 (file)
index 0000000..2d196dd
--- /dev/null
@@ -0,0 +1,51 @@
+/* Copyright (C) 1995 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.  */
+
+#include <mbstr.h>
+#include <stdlib.h>
+
+
+/* Duplicate MBS, returning an identical malloc'd string.  */
+char *
+mbsdup (mbs)
+    const char *mbs;
+{
+  size_t len = 0;
+  int clen = 0;
+  char *retval;
+
+  /* Reset multibyte characters to their initial state.         */
+  (void) mblen ((char *) NULL, 0);
+
+  do
+    {
+      len += clen;
+      clen = mblen (&mbs[len], MB_CUR_MAX);
+    }
+  while (clen > 0);
+
+  retval = (char *) malloc (len + 1);
+  if (retval != NULL)
+    {
+      (void) memcpy ((void *) retval, (void *) mbs, len);
+      retval[len] = '\0';   /* '\0' is the multibyte representation of L'\0' */
+    }
+
+  return retval;
+}
+
diff --git a/wcsmbs/mbslen.c b/wcsmbs/mbslen.c
new file mode 100644 (file)
index 0000000..f8077d0
--- /dev/null
@@ -0,0 +1,45 @@
+/* Copyright (C) 1995 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.  */
+
+#include <mbstr.h>
+#include <stdlib.h>
+
+
+/* Return the length of MBS.  */
+size_t
+mbslen (mbs)
+    const char *mbs;
+{
+  size_t len = 0;
+  int clen = 0;
+
+  /* Reset multibyte characters to their initial state.         */
+  (void) mblen ((char *) NULL, 0);
+
+  do
+    {
+      len += clen;
+      clen = mblen (&mbs[len], MB_CUR_MAX);
+    }
+  while (clen > 0);
+
+  /* FIXME: if string contains an illegal character the length upto this
+     character is returned.  */
+  return len;
+}
+
diff --git a/wcsmbs/mbsncat.c b/wcsmbs/mbsncat.c
new file mode 100644 (file)
index 0000000..3dd4df1
--- /dev/null
@@ -0,0 +1,61 @@
+/* Copyright (C) 1995 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.  */
+
+#include <mbstr.h>
+#include <stdlib.h>
+
+
+/* Append no more than N multi-byte characters from SRC onto DEST.  */
+char *
+mbsncat (dest, src, n)
+    char *dest;
+    const char *src;
+    size_t n;
+{
+  const char * const d = dest;
+  const char * const s = src;
+  size_t len = 0;
+  int clen = 0;
+
+  if (n == 0)
+    return (char *) d;
+
+  /* Reset multibyte characters to their initial state.         */
+  (void) mblen ((char *) NULL, 0);
+
+  do
+    {
+      dest += clen;
+      clen = mblen (dest, MB_CUR_MAX);
+    }
+  while (clen > 0);
+
+  clen = 0;
+  do
+    {
+      src += clen;
+      clen = mblen (src, MB_CUR_MAX);
+    }
+  while (clen > 0 && ++len < n);
+
+  (void) memcpy ((void *) dest, (void *) s, src - s);
+  dest[src - s] = '\0';            /* '\0' is the multibyte representation of L'\0' */
+
+  return (char *) d;
+}
+
diff --git a/wcsmbs/mbsncmp.c b/wcsmbs/mbsncmp.c
new file mode 100644 (file)
index 0000000..43fb527
--- /dev/null
@@ -0,0 +1,68 @@
+/* Copyright (C) 1995 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.  */
+
+#include <mbstr.h>
+#include <stdlib.h>
+
+#define __need_wchar_t
+/* FIXME: should be defined in stddef.h.
+!!! #define __need_uwchar_t  */
+typedef unsigned int uwchar_t;
+#include <stddef.h>
+
+
+/* Compare N characters of MBS1 and MBS2.  */
+int
+mbsncmp (mbs1, mbs2, n)
+    const char *mbs1;
+    const char *mbs2;
+    size_t n;
+{
+  size_t len = 0;
+  int clen1 = 0;
+  int clen2 = 0;
+  uwchar_t c1;
+  uwchar_t c2;
+
+  if (n == 0)
+    return 0;
+
+  /* Reset multibyte characters to their initial state.         */
+  (void) mblen ((char *) NULL, 0);
+
+  do
+    {
+      clen1 = mbtowc ((wchar_t *) &c1, mbs1, MB_CUR_MAX);
+      clen2 = mbtowc ((wchar_t *) &c2, mbs2, MB_CUR_MAX);
+
+      if (clen1 == 0)
+       return clen2 == 0 ? 0 : -1;
+      if (clen2 == 0)
+       return 1;
+      if (clen1 < 0 || clen2 < 0)
+       /* FIXME: an illegal character appears.  What to do?  */
+       return c1 - c2;
+
+      mbs1 += clen1;
+      mbs2 += clen2;
+    }
+  while (c1 == c2 && ++len < n);
+
+  return len < n ? c1 - c2 : 0;
+}
+
diff --git a/wcsmbs/mbsncpy.c b/wcsmbs/mbsncpy.c
new file mode 100644 (file)
index 0000000..09aecef
--- /dev/null
@@ -0,0 +1,55 @@
+/* Copyright (C) 1995 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.  */
+
+#include <mbstr.h>
+#include <stdlib.h>
+
+
+/* Copy no more than N characters of SRC to DEST.  */
+char *
+mbsncpy (dest, src, n)
+    char *dest;
+    const char *src;
+    size_t n;
+{
+  const char * const s = src;
+  size_t len = 0;
+  int clen = 0;
+
+  if (n == 0)
+    {
+      dest[0] = '\0';      /* '\0' is the multibyte representation of L'\0' */
+      return dest;
+    }
+
+  /* Reset multibyte characters to their initial state.         */
+  (void) mblen ((char *) NULL, 0);
+
+  do
+    {
+      src += clen;
+      clen = mblen (src, MB_CUR_MAX);
+    }
+  while (clen > 0 && ++len < n);
+
+  (void) memcpy ((void *) dest, (void *) s, src - s);
+  dest[src - s] = '\0';            /* '\0' is the multibyte representation of L'\0' */
+
+  return dest;
+}
+
diff --git a/wcsmbs/mbsrchr.c b/wcsmbs/mbsrchr.c
new file mode 100644 (file)
index 0000000..62fa219
--- /dev/null
@@ -0,0 +1,61 @@
+/* Copyright (C) 1995 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.  */
+
+#include <mbstr.h>
+#include <stdlib.h>
+
+#define __need_wchar_t
+#include <stddef.h>
+
+
+/* Find the last occurence of MBC in MBS.  */
+char *
+mbsrchr (mbs, mbc)
+    const char *mbs;
+    mbchar_t mbc;
+{
+  const char * retval = NULL;
+  int clen;
+  wchar_t wc;
+  wchar_t c;
+
+  /* Reset multibyte characters to their initial state.         */
+  (void) mblen ((char *) NULL, 0);
+
+  clen = mbtowc (&wc, (char *) &mbc, MB_CUR_MAX);
+  if (clen < 0)
+    /* FIXME: search character MBC is illegal. */
+    return NULL;
+  else if (clen == 0)
+    wc = L'\0';
+
+  clen = 0;
+  do
+    {
+      mbs += clen;
+      clen = mbtowc (&c, mbs, MB_CUR_MAX);
+    }
+  while (clen > 0 && c != wc);
+
+  if (clen < 0)
+    /* FIXME: clen < 0 means illegal character in string.  */
+    return NULL;
+
+  return (char *) (clen > 0 || (clen == 0 && wc == L'\0') ? mbs : retval);
+}
+
diff --git a/wcsmbs/mbstomb.c b/wcsmbs/mbstomb.c
new file mode 100644 (file)
index 0000000..f593ced
--- /dev/null
@@ -0,0 +1,42 @@
+/* Copyright (C) 1995 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.  */
+
+#include <mbstr.h>
+#include <stdlib.h>
+
+
+/* Advance pointer to multibyte string by one character.  */
+mbchar_t
+mbstomb (mbs)
+    const char *mbs;
+{
+  mbchar_t retval = 0;
+  int clen;
+
+  /* Reset multibyte characters to their initial state.         */
+  (void) mblen ((char *) NULL, 0);
+
+  clen = mblen (mbs, MB_CUR_MAX);
+
+  if (clen > 0)
+    (void) memcpy (&retval, mbs, clen);
+
+  /* FIXME: when current character is illegal return '\0'.  */
+  return retval;
+}
+
diff --git a/wcsmbs/mbstr.h b/wcsmbs/mbstr.h
new file mode 100644 (file)
index 0000000..7cb94bf
--- /dev/null
@@ -0,0 +1,69 @@
+/* Copyright (C) 1995 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.  */
+
+#ifndef _MBSTRING_H
+
+#define _MBSTRING_H 1
+#include <features.h>
+#include <limits.h>
+
+#define __need_size_t
+#include <stddef.h>
+
+__BEGIN_DECLS
+
+/* This data type should be large enough to contain MB_CUR_MAX bytes.  */
+typedef unsigned int mbchar_t;
+
+
+/* Copy SRC to DEST.  */
+extern char *mbscpy __P ((char *__dest, __const char *__src));
+/* Copy no more than N multi-byte characters of SRC to DEST.  */
+extern char *mbsncpy __P ((char *__dest, __const char *__src, size_t __n));
+
+/* Append SRC onto DEST.  */
+extern char *mbscat __P ((char *__dest, __const char *__src));
+/* Append no more than N characters from SRC onto DEST.  */
+extern char *mbsncat __P ((char *__dest, __const char *__src, size_t __n));
+
+/* Compare S1 and S2.  */
+extern int mbscmp __P ((__const char *__s1, __const char *__s2));
+/* Compare N characters of S1 and S2.  */
+extern int mbsncmp __P ((__const char *__s1, __const char *__s2, size_t __n));
+
+/* Duplicate MBS, returning an identical malloc'd string.  */
+extern char *mbsdup __P ((__const char *__s));
+
+/* Find the first occurence of MBC in MBS.  */
+extern char *mbschr __P ((__const char *__mbs, mbchar_t mbc));
+/* Find the last occurence of MBC in MBS.  */
+extern char *mbsrchr __P ((__const char *__mbs, mbchar_t mbc));
+
+/* Return the length of MBS.  */
+extern size_t mbslen __P ((__const char *__mbs));
+
+
+/* Advance pointer to multibyte string by one character.  */
+extern char *mbsadvance __P ((__const char *__mbs));
+
+/* Return first character in MBS.  */
+extern mbchar_t mbstomb __P ((__const char *__mbs));
+
+__END_DECLS
+
+#endif /* mbstring.h */
diff --git a/wcsmbs/wcscat.c b/wcsmbs/wcscat.c
new file mode 100644 (file)
index 0000000..4ff5c86
--- /dev/null
@@ -0,0 +1,49 @@
+/* Copyright (C) 1995 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.  */
+
+#include <wcstr.h>
+
+
+/* Append SRC on the end of DEST.  */
+wchar_t *
+wcscat (dest, src)
+    wchar_t *dest;
+    const wchar_t *src;
+{
+  register wchar_t *s1 = dest;
+  register const wchar_t *s2 = src;
+  wchar_t c;
+
+  /* Find the end of the string.  */
+  do
+    c = *s1++;
+  while (c != L'\0');
+
+  /* Make S1 point before the next character, so we can increment
+     it while memory is read (wins on pipelined cpus). */
+  s1 -= 2;
+
+  do
+    {
+      c = *s2++;
+      *++s1 = c;
+    }
+  while (c != L'\0');
+
+  return dest;
+}
diff --git a/wcsmbs/wcschr.c b/wcsmbs/wcschr.c
new file mode 100644 (file)
index 0000000..85a1801
--- /dev/null
@@ -0,0 +1,35 @@
+/* Copyright (C) 1995 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.  */
+
+#include <wcstr.h>
+
+
+/* Find the first ocurrence of WC in WCS.  */
+wchar_t *
+wcschr (wcs, wc)
+    register const wchar_t *wcs;
+    register const wchar_t wc;
+{
+  while (*wcs != L'\0')
+    if (*wcs == wc)
+      return (wchar_t *) wcs;
+    else
+      ++wcs;
+
+  return NULL;
+}
diff --git a/wcsmbs/wcscmp.c b/wcsmbs/wcscmp.c
new file mode 100644 (file)
index 0000000..84ecae8
--- /dev/null
@@ -0,0 +1,42 @@
+/* Copyright (C) 1995 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.  */
+
+#include <wcstr.h>
+
+
+/* Compare S1 and S2, returning less than, equal to or
+   greater than zero if S1 is lexiographically less than,
+   equal to or greater than S2.         */
+int
+wcscmp (s1, s2)
+    const wchar_t *s1;
+    const wchar_t *s2;
+{
+  uwchar_t c1, c2;
+
+  do
+    {
+      c1 = (uwchar_t) *s1++;
+      c2 = (uwchar_t) *s2++;
+      if (c1 == L'\0')
+       return c1 - c2;
+    }
+  while (c1 == c2);
+
+  return c1 - c2;
+}
diff --git a/wcsmbs/wcscpy.c b/wcsmbs/wcscpy.c
new file mode 100644 (file)
index 0000000..a45747e
--- /dev/null
@@ -0,0 +1,44 @@
+/* Copyright (C) 1995 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.  */
+
+#include <wcstr.h>
+
+#define __need_ptrdiff_t
+#include <stddef.h>
+
+
+/* Copy SRC to DEST.  */
+wchar_t *
+wcscpy (dest, src)
+    wchar_t *dest;
+    const wchar_t *src;
+{
+  wchar_t *wcp = (wchar_t *) src;
+  wchar_t c;
+  const ptrdiff_t off = dest - src - 1;
+
+  do
+    {
+      c = *wcp++;
+      wcp[off] = c;
+    }
+  while (c != L'\0');
+
+  return dest;
+}
+
diff --git a/wcsmbs/wcscspn.c b/wcsmbs/wcscspn.c
new file mode 100644 (file)
index 0000000..0dc4d9b
--- /dev/null
@@ -0,0 +1,38 @@
+/* Copyright (C) 1995 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.  */
+
+#include <wcstr.h>
+
+
+/* Return the length of the maximum initial segment
+   of WCS which contains only wide-characters not in REJECT.  */
+size_t
+wcscspn (wcs, reject)
+    const wchar_t *wcs;
+    const wchar_t *reject;
+{
+  register size_t count = 0;
+
+  while (*wcs != L'\0')
+    if (wcschr (reject, *wcs++) == NULL)
+      ++count;
+    else
+      return count;
+
+  return count;
+}
diff --git a/wcsmbs/wcsdup.c b/wcsmbs/wcsdup.c
new file mode 100644 (file)
index 0000000..62c6462
--- /dev/null
@@ -0,0 +1,38 @@
+/* Copyright (C) 1995 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.  */
+
+#include <wcstr.h>
+#include <string.h>
+#include <stdlib.h>
+
+
+/* Duplicate S, returning an identical malloc'd string.         */
+wchar_t *
+wcsdup (s)
+    const wchar_t *s;
+{
+  size_t len = (wcslen (s) + 1) * sizeof (wchar_t);
+  void *new = malloc (len);
+
+  if (new == NULL)
+    return NULL;
+
+  memcpy (new, (void *) s, len);
+
+  return (wchar_t *) new;
+}
diff --git a/wcsmbs/wcslen.c b/wcsmbs/wcslen.c
new file mode 100644 (file)
index 0000000..2907cb3
--- /dev/null
@@ -0,0 +1,42 @@
+/* Copyright (C) 1995 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.  */
+
+#include <wcstr.h>
+
+
+/* Copy SRC to DEST.  */
+size_t
+wcslen (s)
+    const wchar_t *s;
+{
+  size_t len = 0;
+
+  while (s[len] != L'\0')
+    {
+      if (s[++len] == L'\0')
+       return len;
+      if (s[++len] == L'\0')
+       return len;
+      if (s[++len] == L'\0')
+       return len;
+      ++len;
+    }
+
+  return len;
+}
+
diff --git a/wcsmbs/wcsncat.c b/wcsmbs/wcsncat.c
new file mode 100644 (file)
index 0000000..7851d70
--- /dev/null
@@ -0,0 +1,79 @@
+/* Copyright (C) 1995 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.  */
+
+#include <wcstr.h>
+
+
+/* Append no more than N wide-character of SRC onto DEST.  */
+wchar_t *
+wcsncat (dest, src, n)
+      wchar_t *dest;
+      const wchar_t *src;
+      size_t n;
+{
+  wchar_t c;
+  wchar_t * const s = dest;
+
+  /* Find the end of DEST.  */
+  do
+    c = *dest++;
+  while (c != L'\0');
+
+  /* Make DEST point before next character, so we can increment
+     it while memory is read (wins on pipelined cpus). */
+  dest -= 2;
+
+  if (n >= 4)
+    {
+      size_t n4 = n >> 2;
+      do
+       {
+         c = *src++;
+         *++dest = c;
+         if (c == L'\0')
+           return s;
+         c = *src++;
+         *++dest = c;
+         if (c == L'\0')
+           return s;
+         c = *src++;
+         *++dest = c;
+         if (c == L'\0')
+           return s;
+         c = *src++;
+         *++dest = c;
+         if (c == L'\0')
+           return s;
+       } while (--n4 > 0);
+      n &= 3;
+    }
+
+  while (n > 0)
+    {
+      c = *src++;
+      *++dest = c;
+      if (c == L'\0')
+       return s;
+      n--;
+    }
+
+  if (c != L'\0')
+    *++dest = L'\0';
+
+  return s;
+}
diff --git a/wcsmbs/wcsncmp.c b/wcsmbs/wcsncmp.c
new file mode 100644 (file)
index 0000000..9f1829b
--- /dev/null
@@ -0,0 +1,70 @@
+/* Copyright (C) 1995 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.  */
+
+#include <wcstr.h>
+
+
+/* Compare no more than N characters of S1 and S2,
+   returning less than, equal to or greater than zero
+   if S1 is lexiographically less than, equal to or
+   greater than S2.  */
+int
+wcsncmp (s1, s2, n)
+      const wchar_t *s1;
+      const wchar_t *s2;
+      size_t n;
+{
+  uwchar_t c1 = L'\0';
+  uwchar_t c2 = L'\0';
+
+  if (n >= 4)
+    {
+      size_t n4 = n >> 2;
+      do
+       {
+         c1 = (uwchar_t) *s1++;
+         c2 = (uwchar_t) *s2++;
+         if (c1 == L'\0' || c1 != c2)
+           return c1 - c2;
+         c1 = (uwchar_t) *s1++;
+         c2 = (uwchar_t) *s2++;
+         if (c1 == L'\0' || c1 != c2)
+           return c1 - c2;
+         c1 = (uwchar_t) *s1++;
+         c2 = (uwchar_t) *s2++;
+         if (c1 == L'\0' || c1 != c2)
+           return c1 - c2;
+         c1 = (uwchar_t) *s1++;
+         c2 = (uwchar_t) *s2++;
+         if (c1 == L'\0' || c1 != c2)
+           return c1 - c2;
+       } while (--n4 > 0);
+      n &= 3;
+    }
+
+  while (n > 0)
+    {
+      c1 = (uwchar_t) *s1++;
+      c2 = (uwchar_t) *s2++;
+      if (c1 == L'\0' || c1 != c2)
+       return c1 - c2;
+      n--;
+    }
+
+  return c1 - c2;
+}
diff --git a/wcsmbs/wcsncpy.c b/wcsmbs/wcsncpy.c
new file mode 100644 (file)
index 0000000..740c71e
--- /dev/null
@@ -0,0 +1,85 @@
+/* Copyright (C) 1995 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.  */
+
+#include <wcstr.h>
+
+
+/* Copy no more than N wide-characters of SRC to DEST. */
+wchar_t *
+wcsncpy (dest, src, n)
+      wchar_t *dest;
+      const wchar_t *src;
+      size_t n;
+{
+  wchar_t c;
+  wchar_t * const s = dest;
+
+  --dest;
+
+  if (n >= 4)
+    {
+      size_t n4 = n >> 2;
+
+      for (;;)
+       {
+         c = *src++;
+         *++dest = c;
+         if (c == L'\0')
+           break;
+         c = *src++;
+         *++dest = c;
+         if (c == L'\0')
+           break;
+         c = *src++;
+         *++dest = c;
+         if (c == L'\0')
+           break;
+         c = *src++;
+         *++dest = c;
+         if (c == L'\0')
+           break;
+         if (--n4 == 0)
+           goto last_chars;
+       }
+      n = n - (dest - s) - 1;
+      if (n == 0)
+       return s;
+      goto zero_fill;
+    }
+
+ last_chars:
+  n &= 3;
+  if (n == 0)
+    return s;
+
+  do
+    {
+      c = *src++;
+      *++dest = c;
+      if (--n == 0)
+       return s;
+    }
+  while (c != L'\0');
+
+ zero_fill:
+  do
+    *++dest = L'\0';
+  while (--n > 0);
+
+  return s;
+}
diff --git a/wcsmbs/wcspbrk.c b/wcsmbs/wcspbrk.c
new file mode 100644 (file)
index 0000000..83892ba
--- /dev/null
@@ -0,0 +1,35 @@
+/* Copyright (C) 1995 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.  */
+
+#include <wcstr.h>
+
+
+/* Find the first ocurrence in WCS of any wide-character in ACCEPT.  */
+wchar_t *
+wcspbrk (wcs, accept)
+      register const wchar_t *wcs;
+      register const wchar_t *accept;
+{
+  while (*wcs != L'\0')
+    if (wcschr (accept, *wcs) == NULL)
+      ++wcs;
+    else
+      return (wchar_t *) wcs;
+
+  return NULL;
+}
diff --git a/wcsmbs/wcsrchr.c b/wcsmbs/wcsrchr.c
new file mode 100644 (file)
index 0000000..87823b3
--- /dev/null
@@ -0,0 +1,38 @@
+/* Copyright (C) 1995 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.  */
+
+#include <wcstr.h>
+
+
+/* Find the last ocurrence of WC in WCS.  */
+wchar_t *
+wcsrchr (wcs, wc)
+    register const wchar_t *wcs;
+    register const wchar_t wc;
+{
+  const wchar_t *retval = NULL;
+
+  while (*wcs != L'\0')
+    {
+      if (*wcs == wc)
+       retval = wcs;
+      ++wcs;
+    }
+
+  return (wchar_t *) retval;
+}
diff --git a/wcsmbs/wcsspn.c b/wcsmbs/wcsspn.c
new file mode 100644 (file)
index 0000000..81a557c
--- /dev/null
@@ -0,0 +1,45 @@
+/* Copyright (C) 1995 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.  */
+
+#include <wcstr.h>
+
+
+/* Return the length of the maximum initial segment
+   of WCS which contains only wide-characters in ACCEPT.  */
+size_t
+wcsspn (wcs, accept)
+    const wchar_t *wcs;
+    const wchar_t *accept;
+{
+  register const wchar_t *p;
+  register const wchar_t *a;
+  register size_t count = 0;
+
+  for (p = wcs; *p != L'\0'; ++p)
+    {
+      for (a = accept; *a != L'\0'; ++a)
+       if (*p == *a)
+         break;
+      if (*a == L'\0')
+       return count;
+      else
+       ++count;
+    }
+
+  return count;
+}
diff --git a/wcsmbs/wcstok.c b/wcsmbs/wcstok.c
new file mode 100644 (file)
index 0000000..191bbd5
--- /dev/null
@@ -0,0 +1,67 @@
+/* Copyright (C) 1995 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.  */
+
+#include <wcstr.h>
+#include <errno.h>
+
+
+static wchar_t *olds = NULL;
+
+/* Parse WCS into tokens separated by characters in DELIM.
+   If WCS is NULL, the last string wcstok() was called with is
+   used.  */
+wchar_t *
+wcstok (wcs, delim)
+    register wchar_t *wcs;
+    register const wchar_t *delim;
+{
+  wchar_t *token;
+
+  if (wcs == NULL)
+    {
+      if (olds == NULL)
+       {
+         errno = EINVAL;
+         return NULL;
+       }
+      else
+       wcs = olds;
+    }
+
+  /* Scan leading delimiters.  */
+  wcs += wcsspn (wcs, delim);
+  if (*wcs == L'\0')
+    {
+      olds = NULL;
+      return NULL;
+    }
+
+  /* Find the end of the token.         */
+  token = wcs;
+  wcs = wcspbrk (token, delim);
+  if (wcs == NULL)
+    /* This token finishes the string. */
+    olds = NULL;
+  else
+    {
+      /* Terminate the token and make OLDS point past it.  */
+      *wcs = L'\0';
+      olds = wcs + 1;
+    }
+  return token;
+}
diff --git a/wcsmbs/wcstr.h b/wcsmbs/wcstr.h
new file mode 100644 (file)
index 0000000..e9cc64d
--- /dev/null
@@ -0,0 +1,84 @@
+/* Copyright (C) 1995 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, 1992 Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+#ifndef _WCSTRING_H
+
+#define _WCSTRING_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
+#include <stddef.h>
+
+/* FIXME: Should go with this or another name in stddef.h.  */
+typedef unsigned int uwchar_t;
+
+
+/* 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 *wcswcs __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));
+
+/* Return the number of wide-characters in S.  */
+extern size_t wcslen __P ((__const wchar_t *__s));
+
+__END_DECLS
+
+#endif /* wcstring.h */
diff --git a/wcsmbs/wcswcs.c b/wcsmbs/wcswcs.c
new file mode 100644 (file)
index 0000000..4b1f2ac
--- /dev/null
@@ -0,0 +1,97 @@
+/* Copyright (C) 1995 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 <wcstr.h>
+
+wchar_t *
+wcswcs (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;
+}