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.tar.xz glibc-a482b5a5959240f5d196b32c4833ac48a03c02c3.zip | |
* 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 0000000000..521c5220b9 --- /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 0da5965137..4e11744db8 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 0000000000..6d75c7b01f --- /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 0000000000..b6649935d7 --- /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 0000000000..324cad9cc8 --- /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 0000000000..f8a7d21857 --- /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 0000000000..04f6f473b9 --- /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 0000000000..8f354ceede --- /dev/null +++ b/wcsmbs/mbscpy.c @@ -0,0 +1,47 @@ +/* Copyright (C) 1995 Free Software Foundation, Inc. |
