diff options
author | Roland McGrath <roland@gnu.org> | 1996-02-08 10:00:34 +0000 |
---|---|---|
committer | Roland McGrath <roland@gnu.org> | 1996-02-08 10:00:34 +0000 |
commit | a482b5a5959240f5d196b32c4833ac48a03c02c3 (patch) | |
tree | 7792121005bdfc6a65efc4ed0e5dd53ae6796a17 | |
parent | 4ca84cff3b3e184164acde81deaad1fe52eabd14 (diff) | |
download | glibc-a482b5a5959240f5d196b32c4833ac48a03c02c3.zip glibc-a482b5a5959240f5d196b32c4833ac48a03c02c3.tar.gz glibc-a482b5a5959240f5d196b32c4833ac48a03c02c3.tar.bz2 |
* Makefile (subdirs): Added wcsmbs.cvs/libc-960208
* wcsmbs: New directory of wide char/multibyte char functions from
drepper.
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | hurd/report-wait.c | 146 | ||||
-rw-r--r-- | posix/getopt.c | 1 | ||||
-rw-r--r-- | wcsmbs/Makefile | 31 | ||||
-rw-r--r-- | wcsmbs/mbsadvance.c | 38 | ||||
-rw-r--r-- | wcsmbs/mbscat.c | 56 | ||||
-rw-r--r-- | wcsmbs/mbschr.c | 60 | ||||
-rw-r--r-- | wcsmbs/mbscmp.c | 63 | ||||
-rw-r--r-- | wcsmbs/mbscpy.c | 47 | ||||
-rw-r--r-- | wcsmbs/mbsdup.c | 51 | ||||
-rw-r--r-- | wcsmbs/mbslen.c | 45 | ||||
-rw-r--r-- | wcsmbs/mbsncat.c | 61 | ||||
-rw-r--r-- | wcsmbs/mbsncmp.c | 68 | ||||
-rw-r--r-- | wcsmbs/mbsncpy.c | 55 | ||||
-rw-r--r-- | wcsmbs/mbsrchr.c | 61 | ||||
-rw-r--r-- | wcsmbs/mbstomb.c | 42 | ||||
-rw-r--r-- | wcsmbs/mbstr.h | 69 | ||||
-rw-r--r-- | wcsmbs/wcscat.c | 49 | ||||
-rw-r--r-- | wcsmbs/wcschr.c | 35 | ||||
-rw-r--r-- | wcsmbs/wcscmp.c | 42 | ||||
-rw-r--r-- | wcsmbs/wcscpy.c | 44 | ||||
-rw-r--r-- | wcsmbs/wcscspn.c | 38 | ||||
-rw-r--r-- | wcsmbs/wcsdup.c | 38 | ||||
-rw-r--r-- | wcsmbs/wcslen.c | 42 | ||||
-rw-r--r-- | wcsmbs/wcsncat.c | 79 | ||||
-rw-r--r-- | wcsmbs/wcsncmp.c | 70 | ||||
-rw-r--r-- | wcsmbs/wcsncpy.c | 85 | ||||
-rw-r--r-- | wcsmbs/wcspbrk.c | 35 | ||||
-rw-r--r-- | wcsmbs/wcsrchr.c | 38 | ||||
-rw-r--r-- | wcsmbs/wcsspn.c | 45 | ||||
-rw-r--r-- | wcsmbs/wcstok.c | 67 | ||||
-rw-r--r-- | wcsmbs/wcstr.h | 84 | ||||
-rw-r--r-- | wcsmbs/wcswcs.c | 97 |
34 files changed, 1787 insertions, 1 deletions
@@ -1,5 +1,9 @@ Wed Feb 7 18:48:30 1996 Roland McGrath <roland@churchy.gnu.ai.mit.edu> + * Makefile (subdirs): Added wcsmbs. + * wcsmbs: New directory of wide char/multibyte char functions from + drepper. + * hurd/hurdmsg.c (_S_msg_report_wait): Function removed. * hurd/report-wait.c: New file. * hurd/Makefile (routines): Added report-wait. @@ -52,7 +52,7 @@ endif # These are the subdirectories containing the library source. subdirs = csu assert ctype db locale intl math setjmp signal stdlib \ - stdio-common $(stdio) malloc string time dirent grp pwd \ + stdio-common $(stdio) malloc string wcsmbs time dirent grp pwd\ posix io termios resource misc socket sysvipc gmon gnulib \ $(wildcard crypt) manual $(sysdep-subdirs) elf export subdirs := $(subdirs) # Benign, useless in GNU make before 3.63. diff --git a/hurd/report-wait.c b/hurd/report-wait.c new file mode 100644 index 0000000..521c522 --- /dev/null +++ b/hurd/report-wait.c @@ -0,0 +1,146 @@ +/* Report on what a thread in our task is waiting for. +Copyright (C) 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. */ + +#include <hurd.h> +#include <hurd/signal.h> +#include <hurd/fd.h> +#include <string.h> +#include <assert.h> +#include <hurd/msg_server.h> +#include "thread_state.h" +#include "intr-msg.h" + +static void +describe_number (string_t description, const char *flavor, int i) +{ + char *p = __stpcpy (description, flavor); + p += i / 10 + 1; + *p = '\0'; + do + { + *--p = '0' + i % 10; + i /= 10; + } while (i != 0); + assert (p[-1] == '#'); +} + +static void +describe_port (string_t description, mach_port_t port) +{ + int i; + + if (port == __mach_task_self ()) + { + strcpy (description, "task-self"); + return; + } + + for (i = 0; i < _hurd_nports; ++i) + if (port == _hurd_ports[i].port) + { + describe_number (description, "init#", i); + return; + } + + if (_hurd_init_dtable) + { + for (i = 0; i < _hurd_init_dtablesize; ++i) + if (port == _hurd_init_dtable[i]) + { + describe_number (description, "fd#", i); + return; + } + } + else if (_hurd_dtable) + { + for (i = 0; i < _hurd_dtablesize; ++i) + if (_hurd_dtable[i] == NULL) + continue; + else if (port == _hurd_dtable[i]->port.port) + { + describe_number (description, "fd#", i); + return; + } + else if (port == _hurd_dtable[i]->ctty.port) + { + describe_number (description, "bgfd#", i); + return; + } + } + + describe_number (description, "port#", port); +} + + +kern_return_t +_S_msg_report_wait (mach_port_t msgport, thread_t thread, + string_t description, int *msgid) +{ + *msgid = 0; + + if (thread == _hurd_msgport_thread) + /* Cute. */ + strcpy (description, "msgport"); + else + { + /* Make sure this is really one of our threads. */ + + struct hurd_sigstate *ss; + + __mutex_lock (&_hurd_siglock); + for (ss = _hurd_sigstates; ss != NULL; ss = ss->next) + if (ss->thread == thread) + break; + __mutex_unlock (&_hurd_siglock); + if (ss == NULL) + /* To hell with you. */ + return EINVAL; + + if (ss->suspended != MACH_PORT_NULL) + strcpy (description, "sigsuspend"); + else + { + /* Examine the thread's state to see if it is blocked in an RPC. */ + + struct machine_thread_state state; + mach_msg_type_number_t count = MACHINE_THREAD_STATE_COUNT; + error_t err; + + err = __thread_get_state (thread, MACHINE_THREAD_STATE_FLAVOR, + (integer_t *) &state, &count); + if (err) + return err; + assert (count == MACHINE_THREAD_STATE_COUNT); + if (SYSCALL_EXAMINE (&state, msgid)) + { + /* Blocked in a system call. */ + if (*msgid == -25) + /* mach_msg system call. Examine its parameters. */ + describe_port (description, MSG_EXAMINE (&state, msgid)); + else + strcpy (description, "kernel"); + } + else + description[0] = '\0'; + } + } + + __mach_port_deallocate (__mach_task_self (), thread); + return 0; +} diff --git a/posix/getopt.c b/posix/getopt.c index 0da5965..4e11744 100644 --- a/posix/getopt.c +++ b/posix/getopt.c @@ -61,6 +61,7 @@ Cambridge, MA 02139, USA. */ /* Don't include stdlib.h for non-GNU C libraries because some of them contain conflicting prototypes for getopt. */ #include <stdlib.h> +#include <unistd.h> #endif /* GNU C library. */ #ifndef _ diff --git a/wcsmbs/Makefile b/wcsmbs/Makefile new file mode 100644 index 0000000..6d75c7b --- /dev/null +++ b/wcsmbs/Makefile @@ -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 index 0000000..b664993 --- /dev/null +++ b/wcsmbs/mbsadvance.c @@ -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 index 0000000..324cad9 --- /dev/null +++ b/wcsmbs/mbscat.c @@ -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 index 0000000..f8a7d21 --- /dev/null +++ b/wcsmbs/mbschr.c @@ -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 index 0000000..04f6f47 --- /dev/null +++ b/wcsmbs/mbscmp.c @@ -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 index 0000000..8f354ce --- /dev/null +++ b/wcsmbs/mbscpy.c @@ -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 index 0000000..2d196dd --- /dev/null +++ b/wcsmbs/mbsdup.c @@ -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 index 0000000..f8077d0 --- /dev/null +++ b/wcsmbs/mbslen.c @@ -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 index 0000000..3dd4df1 --- /dev/null +++ b/wcsmbs/mbsncat.c @@ -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 index 0000000..43fb527 --- /dev/null +++ b/wcsmbs/mbsncmp.c @@ -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 index 0000000..09aecef --- /dev/null +++ b/wcsmbs/mbsncpy.c @@ -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 index 0000000..62fa219 --- /dev/null +++ b/wcsmbs/mbsrchr.c @@ -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 index 0000000..f593ced --- /dev/null +++ b/wcsmbs/mbstomb.c @@ -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 index 0000000..7cb94bf --- /dev/null +++ b/wcsmbs/mbstr.h @@ -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 index 0000000..4ff5c86 --- /dev/null +++ b/wcsmbs/wcscat.c @@ -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 index 0000000..85a1801 --- /dev/null +++ b/wcsmbs/wcschr.c @@ -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 index 0000000..84ecae8 --- /dev/null +++ b/wcsmbs/wcscmp.c @@ -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 index 0000000..a45747e --- /dev/null +++ b/wcsmbs/wcscpy.c @@ -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 index 0000000..0dc4d9b --- /dev/null +++ b/wcsmbs/wcscspn.c @@ -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 index 0000000..62c6462 --- /dev/null +++ b/wcsmbs/wcsdup.c @@ -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 index 0000000..2907cb3 --- /dev/null +++ b/wcsmbs/wcslen.c @@ -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 index 0000000..7851d70 --- /dev/null +++ b/wcsmbs/wcsncat.c @@ -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 index 0000000..9f1829b --- /dev/null +++ b/wcsmbs/wcsncmp.c @@ -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 index 0000000..740c71e --- /dev/null +++ b/wcsmbs/wcsncpy.c @@ -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 index 0000000..83892ba --- /dev/null +++ b/wcsmbs/wcspbrk.c @@ -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 index 0000000..87823b3 --- /dev/null +++ b/wcsmbs/wcsrchr.c @@ -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 index 0000000..81a557c --- /dev/null +++ b/wcsmbs/wcsspn.c @@ -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 index 0000000..191bbd5 --- /dev/null +++ b/wcsmbs/wcstok.c @@ -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 index 0000000..e9cc64d --- /dev/null +++ b/wcsmbs/wcstr.h @@ -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 index 0000000..4b1f2ac --- /dev/null +++ b/wcsmbs/wcswcs.c @@ -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; +} |