aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>1996-02-08 10:00:34 +0000
committerRoland McGrath <roland@gnu.org>1996-02-08 10:00:34 +0000
commita482b5a5959240f5d196b32c4833ac48a03c02c3 (patch)
tree7792121005bdfc6a65efc4ed0e5dd53ae6796a17
parent4ca84cff3b3e184164acde81deaad1fe52eabd14 (diff)
downloadglibc-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--ChangeLog4
-rw-r--r--Makefile2
-rw-r--r--hurd/report-wait.c146
-rw-r--r--posix/getopt.c1
-rw-r--r--wcsmbs/Makefile31
-rw-r--r--wcsmbs/mbsadvance.c38
-rw-r--r--wcsmbs/mbscat.c56
-rw-r--r--wcsmbs/mbschr.c60
-rw-r--r--wcsmbs/mbscmp.c63
-rw-r--r--wcsmbs/mbscpy.c47
-rw-r--r--wcsmbs/mbsdup.c51
-rw-r--r--wcsmbs/mbslen.c45
-rw-r--r--wcsmbs/mbsncat.c61
-rw-r--r--wcsmbs/mbsncmp.c68
-rw-r--r--wcsmbs/mbsncpy.c55
-rw-r--r--wcsmbs/mbsrchr.c61
-rw-r--r--wcsmbs/mbstomb.c42
-rw-r--r--wcsmbs/mbstr.h69
-rw-r--r--wcsmbs/wcscat.c49
-rw-r--r--wcsmbs/wcschr.c35
-rw-r--r--wcsmbs/wcscmp.c42
-rw-r--r--wcsmbs/wcscpy.c44
-rw-r--r--wcsmbs/wcscspn.c38
-rw-r--r--wcsmbs/wcsdup.c38
-rw-r--r--wcsmbs/wcslen.c42
-rw-r--r--wcsmbs/wcsncat.c79
-rw-r--r--wcsmbs/wcsncmp.c70
-rw-r--r--wcsmbs/wcsncpy.c85
-rw-r--r--wcsmbs/wcspbrk.c35
-rw-r--r--wcsmbs/wcsrchr.c38
-rw-r--r--wcsmbs/wcsspn.c45
-rw-r--r--wcsmbs/wcstok.c67
-rw-r--r--wcsmbs/wcstr.h84
-rw-r--r--wcsmbs/wcswcs.c97
34 files changed, 1787 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index e1a5621125..510507f735 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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.
diff --git a/Makefile b/Makefile
index 260254a87b..0042e78052 100644
--- a/Makefile
+++ b/Makefile
@@ -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.