summary refs log tree commit diff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1997-03-29 17:32:35 +0000
committerUlrich Drepper <drepper@redhat.com>1997-03-29 17:32:35 +0000
commit993b3242cdc37152fbbc7fbd5ce22b2734b04b23 (patch)
treed3c4fc94e027728055d96a370d034b6fb685cf85
parente7fd8a39abd3a9c9d2139e686b17efb5dc3bf444 (diff)
downloadglibc-993b3242cdc37152fbbc7fbd5ce22b2734b04b23.tar.gz
glibc-993b3242cdc37152fbbc7fbd5ce22b2734b04b23.tar.xz
glibc-993b3242cdc37152fbbc7fbd5ce22b2734b04b23.zip
Update.
1997-03-29 17:39  Ulrich Drepper  <drepper@cygnus.com>

	* math/Makefile (routines): Add carg, s_ccosh and s_csinh.

	* math/complex.h: Add C++ protection.

	* math/libm-test.c (cexp_test): Correct a few bugs.
	(csinh_test): New function.
	(ccosh_test): New function.
	(cacos_test): New function.
	(cacosh_test): New function.
	(casinh_test): New function.
	(catanh_test): New function.
	(main): Add calls to csinh_test and ccosh_test.

	* misc/Makefile (tests): Add tst-tsearch.
	Add rule to link tst-tsearch against libm.
	* misc/tsearch.c: Rewritten to use Red-Black-Tree algorithm by
	Bernd Schmidt <crux@Pool.Informatik.RWTH-Aachen.DE>.
	* misc/tst-tsearch.c: New file.

	* stdio-common/bug5.c: Clear LD_LIBRARY_PATH environment variable
	before using system.
	* stdio-common/test-popen.c: Clear LD_LIBRARY_PATH environment variable
	before using popen.

	* sysdeps/libm-ieee754/s_cexp.c: Correct handling of special cases.
	* sysdeps/libm-ieee754/s_cexpf.c: Likewise.
	* sysdeps/libm-ieee754/s_cexpl.c: Likewise.

	* sysdeps/libm-i387/s_cexp.S: New file.  ix87 specific implementation
	of complex exponential function.
	* sysdeps/libm-i387/s_cexpf.S: New file.
	* sysdeps/libm-i387/s_cexpl.S: New file.

	* sysdeps/libm-ieee754/s_ccosh.c: New file.  Implementation of
	complex cosh function.
	* sysdeps/libm-ieee754/s_ccoshf.c: New file.
	* sysdeps/libm-ieee754/s_ccoshl.c: New file.
	* sysdeps/libm-ieee754/s_csinh.c: New file.  Implementation of
	complex sinh function.
	* sysdeps/libm-ieee754/s_csinhf.c: New file.
	* sysdeps/libm-ieee754/s_csinhl.c: New file.

	* math/carg.c: New file.  Generic implementatio of carg function.
	* math/cargf.c: New file.
	* math/cargl.c: New file.

1997-03-29 16:07  Ulrich Drepper  <drepper@cygnus.com>

	* sysdeps/posix/system.c: Update copyright.

1997-03-29 04:18  Ulrich Drepper  <drepper@cygnus.com>

	* elf/dl-error.c (_dl_catch_error): Add another argument which is
	passed to OPERATE.
	(_dl_receive_error): Likewise.
	* elf/link.h: Change prototypes for _dl_catch_error and
	_dl_receive_error to reflect above change.
	* elf/dl-deps.c: Don't use nested function.  Call _dl_catch_error
	with additional argument with pointer to data.
	* elf/dlclose.c: Likewise.
	* elf/dlerror.c: Likewise.
	* elf/dlopen.c: Likewise.
	* elf/dlsym.c: Likewise.
	* elf/dlvsym.c: Likewise.
	* elf/rtld.c: Likewise.
	* nss/nsswitch.c: Likewise.
	Patch by Bernd Schmidt <crux@Pool.Informatik.RWTH-Aachen.DE>.

1997-03-28 21:14  Miguel de Icaza  <miguel@nuclecu.unam.mx>

	* elf/dl-error.c: Manually set up the values of "c", this avoids a
	call to memcpy and a zero 152 bytes structure.

	* sysdeps/sparc/dl-machine.h (elf_machine_rela): Test
	RTLD_BOOTSTRAP to avoid performing relative relocs on a second
	pass.

	* sysdeps/sparc/udiv_qrnnd.S: Make the code PIC aware.

	* sysdeps/unix/sysv/linux/sparc/Dist: Add kernel_stat.h and
	kernel_sigaction.h

	Add Linux/SPARC specific definitions.
	* sysdeps/unix/sysv/linux/sparc/fcntlbits.h: New file.
	* sysdeps/unix/sysv/linux/sparc/ioctls.h: New file.
	* sysdeps/unix/sysv/linux/sparc/kernel_sigaction.h: New file.
	* sysdeps/unix/sysv/linux/sparc/kernel_stat.h: New file.
	* sysdeps/unix/sysv/linux/sparc/sigaction.h: New file.
	* sysdeps/unix/sysv/linux/sparc/signum.h: New file.
	* sysdeps/unix/sysv/linux/sparc/termbits.h: New file.

1997-03-28 13:06  Philip Blundell  <pjb27@cam.ac.uk>

	* sysdeps/posix/getaddrinfo.c (gaih_inet_serv): Use
	__getservbyname_r() not getservbyname().
	(BROKEN_LIKE_POSIX): Define to 1 so we get strict POSIX behaviour.
-rw-r--r--ChangeLog99
-rw-r--r--PROJECTS16
-rw-r--r--elf/dl-deps.c45
-rw-r--r--elf/dl-error.c18
-rw-r--r--elf/dlclose.c13
-rw-r--r--elf/dlerror.c4
-rw-r--r--elf/dlopen.c30
-rw-r--r--elf/dlsym.c90
-rw-r--r--elf/dlvsym.c109
-rw-r--r--elf/link.h17
-rw-r--r--elf/rtld.c80
-rw-r--r--math/Makefile2
-rw-r--r--math/carg.c29
-rw-r--r--math/cargf.c29
-rw-r--r--math/cargl.c29
-rw-r--r--math/complex.h8
-rw-r--r--math/libm-test.c768
-rw-r--r--misc/Makefile8
-rw-r--r--misc/tsearch.c612
-rw-r--r--misc/tst-tsearch.c329
-rw-r--r--nss/nsswitch.c73
-rw-r--r--po/libc.pot1541
-rw-r--r--stdio-common/bug5.c4
-rw-r--r--stdio-common/test-popen.c30
-rw-r--r--sysdeps/libm-i387/s_cexp.S248
-rw-r--r--sysdeps/libm-i387/s_cexpf.S245
-rw-r--r--sysdeps/libm-i387/s_cexpl.S249
-rw-r--r--sysdeps/libm-ieee754/s_ccosh.c95
-rw-r--r--sysdeps/libm-ieee754/s_ccoshf.c93
-rw-r--r--sysdeps/libm-ieee754/s_ccoshl.c93
-rw-r--r--sysdeps/libm-ieee754/s_cexp.c45
-rw-r--r--sysdeps/libm-ieee754/s_cexpf.c32
-rw-r--r--sysdeps/libm-ieee754/s_cexpl.c32
-rw-r--r--sysdeps/libm-ieee754/s_csinh.c102
-rw-r--r--sysdeps/libm-ieee754/s_csinhf.c100
-rw-r--r--sysdeps/libm-ieee754/s_csinhl.c100
-rw-r--r--sysdeps/posix/getaddrinfo.c29
-rw-r--r--sysdeps/posix/system.c34
-rw-r--r--sysdeps/sparc/dl-machine.h7
-rw-r--r--sysdeps/sparc/udiv_qrnnd.S27
-rw-r--r--sysdeps/unix/sysv/linux/sparc/Dist2
-rw-r--r--sysdeps/unix/sysv/linux/sparc/fcntlbits.h96
-rw-r--r--sysdeps/unix/sysv/linux/sparc/ioctls.h39
-rw-r--r--sysdeps/unix/sysv/linux/sparc/kernel_sigaction.h12
-rw-r--r--sysdeps/unix/sysv/linux/sparc/kernel_stat.h21
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sigaction.h52
-rw-r--r--sysdeps/unix/sysv/linux/sparc/signum.h72
-rw-r--r--sysdeps/unix/sysv/linux/sparc/termbits.h217
48 files changed, 5262 insertions, 763 deletions
diff --git a/ChangeLog b/ChangeLog
index f9dd5c7be1..f7d94565cf 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,102 @@
+1997-03-29 17:39  Ulrich Drepper  <drepper@cygnus.com>
+
+	* math/Makefile (routines): Add carg, s_ccosh and s_csinh.
+
+	* math/complex.h: Add C++ protection.
+
+	* math/libm-test.c (cexp_test): Correct a few bugs.
+	(csinh_test): New function.
+	(ccosh_test): New function.
+	(cacos_test): New function.
+	(cacosh_test): New function.
+	(casinh_test): New function.
+	(catanh_test): New function.
+	(main): Add calls to csinh_test and ccosh_test.
+
+	* misc/Makefile (tests): Add tst-tsearch.
+	Add rule to link tst-tsearch against libm.
+	* misc/tsearch.c: Rewritten to use Red-Black-Tree algorithm by
+	Bernd Schmidt <crux@Pool.Informatik.RWTH-Aachen.DE>.
+	* misc/tst-tsearch.c: New file.
+
+	* stdio-common/bug5.c: Clear LD_LIBRARY_PATH environment variable
+	before using system.
+	* stdio-common/test-popen.c: Clear LD_LIBRARY_PATH environment variable
+	before using popen.
+
+	* sysdeps/libm-ieee754/s_cexp.c: Correct handling of special cases.
+	* sysdeps/libm-ieee754/s_cexpf.c: Likewise.
+	* sysdeps/libm-ieee754/s_cexpl.c: Likewise.
+
+	* sysdeps/libm-i387/s_cexp.S: New file.  ix87 specific implementation
+	of complex exponential function.
+	* sysdeps/libm-i387/s_cexpf.S: New file.
+	* sysdeps/libm-i387/s_cexpl.S: New file.
+
+	* sysdeps/libm-ieee754/s_ccosh.c: New file.  Implementation of
+	complex cosh function.
+	* sysdeps/libm-ieee754/s_ccoshf.c: New file.
+	* sysdeps/libm-ieee754/s_ccoshl.c: New file.
+	* sysdeps/libm-ieee754/s_csinh.c: New file.  Implementation of
+	complex sinh function.
+	* sysdeps/libm-ieee754/s_csinhf.c: New file.
+	* sysdeps/libm-ieee754/s_csinhl.c: New file.
+
+	* math/carg.c: New file.  Generic implementatio of carg function.
+	* math/cargf.c: New file.
+	* math/cargl.c: New file.
+
+1997-03-29 16:07  Ulrich Drepper  <drepper@cygnus.com>
+
+	* sysdeps/posix/system.c: Update copyright.
+
+1997-03-29 04:18  Ulrich Drepper  <drepper@cygnus.com>
+
+	* elf/dl-error.c (_dl_catch_error): Add another argument which is
+	passed to OPERATE.
+	(_dl_receive_error): Likewise.
+	* elf/link.h: Change prototypes for _dl_catch_error and
+	_dl_receive_error to reflect above change.
+	* elf/dl-deps.c: Don't use nested function.  Call _dl_catch_error
+	with additional argument with pointer to data.
+	* elf/dlclose.c: Likewise.
+	* elf/dlerror.c: Likewise.
+	* elf/dlopen.c: Likewise.
+	* elf/dlsym.c: Likewise.
+	* elf/dlvsym.c: Likewise.
+	* elf/rtld.c: Likewise.
+	* nss/nsswitch.c: Likewise.
+	Patch by Bernd Schmidt <crux@Pool.Informatik.RWTH-Aachen.DE>.
+
+1997-03-28 21:14  Miguel de Icaza  <miguel@nuclecu.unam.mx>
+
+	* elf/dl-error.c: Manually set up the values of "c", this avoids a
+	call to memcpy and a zero 152 bytes structure.
+
+	* sysdeps/sparc/dl-machine.h (elf_machine_rela): Test
+	RTLD_BOOTSTRAP to avoid performing relative relocs on a second
+	pass.
+
+	* sysdeps/sparc/udiv_qrnnd.S: Make the code PIC aware.
+
+	* sysdeps/unix/sysv/linux/sparc/Dist: Add kernel_stat.h and
+	kernel_sigaction.h
+
+	Add Linux/SPARC specific definitions.
+	* sysdeps/unix/sysv/linux/sparc/fcntlbits.h: New file.
+	* sysdeps/unix/sysv/linux/sparc/ioctls.h: New file.
+	* sysdeps/unix/sysv/linux/sparc/kernel_sigaction.h: New file.
+	* sysdeps/unix/sysv/linux/sparc/kernel_stat.h: New file.
+	* sysdeps/unix/sysv/linux/sparc/sigaction.h: New file.
+	* sysdeps/unix/sysv/linux/sparc/signum.h: New file.
+	* sysdeps/unix/sysv/linux/sparc/termbits.h: New file.
+
+1997-03-28 13:06  Philip Blundell  <pjb27@cam.ac.uk>
+
+	* sysdeps/posix/getaddrinfo.c (gaih_inet_serv): Use
+	__getservbyname_r() not getservbyname().
+	(BROKEN_LIKE_POSIX): Define to 1 so we get strict POSIX behaviour.
+
 1997-03-27 02:28  Ulrich Drepper  <drepper@cygnus.com>
 
 	* gmon/gmon.c (monstartup): Mark all messages.
diff --git a/PROJECTS b/PROJECTS
index dc0a6701e9..394b18efdf 100644
--- a/PROJECTS
+++ b/PROJECTS
@@ -110,32 +110,26 @@ contact <bug-glibc@prep.ai.mit.edu>
 **** Almost done!
 
 
-[10] Write AVL-tree based tsearch() et.al. functions.  Currently only
-     a very simple algorithm is used.
-     There is a public domain version but using this would cause problems
-     with the assignment.
-
-
-[11] Extend regex and/or rx to work with wide characters and complete
+[10] Extend regex and/or rx to work with wide characters and complete
      implementation of character class and collation class handling.
 
      It is planed to do a complete rewrite.
 
 
-[12] Write access function for netmasks, bootparams, and automount
+[11] Write access function for netmasks, bootparams, and automount
      databases for nss_files and nss_db module.
      The functions should be embedded in the nss scheme.  This is not
      hard and not all services must be supported at once.
 
 
-[13] Rewrite utmp/wtmp functions to use database functions.  This is much
+[12] Rewrite utmp/wtmp functions to use database functions.  This is much
      better than the normal flat file format.
 
 **** There are plans for a new approach to this problem.  Please contact
      bug-glibc@prep.ai.mit.edu before starting to work.)
 
 
-[14] Several more or less small functions have to be written:
+[13] Several more or less small functions have to be written:
 
      + tcgetid() and waitid()			from XPG4.2
      + grantpt(), ptsname(), unlockpt()		from XPG4.2
@@ -145,7 +139,7 @@ contact <bug-glibc@prep.ai.mit.edu>
      More information are available on request.
 
 
-[15] We need to write a library for on-the-fly transformation of streams
+[14] We need to write a library for on-the-fly transformation of streams
      of text.  In fact, this would be a recode-library (you know, GNU recode).
      This is needed in several places in the GNU libc and I already have
      rather concrete plans but so far no possibility to start this.
diff --git a/elf/dl-deps.c b/elf/dl-deps.c
index 7a6772979b..e2fd340822 100644
--- a/elf/dl-deps.c
+++ b/elf/dl-deps.c
@@ -22,6 +22,29 @@
 #include <dlfcn.h>
 #include <stdlib.h>
 
+struct openaux_args
+{
+  /* The arguments to openaux.  */
+  struct link_map *map;
+  int trace_mode;
+  const char *strtab;
+  ElfW(Dyn) *d;
+
+  /* The return value of openaux.  */
+  struct link_map *aux;
+};
+
+static void
+openaux (void *a)
+{
+  struct openaux_args *args = (struct openaux_args *) a;
+
+  args->aux = _dl_map_object (args->map, args->strtab + args->d->d_un.d_val,
+			      (args->map->l_type == lt_executable
+			       ? lt_library : args->map->l_type),
+			      args->trace_mode);
+}
+
 void
 _dl_map_object_deps (struct link_map *map,
 		     struct link_map **preloads, unsigned int npreloads,
@@ -75,27 +98,21 @@ _dl_map_object_deps (struct link_map *map,
       /* There is at least one auxiliary library specified.  We try to
 	 load it, and if we can, use its symbols in preference to our
 	 own.  But if we can't load it, we just silently ignore it.  */
-      const char *strtab
+      struct openaux_args args;
+      args.strtab
 	= ((void *) map->l_addr + map->l_info[DT_STRTAB]->d_un.d_ptr);
-      ElfW(Dyn) *d;
+      args.map = map;
+      args.trace_mode = trace_mode;
 
-      for (d = map->l_ld; d->d_tag != DT_NULL; ++d)
-	if (d->d_tag == DT_AUXILIARY)
+      for (args.d = map->l_ld; args.d->d_tag != DT_NULL; ++args.d)
+	if (args.d->d_tag == DT_AUXILIARY)
 	  {
-	    struct link_map *aux;
-	    void openaux (void)
-	      {
-		aux = _dl_map_object (map, strtab + d->d_un.d_val,
-				      (map->l_type == lt_executable
-				       ? lt_library : map->l_type),
-				      trace_mode);
-	      }
 	    char *errstring;
 	    const char *objname;
-	    if (! _dl_catch_error (&errstring, &objname, openaux))
+	    if (! _dl_catch_error (&errstring, &objname, openaux, &args))
 	      /* The auxiliary object is actually there.  Use it as
 		 the first search element, even before MAP itself.  */
-	      preload (aux);
+	      preload (args.aux);
 	  }
     }
 
diff --git a/elf/dl-error.c b/elf/dl-error.c
index 263bd65eb0..e2565bb348 100644
--- a/elf/dl-error.c
+++ b/elf/dl-error.c
@@ -85,19 +85,25 @@ _dl_signal_error (int errcode,
 int
 _dl_catch_error (char **errstring,
 		 const char **objname,
-		 void (*operate) (void))
+		 void (*operate) (void *),
+		 void *args)
 {
   int errcode;
-  struct catch *old, c = { errstring: NULL, objname: NULL };
-  /* We need not handle `receiver' since setting a `catch' is handle
+  struct catch *old, c;
+  /* We need not handle `receiver' since setting a `catch' is handled
      before it.  */
 
+  /* Some systems (.e.g, SPARC) handle constructors to local variables
+     inefficient.  So we initialize `c' by hand.  */
+  c.errstring = NULL;
+  c.objname   = NULL;
+
   old = catch;
   errcode = setjmp (c.env);
   if (errcode == 0)
     {
       catch = &c;
-      (*operate) ();
+      (*operate) (args);
       catch = old;
       *errstring = NULL;
       *objname = NULL;
@@ -112,7 +118,7 @@ _dl_catch_error (char **errstring,
 }
 
 void
-_dl_receive_error (receiver_fct fct, void (*operate) (void))
+_dl_receive_error (receiver_fct fct, void (*operate) (void *), void *args)
 {
   struct catch *old_catch;
   receiver_fct old_receiver;
@@ -124,7 +130,7 @@ _dl_receive_error (receiver_fct fct, void (*operate) (void))
   catch = NULL;
   receiver = fct;
 
-  (*operate) ();
+  (*operate) (args);
 
   catch = old_catch;
   receiver = old_receiver;
diff --git a/elf/dlclose.c b/elf/dlclose.c
index 6a142119f7..d96ffc9cc1 100644
--- a/elf/dlclose.c
+++ b/elf/dlclose.c
@@ -20,13 +20,14 @@
 #include <link.h>
 #include <dlfcn.h>
 
+static void
+dlclose_doit (void *handle)
+{
+  _dl_close (handle);
+}
+
 int
 dlclose (void *handle)
 {
-  void doit (void)
-    {
-      _dl_close (handle);
-    }
-
-  return _dlerror_run (doit) ? -1 : 0;
+  return _dlerror_run (dlclose_doit, handle) ? -1 : 0;
 }
diff --git a/elf/dlerror.c b/elf/dlerror.c
index 9e55bc7c76..e2b1ac94a9 100644
--- a/elf/dlerror.c
+++ b/elf/dlerror.c
@@ -64,7 +64,7 @@ dlerror (void)
 }
 
 int
-_dlerror_run (void (*operate) (void))
+_dlerror_run (void (*operate) (void *), void *args)
 {
   if (last_errstring != NULL)
     /* Free the error string from the last failed command.  This can
@@ -72,6 +72,6 @@ _dlerror_run (void (*operate) (void))
     free (last_errstring);
 
   last_errcode = _dl_catch_error (&last_errstring, &last_object_name,
-				  operate);
+				  operate, args);
   return last_errstring != NULL;
 }
diff --git a/elf/dlopen.c b/elf/dlopen.c
index c2cf8cd58d..4963e9962e 100644
--- a/elf/dlopen.c
+++ b/elf/dlopen.c
@@ -21,15 +21,31 @@
 #include <link.h>
 #include <dlfcn.h>
 
-void *
-dlopen (const char *file, int mode)
+struct dlopen_args
 {
+  /* The arguments for dlopen_doit.  */
+  const char *file;
+  int mode;
+  /* The return value of dlopen_doit.  */
   struct link_map *new;
+};
+
 
-  void doit (void)
-    {
-      new = _dl_open (file ?: "", mode);
-    }
+static void
+dlopen_doit (void *a)
+{
+  struct dlopen_args *args = (struct dlopen_args *) a;
+
+  args->new = _dl_open (args->file ?: "", args->mode);
+}
+
+
+void *
+dlopen (const char *file, int mode)
+{
+  struct dlopen_args args;
+  args.file = file;
+  args.mode = mode;
 
-  return _dlerror_run (doit) ? NULL : new;
+  return _dlerror_run (dlopen_doit, &args) ? NULL : args.new;
 }
diff --git a/elf/dlsym.c b/elf/dlsym.c
index d05619bfb4..1072f16ce1 100644
--- a/elf/dlsym.c
+++ b/elf/dlsym.c
@@ -22,47 +22,71 @@
 #include <dlfcn.h>
 #include <setjmp.h>
 
-
-void *
-dlsym (void *handle, const char *name)
+struct dlsym_args
 {
-  ElfW(Addr) caller = (ElfW(Addr)) __builtin_return_address (0);
+  /* The arguments to dlsym_doit.  */
+  void *handle;
+  const char *name;
+  struct r_found_version version;
+  ElfW(Addr) caller;
+  /* The return values of dlsym_doit.  */
   ElfW(Addr) loadbase;
-  const ElfW(Sym) *ref = NULL;
-  void doit (void)
+  const ElfW(Sym) *ref;
+};
+
+
+static void
+dlsym_doit (void *a)
+{
+  struct dlsym_args *args = (struct dlsym_args *) a;
+  args->ref = NULL;
+
+  if (args->handle == NULL)
+    /* Search the global scope.  */
+    args->loadbase = _dl_lookup_symbol (args->name, &args->ref,
+					&(_dl_global_scope
+					  ?: _dl_default_scope)[2],
+					NULL, 0);
+  else if (args->handle == RTLD_NEXT)
     {
-      if (handle == NULL)
-	/* Search the global scope.  */
-	loadbase = _dl_lookup_symbol
-	  (name, &ref, &(_dl_global_scope ?: _dl_default_scope)[2], NULL, 0);
-      else if (handle == RTLD_NEXT)
-	{
-	  struct link_map *l, *match;
+      struct link_map *l, *match;
 
-	  /* Find the highest-addressed object that CALLER is not below.  */
-	  match = NULL;
-	  for (l = _dl_loaded; l; l = l->l_next)
-	    if (caller >= l->l_addr && (!match || match->l_addr < l->l_addr))
-	      match = l;
+      /* Find the highest-addressed object that CALLER is not below.  */
+      match = NULL;
+      for (l = _dl_loaded; l; l = l->l_next)
+	if (args->caller >= l->l_addr && (!match || match->l_addr < l->l_addr))
+	  match = l;
 
-	  if (! match)
-	    _dl_signal_error (0, NULL, _("\
+      if (! match)
+	_dl_signal_error (0, NULL, _("\
 RTLD_NEXT used in code not dynamically loaded"));
 
-	  l = match;
-	  while (l->l_loader)
-	    l = l->l_loader;
+      l = match;
+      while (l->l_loader)
+	l = l->l_loader;
 
-	  loadbase = _dl_lookup_symbol_skip (name, &ref, &_dl_loaded, NULL, l);
-	}
-      else
-	{
-	  /* Search the scope of the given object.  */
-	  struct link_map *map = handle;
-	  struct link_map *mapscope[2] = { map, NULL };
-	  loadbase = _dl_lookup_symbol (name, &ref, mapscope, map->l_name, 0);
-	}
+      args->loadbase = _dl_lookup_symbol_skip (args->name, &args->ref,
+					       &_dl_loaded, NULL, l);
     }
+  else
+    {
+      /* Search the scope of the given object.  */
+      struct link_map *map = args->handle;
+      struct link_map *mapscope[2] = { map, NULL };
+      args->loadbase = _dl_lookup_symbol (args->name, &args->ref, mapscope,
+					  map->l_name, 0);
+    }
+}
+
+
+void *
+dlsym (void *handle, const char *name)
+{
+  struct dlsym_args args;
+  args.caller = (ElfW(Addr)) __builtin_return_address (0);
+  args.handle = handle;
+  args.name = name;
 
-  return _dlerror_run (doit) ? NULL : (void *) (loadbase + ref->st_value);
+  return (_dlerror_run (dlsym_doit, &args)
+	  ? NULL : (void *) (args.loadbase + args.ref->st_value));
 }
diff --git a/elf/dlvsym.c b/elf/dlvsym.c
index b3d4c1aeee..ca8e25d9df 100644
--- a/elf/dlvsym.c
+++ b/elf/dlvsym.c
@@ -24,57 +24,82 @@
 
 #include <dl-hash.h>
 
-void *
-__dlvsym (void *handle, const char *name, const char *version_str)
+struct dlvsym_args
 {
-  ElfW(Addr) caller = (ElfW(Addr)) __builtin_return_address (0);
-  ElfW(Addr) loadbase;
+  /* The arguments to dlvsym_doit.  */
+  void *handle;
+  const char *name;
   struct r_found_version version;
-  const ElfW(Sym) *ref = NULL;
-  void doit (void)
+  ElfW(Addr) caller;
+  /* The return values of dlvsym_doit.  */
+  ElfW(Addr) loadbase;
+  const ElfW(Sym) *ref;
+};
+
+
+static void
+dlvsym_doit (void *a)
+{
+  struct dlvsym_args *args = (struct dlvsym_args *)a;
+  args->ref = NULL;
+
+  if (args->handle == NULL)
+    /* Search the global scope.  */
+    args->loadbase = _dl_lookup_versioned_symbol (args->name, &args->ref,
+						  &(_dl_global_scope
+						    ?: _dl_default_scope)[2],
+						  NULL, &args->version, 0);
+  else if (args->handle == RTLD_NEXT)
     {
-      if (handle == NULL)
-	/* Search the global scope.  */
-	loadbase = _dl_lookup_versioned_symbol
-	  (name, &ref, &(_dl_global_scope ?: _dl_default_scope)[2], NULL,
-	   &version, 0);
-      else if (handle == RTLD_NEXT)
-	{
-	  struct link_map *l, *match;
-
-	  /* Find the highest-addressed object that CALLER is not below.  */
-	  match = NULL;
-	  for (l = _dl_loaded; l; l = l->l_next)
-	    if (caller >= l->l_addr && (!match || match->l_addr < l->l_addr))
-	      match = l;
-
-	  if (! match)
-	    _dl_signal_error (0, NULL, _("\
+      struct link_map *l, *match;
+
+      /* Find the highest-addressed object that CALLER is not below.  */
+      match = NULL;
+      for (l = _dl_loaded; l; l = l->l_next)
+	if (args->caller >= l->l_addr && (!match || match->l_addr < l->l_addr))
+	  match = l;
+
+      if (! match)
+	_dl_signal_error (0, NULL, _("\
 RTLD_NEXT used in code not dynamically loaded"));
 
-	  l = match;
-	  while (l->l_loader)
-	    l = l->l_loader;
-
-	  loadbase = _dl_lookup_versioned_symbol_skip
-	    (name, &ref, &_dl_loaded, NULL, &version, l);
-	}
-      else
-	{
-	  /* Search the scope of the given object.  */
-	  struct link_map *map = handle;
-	  struct link_map *mapscope[2] = { map, NULL };
-	  loadbase = _dl_lookup_versioned_symbol
-	    (name, &ref, mapscope, map->l_name, &version, 0);
-	}
+      l = match;
+      while (l->l_loader)
+	l = l->l_loader;
+
+      args->loadbase = _dl_lookup_versioned_symbol_skip	(args->name,
+							 &args->ref,
+							 &_dl_loaded,
+							 NULL, &args->version,
+							 l);
+    }
+  else
+    {
+      /* Search the scope of the given object.  */
+      struct link_map *map = args->handle;
+      struct link_map *mapscope[2] = { map, NULL };
+      args->loadbase = _dl_lookup_versioned_symbol (args->name, &args->ref,
+						    mapscope, map->l_name,
+						    &args->version, 0);
     }
+}
+
+void *
+__dlvsym (void *handle, const char *name, const char *version_str)
+{
+  struct dlvsym_args args;
+
+  args.handle = handle;
+  args.name = name;
+  args.caller = (ElfW(Addr)) __builtin_return_address (0);
 
   /* Compute hash value to the version string.  */
-  version.name = version_str;
-  version.hash = _dl_elf_hash (version_str);
+  args.version.name = version_str;
+  args.version.hash = _dl_elf_hash (version_str);
   /* We don't have a specific file where the symbol can be found.  */
-  version.filename = NULL;
+  args.version.filename = NULL;
 
-  return _dlerror_run (doit) ? NULL : (void *) (loadbase + ref->st_value);
+  return (_dlerror_run (dlvsym_doit, &args)
+	  ? NULL : (void *) (args.loadbase + args.ref->st_value));
 }
 weak_alias (__dlvsym, dlvsym)
diff --git a/elf/link.h b/elf/link.h
index 3934aed8e2..0e58996b04 100644
--- a/elf/link.h
+++ b/elf/link.h
@@ -238,21 +238,26 @@ extern void _dl_signal_error (int errcode,
    error, *ERRSTRING is set to null.  If there is an error, *ERRSTRING and
    *OBJECT are set to the strings passed to _dl_signal_error, and the error
    code passed is the return value.  ERRSTRING if nonzero points to a
-   malloc'ed string which the caller has to free after use.  */
+   malloc'ed string which the caller has to free after use.
+   ARGS is passed as argument to OPERATE.  */
 extern int _dl_catch_error (char **errstring,
 			    const char **object,
-			    void (*operate) (void));
+			    void (*operate) (void *),
+			    void *args);
 
 /* Call OPERATE, receiving errors from `dl_signal_error'.  Unlike
    `_dl_catch_error' the operation is resumed after the OPERATE
-   function returns.  */
-extern void _dl_receive_error (receiver_fct fct, void (*operate) (void));
+   function returns.
+   ARGS is passed as argument to OPERATE.  */
+extern void _dl_receive_error (receiver_fct fct, void (*operate) (void *),
+			       void *args);
 
 
 /* Helper function for <dlfcn.h> functions.  Runs the OPERATE function via
    _dl_catch_error.  Returns zero for success, nonzero for failure; and
-   arranges for `dlerror' to return the error details.  */
-extern int _dlerror_run (void (*operate) (void));
+   arranges for `dlerror' to return the error details.  
+   ARGS is passed as argument to OPERATE.  */
+extern int _dlerror_run (void (*operate) (void *), void *args);
 
 
 /* Open the shared object NAME and map in its segments.
diff --git a/elf/rtld.c b/elf/rtld.c
index d6bd516dfc..6f9737e060 100644
--- a/elf/rtld.c
+++ b/elf/rtld.c
@@ -140,6 +140,55 @@ _dl_start (void *arg)
 
 void _start (void);
 
+/* Some helper functions.  */
+
+/* Arguments to relocate_doit.  */
+struct relocate_args
+{
+  struct link_map *l;
+  int lazy;
+};
+
+struct map_args
+{
+  /* Argument to map_doit.  */
+  char *str;
+  /* Return value of map_doit.  */
+  struct link_map *main_map;
+};
+
+/* Arguments to version_check_doit.  */
+struct version_check_args
+{
+  struct link_map *main_map;
+  int doexit;
+};
+
+static void
+relocate_doit (void *a)
+{
+  struct relocate_args *args = (struct relocate_args *) a;
+
+  _dl_relocate_object (args->l, _dl_object_relocation_scope (args->l),
+		       args->lazy);
+}
+
+static void
+map_doit (void *a)
+{
+  struct map_args *args = (struct map_args *)a;
+  args->main_map = _dl_map_object (NULL, args->str, lt_library, 0);
+}
+
+static void
+version_check_doit (void *a)
+{
+  struct version_check_args *args = (struct version_check_args *)a;
+  if (_dl_check_all_versions (args->main_map, 1) && args->doexit)
+    /* We cannot start the application.  Abort now.  */
+    _exit (1);
+}
+
 unsigned int _dl_skip_args;	/* Nonzero if we were run directly.  */
 
 static void
@@ -234,14 +283,13 @@ of this helper program; chances are you did not intend to run this program.\n",
 
       if (mode == verify)
 	{
-	  void doit (void)
-	    {
-	      main_map = _dl_map_object (NULL, _dl_argv[0], lt_library, 0);
-	    }
 	  char *err_str = NULL;
 	  const char *obj_name __attribute__ ((unused));
+	  struct map_args args;
 
-	  (void) _dl_catch_error (&err_str, &obj_name, doit);
+	  args.str = _dl_argv[0];
+	  (void) _dl_catch_error (&err_str, &obj_name, map_doit, &args);
+	  main_map = args.main_map;
 	  if (err_str != NULL)
 	    {
 	      free (err_str);
@@ -469,14 +517,10 @@ of this helper program; chances are you did not intend to run this program.\n",
   /* Now let us see whether all libraries are available in the
      versions we need.  */
   {
-    void doit (void)
-      {
-	if (_dl_check_all_versions (main_map, 1) && mode == normal)
-	  /* We cannot start the application.  Abort now.  */
-	  _exit (1);
-      }
-
-    _dl_receive_error (print_missing_version, doit);
+    struct version_check_args args;
+    args.doexit = mode == normal;
+    args.main_map = main_map;
+    _dl_receive_error (print_missing_version, version_check_doit, &args);
   }
 
   if (mode != normal)
@@ -535,11 +579,10 @@ of this helper program; chances are you did not intend to run this program.\n",
       else if (lazy >= 0)
 	{
 	  /* We have to do symbol dependency testing.  */
+	  struct relocate_args args;
 	  struct link_map *l;
-	  void doit (void)
-	    {
-	      _dl_relocate_object (l, _dl_object_relocation_scope (l), lazy);
-	    }
+
+	  args.lazy = lazy;
 
 	  l = _dl_loaded;
 	  while (l->l_next)
@@ -548,7 +591,8 @@ of this helper program; chances are you did not intend to run this program.\n",
 	    {
 	      if (l != &_dl_rtld_map && l->l_opencount > 0)
 		{
-		  _dl_receive_error (print_unresolved, doit);
+		  args.l = l;
+		  _dl_receive_error (print_unresolved, relocate_doit, &args);
 		  *_dl_global_scope_end = NULL;
 		}
 	      l = l->l_prev;
diff --git a/math/Makefile b/math/Makefile
index 2578dbf839..12967ffac5 100644
--- a/math/Makefile
+++ b/math/Makefile
@@ -49,7 +49,7 @@ libm-calls = e_acos e_acosh e_asin e_atan2 e_atanh e_cosh e_exp e_fmod	\
 	     w_log w_log10 w_pow w_remainder w_scalb w_sinh w_sqrt	\
 	     s_signbit s_fpclassify s_fmax s_fmin s_fdim s_nan s_trunc	\
 	     s_remquo s_log2 s_exp2					\
-	     conj cimag creal cabs s_cexp
+	     conj cimag creal cabs carg s_cexp s_csinh s_ccosh
 libm-routines = $(libm-support) $(libm-calls) \
 		$(patsubst %_rf,%f_r,$(libm-calls:=f))	\
 		$(long-m-$(long-double-fcts))
diff --git a/math/carg.c b/math/carg.c
new file mode 100644
index 0000000000..fb4dc8e52e
--- /dev/null
+++ b/math/carg.c
@@ -0,0 +1,29 @@
+/* Compute argument of complex double value.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <complex.h>
+#include <math.h>
+
+double
+__carg (__complex__ double x)
+{
+  return __atan2 (__imag__ x, __real__ x);
+}
+weak_alias (__carg, carg)
diff --git a/math/cargf.c b/math/cargf.c
new file mode 100644
index 0000000000..4b3c9f6d9a
--- /dev/null
+++ b/math/cargf.c
@@ -0,0 +1,29 @@
+/* Compute argument of complex float value.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <complex.h>
+#include <math.h>
+
+float
+__cargf (__complex__ float x)
+{
+  return __atan2f (__imag__ x, __real__ x);
+}
+weak_alias (__cargf, cargf)
diff --git a/math/cargl.c b/math/cargl.c
new file mode 100644
index 0000000000..4482da9dd0
--- /dev/null
+++ b/math/cargl.c
@@ -0,0 +1,29 @@
+/* Compute argument of complex long double value.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <complex.h>
+#include <math.h>
+
+long double
+__cargl (__complex__ long double x)
+{
+  return __atan2l (__imag__ x, __real__ x);
+}
+weak_alias (__cargl, cargl)
diff --git a/math/complex.h b/math/complex.h
index 6fc5c1975f..42143531dc 100644
--- a/math/complex.h
+++ b/math/complex.h
@@ -21,7 +21,11 @@
  */
 
 #ifndef _COMPLEX_H
+
 #define _COMPLEX_H	1
+#include <features.h>
+
+__BEGIN_DECLS
 
 /* We might need to add support for more compilers here.  But once ISO
    C 9X is out hopefully all maintained compilers will provide the data
@@ -41,7 +45,7 @@
 #define I _Imaginary_I
 
 
-/* Optimization aids.  This is not yet implemented in gcc and yonce it
+/* Optimization aids.  This is not yet implemented in gcc and once it
    is this will probably be available in a gcc header.  */
 #define CX_LIMITED_RANGE_ON
 #define CX_LIMITED_RANGE_OFF
@@ -99,4 +103,6 @@
 #undef	__MATHDECL
 #undef	__MATHCALL
 
+__END_DECLS
+
 #endif /* complex.h */
diff --git a/math/libm-test.c b/math/libm-test.c
index a575cc66a8..85e4a4b065 100644
--- a/math/libm-test.c
+++ b/math/libm-test.c
@@ -1550,7 +1550,7 @@ cexp_test (void)
   check ("imag(cexp(+inf + 0i)) = 0", __imag__ result, 0);
   result = FUNC(cexp) (BUILD_COMPLEX (plus_infty, minus_zero));
   check_isinfp ("real(cexp(+inf - 0i)) = +inf", __real__ result);
-  check ("imag(cexp(+inf - 0i)) = 0", __imag__ result, 0);
+  check ("imag(cexp(+inf - 0i)) = -0", __imag__ result, minus_zero);
 
   result = FUNC(cexp) (BUILD_COMPLEX (minus_infty, plus_zero));
   check ("real(cexp(-inf + 0i)) = 0", __real__ result, 0);
@@ -1574,11 +1574,11 @@ cexp_test (void)
   check ("imag(cexp(-inf + 4.0i)) = -0", __imag__ result, minus_zero);
 
   result = FUNC(cexp) (BUILD_COMPLEX (plus_infty, 2.0));
-  check_isinfn ("real(cexp(+inf + 2.0i)) = -0", __real__ result);
-  check_isinfp ("imag(cexp(+inf + 2.0i)) = 0", __imag__ result);
+  check_isinfn ("real(cexp(+inf + 2.0i)) = -inf", __real__ result);
+  check_isinfp ("imag(cexp(+inf + 2.0i)) = +inf", __imag__ result);
   result = FUNC(cexp) (BUILD_COMPLEX (plus_infty, 4.0));
-  check_isinfn ("real(cexp(+inf + 4.0i)) = -0", __real__ result);
-  check_isinfn ("imag(cexp(+inf + 4.0i)) = -0", __imag__ result);
+  check_isinfn ("real(cexp(+inf + 4.0i)) = -inf", __real__ result);
+  check_isinfn ("imag(cexp(+inf + 4.0i)) = -inf", __imag__ result);
 
   result = FUNC(cexp) (BUILD_COMPLEX (plus_infty, plus_infty));
   check_isinfp ("real(cexp(+inf + i inf)) = +inf", __real__ result);
@@ -1592,7 +1592,7 @@ cexp_test (void)
   check ("imag(cexp(-inf + i inf)) = 0", __imag__ result, 0);
   result = FUNC(cexp) (BUILD_COMPLEX (minus_infty, minus_infty));
   check ("real(cexp(-inf - i inf)) = 0", __real__ result, 0);
-  check ("imag(cexp(-inf - i inf)) = 0", __imag__ result, 0);
+  check ("imag(cexp(-inf - i inf)) = -0", __imag__ result, minus_zero);
 
   result = FUNC(cexp) (BUILD_COMPLEX (minus_infty, nan_value));
   check ("real(cexp(-inf + i NaN)) = 0", __real__ result, 0);
@@ -1622,6 +1622,760 @@ cexp_test (void)
 
 
 static void
+csinh_test (void)
+{
+  __complex__ MATHTYPE result;
+
+  result = FUNC(csinh) (BUILD_COMPLEX (0.0, 0.0));
+  check ("real(csinh(0 + 0i)) = 0", __real__ result, 0);
+  check ("imag(csinh(0 + 0i)) = 0", __imag__ result, 0);
+  result = FUNC(csinh) (BUILD_COMPLEX (minus_zero, 0.0));
+  check ("real(csinh(-0 + 0i)) = -0", __real__ result, minus_zero);
+  check ("imag(csinh(-0 + 0i)) = 0", __imag__ result, 0);
+  result = FUNC(csinh) (BUILD_COMPLEX (0.0, minus_zero));
+  check ("real(csinh(0 - 0i)) = 0", __real__ result, 0);
+  check ("imag(csinh(0 - 0i)) = -0", __imag__ result, minus_zero);
+  result = FUNC(csinh) (BUILD_COMPLEX (minus_zero, minus_zero));
+  check ("real(csinh(-0 - 0i)) = -0", __real__ result, minus_zero);
+  check ("imag(csinh(-0 - 0i)) = -0", __imag__ result, minus_zero);
+
+  result = FUNC(csinh) (BUILD_COMPLEX (0.0, plus_infty));
+  check ("real(csinh(0 + i Inf)) = 0", FUNC(fabs) (__real__ result), 0);
+  check_isnan ("imag(csinh(0 + i Inf)) = NaN", __imag__ result);
+  result = FUNC(csinh) (BUILD_COMPLEX (minus_zero, plus_infty));
+  check ("real(csinh(-0 + i Inf)) = -0", FUNC(fabs) (__real__ result), 0);
+  check_isnan ("imag(csinh(-0 + i Inf)) = NaN", __imag__ result);
+  result = FUNC(csinh) (BUILD_COMPLEX (0.0, minus_infty));
+  check ("real(csinh(0 - i Inf)) = 0", FUNC(fabs) (__real__ result), 0);
+  check_isnan ("imag(csinh(0 - i Inf)) = NaN", __imag__ result);
+  result = FUNC(csinh) (BUILD_COMPLEX (minus_zero, minus_infty));
+  check ("real(csinh(-0 - i Inf)) = -0", FUNC(fabs) (__real__ result), 0);
+  check_isnan ("imag(csinh(-0 - i Inf)) = NaN", __imag__ result);
+
+  result = FUNC(csinh) (BUILD_COMPLEX (plus_infty, 0.0));
+  check_isinfp ("real(csinh(+Inf + 0i)) = +Inf", __real__ result);
+  check ("imag(csinh(+Inf + 0i)) = 0", __imag__ result, 0);
+  result = FUNC(csinh) (BUILD_COMPLEX (minus_infty, 0.0));
+  check_isinfn ("real(csinh(-Inf + 0i)) = -Inf", __real__ result);
+  check ("imag(csinh(-Inf + 0i)) = 0", __imag__ result, 0);
+  result = FUNC(csinh) (BUILD_COMPLEX (plus_infty, minus_zero));
+  check_isinfp ("real(csinh(+Inf - 0i)) = +Inf", __real__ result);
+  check ("imag(csinh(+Inf - 0i)) = -0", __imag__ result, minus_zero);
+  result = FUNC(csinh) (BUILD_COMPLEX (minus_infty, minus_zero));
+  check_isinfn ("real(csinh(-Inf - 0i)) = -Inf", __real__ result);
+  check ("imag(csinh(-Inf - 0i)) = -0", __imag__ result, minus_zero);
+
+  result = FUNC(csinh) (BUILD_COMPLEX (plus_infty, plus_infty));
+  check_isinfp ("real(csinh(+Inf + i Inf)) = +-Inf",
+		FUNC(fabs) (__real__ result));
+  check_isnan ("imag(csinh(+Inf + i Inf)) = NaN", __imag__ result);
+  result = FUNC(csinh) (BUILD_COMPLEX (minus_infty, plus_infty));
+  check_isinfp ("real(csinh(-Inf + i Inf)) = +-Inf",
+		FUNC(fabs) (__real__ result));
+  check_isnan ("imag(csinh(-Inf + i Inf)) = NaN", __imag__ result);
+  result = FUNC(csinh) (BUILD_COMPLEX (plus_infty, minus_infty));
+  check_isinfp ("real(csinh(Inf - i Inf)) = +-Inf",
+		FUNC(fabs) (__real__ result));
+  check_isnan ("imag(csinh(Inf - i Inf)) = NaN", __imag__ result);
+  result = FUNC(csinh) (BUILD_COMPLEX (minus_infty, minus_infty));
+  check_isinfp ("real(csinh(-Inf - i Inf)) = -Inf",
+		FUNC(fabs) (__real__ result));
+  check_isnan ("imag(csinh(-Inf - i Inf)) = NaN", __imag__ result);
+
+  result = FUNC(csinh) (BUILD_COMPLEX (plus_infty, 4.625));
+  check_isinfn ("real(csinh(+Inf + i4.625)) = -Inf", __real__ result);
+  check_isinfn ("imag(csinh(+Inf + i4.625)) = -Inf", __imag__ result);
+  result = FUNC(csinh) (BUILD_COMPLEX (minus_infty, 4.625));
+  check_isinfp ("real(csinh(-Inf + i4.625)) = +Inf", __real__ result);
+  check_isinfn ("imag(csinh(-Inf + i4.625)) = -Inf", __imag__ result);
+  result = FUNC(csinh) (BUILD_COMPLEX (plus_infty, -4.625));
+  check_isinfn ("real(csinh(+Inf - i4.625)) = -Inf", __real__ result);
+  check_isinfp ("imag(csinh(+Inf - i4.625)) = +Inf", __imag__ result);
+  result = FUNC(csinh) (BUILD_COMPLEX (minus_infty, -4.625));
+  check_isinfp ("real(csinh(-Inf - i4.625)) = +Inf", __real__ result);
+  check_isinfp ("imag(csinh(-Inf - i4.625)) = +Inf", __imag__ result);
+
+  result = FUNC(csinh) (BUILD_COMPLEX (6.75, plus_infty));
+  check_isnan ("real(csinh(6.75 + i Inf)) = NaN", __real__ result);
+  check_isnan ("imag(csinh(6.75 + i Inf)) = NaN", __imag__ result);
+  result = FUNC(csinh) (BUILD_COMPLEX (-6.75, plus_infty));
+  check_isnan ("real(csinh(-6.75 + i Inf)) = NaN", __real__ result);
+  check_isnan ("imag(csinh(-6.75 + i Inf)) = NaN", __imag__ result);
+  result = FUNC(csinh) (BUILD_COMPLEX (6.75, minus_infty));
+  check_isnan ("real(csinh(6.75 - i Inf)) = NaN", __real__ result);
+  check_isnan ("imag(csinh(6.75 - i Inf)) = NaN", __imag__ result);
+  result = FUNC(csinh) (BUILD_COMPLEX (-6.75, minus_infty));
+  check_isnan ("real(csinh(-6.75 - i Inf)) = NaN", __real__ result);
+  check_isnan ("imag(csinh(-6.75 - i Inf)) = NaN", __imag__ result);
+
+  result = FUNC(csinh) (BUILD_COMPLEX (0.0, nan_value));
+  check ("real(csinh(0 + i NaN)) = 0", FUNC(fabs) (__real__ result), 0);
+  check_isnan ("imag(csinh(0 + i NaN)) = NaN", __imag__ result);
+  result = FUNC(csinh) (BUILD_COMPLEX (minus_zero, nan_value));
+  check ("real(csinh(-0 + i NaN)) = -0", FUNC(fabs) (__real__ result), 0);
+  check_isnan ("imag(csinh(-0 + i NaN)) = NaN", __imag__ result);
+
+  result = FUNC(csinh) (BUILD_COMPLEX (plus_infty, nan_value));
+  check_isinfp ("real(csinh(+Inf + i NaN)) = +-Inf",
+		FUNC(fabs) (__real__ result));
+  check_isnan ("imag(csinh(+Inf + i NaN)) = NaN", __imag__ result);
+  result = FUNC(csinh) (BUILD_COMPLEX (minus_infty, nan_value));
+  check_isinfp ("real(csinh(-Inf + i NaN)) = +-Inf",
+		FUNC(fabs) (__real__ result));
+  check_isnan ("imag(csinh(-0 + i NaN)) = NaN", __imag__ result);
+
+  result = FUNC(csinh) (BUILD_COMPLEX (9.0, nan_value));
+  check_isnan ("real(csinh(9.0 + i NaN)) = NaN", __real__ result);
+  check_isnan ("imag(csinh(9.0 + i NaN)) = NaN", __imag__ result);
+  result = FUNC(csinh) (BUILD_COMPLEX (-9.0, nan_value));
+  check_isnan ("real(csinh(-9.0 + i NaN)) = NaN", __real__ result);
+  check_isnan ("imag(csinh(-9.0 + i NaN)) = NaN", __imag__ result);
+
+  result = FUNC(csinh) (BUILD_COMPLEX (nan_value, 0.0));
+  check_isnan ("real(csinh(NaN + i0)) = NaN", __real__ result);
+  check ("imag(csinh(NaN + i0)) = NaN", __imag__ result, 0.0);
+  result = FUNC(csinh) (BUILD_COMPLEX (nan_value, minus_zero));
+  check_isnan ("real(csinh(NaN - i0)) = NaN", __real__ result);
+  check ("imag(csinh(NaN - i0)) = NaN", __imag__ result, minus_zero);
+
+  result = FUNC(csinh) (BUILD_COMPLEX (nan_value, 10.0));
+  check_isnan ("real(csinh(NaN + i10)) = NaN", __real__ result);
+  check_isnan ("imag(csinh(NaN + i10)) = NaN", __imag__ result);
+  result = FUNC(csinh) (BUILD_COMPLEX (nan_value, -10.0));
+  check_isnan ("real(csinh(NaN - i10)) = NaN", __real__ result);
+  check_isnan ("imag(csinh(NaN - i10)) = NaN", __imag__ result);
+
+  result = FUNC(csinh) (BUILD_COMPLEX (nan_value, plus_infty));
+  check_isnan ("real(csinh(NaN + i Inf)) = NaN", __real__ result);
+  check_isnan ("imag(csinh(NaN + i Inf)) = NaN", __imag__ result);
+  result = FUNC(csinh) (BUILD_COMPLEX (nan_value, minus_infty));
+  check_isnan ("real(csinh(NaN - i Inf)) = NaN", __real__ result);
+  check_isnan ("imag(csinh(NaN - i Inf)) = NaN", __imag__ result);
+
+  result = FUNC(csinh) (BUILD_COMPLEX (nan_value, nan_value));
+  check_isnan ("real(csinh(NaN + i NaN)) = NaN", __real__ result);
+  check_isnan ("imag(csinh(NaN + i NaN)) = NaN", __imag__ result);
+}
+
+
+static void
+ccosh_test (void)
+{
+  __complex__ MATHTYPE result;
+
+  result = FUNC(ccosh) (BUILD_COMPLEX (0.0, 0.0));
+  check ("real(ccosh(0 + 0i)) = 0", __real__ result, 1.0);
+  check ("imag(ccosh(0 + 0i)) = 0", __imag__ result, 0);
+  result = FUNC(ccosh) (BUILD_COMPLEX (minus_zero, 0.0));
+  check ("real(ccosh(-0 + 0i)) = -0", __real__ result, 1.0);
+  check ("imag(ccosh(-0 + 0i)) = 0", __imag__ result, 0);
+  result = FUNC(ccosh) (BUILD_COMPLEX (0.0, minus_zero));
+  check ("real(ccosh(0 - 0i)) = 0", __real__ result, 1.0);
+  check ("imag(ccosh(0 - 0i)) = -0", __imag__ result, minus_zero);
+  result = FUNC(ccosh) (BUILD_COMPLEX (minus_zero, minus_zero));
+  check ("real(ccosh(-0 - 0i)) = -0", __real__ result, 1.0);
+  check ("imag(ccosh(-0 - 0i)) = -0", __imag__ result, minus_zero);
+
+  result = FUNC(ccosh) (BUILD_COMPLEX (0.0, plus_infty));
+  check_isnan ("real(ccosh(0 + i Inf)) = NaN", __real__ result);
+  check ("imag(ccosh(0 + i Inf)) = +-0", FUNC(fabs) (__imag__ result), 0);
+  result = FUNC(ccosh) (BUILD_COMPLEX (minus_zero, plus_infty));
+  check_isnan ("real(ccosh(-0 + i Inf)) = NaN", __real__ result);
+  check ("imag(ccosh(-0 + i Inf)) = -0", FUNC(fabs) (__imag__ result), 0);
+  result = FUNC(ccosh) (BUILD_COMPLEX (0.0, minus_infty));
+  check_isnan ("real(ccosh(0 - i Inf)) = NaN", __real__ result);
+  check ("imag(ccosh(0 - i Inf)) = 0", FUNC(fabs) (__imag__ result), 0);
+  result = FUNC(ccosh) (BUILD_COMPLEX (minus_zero, minus_infty));
+  check_isnan ("real(ccosh(-0 - i Inf)) = NaN", __real__ result);
+  check ("imag(ccosh(-0 - i Inf)) = -0", FUNC(fabs) (__imag__ result), 0);
+
+  result = FUNC(ccosh) (BUILD_COMPLEX (plus_infty, 0.0));
+  check_isinfp ("real(ccosh(+Inf + 0i)) = +Inf", __real__ result);
+  check ("imag(ccosh(+Inf + 0i)) = 0", __imag__ result, 0);
+  result = FUNC(ccosh) (BUILD_COMPLEX (minus_infty, 0.0));
+  check_isinfp ("real(ccosh(-Inf + 0i)) = +Inf", __real__ result);
+  check ("imag(ccosh(-Inf + 0i)) = 0", __imag__ result, 0);
+  result = FUNC(ccosh) (BUILD_COMPLEX (plus_infty, minus_zero));
+  check_isinfp ("real(ccosh(+Inf - 0i)) = +Inf", __real__ result);
+  check ("imag(ccosh(+Inf - 0i)) = -0", __imag__ result, minus_zero);
+  result = FUNC(ccosh) (BUILD_COMPLEX (minus_infty, minus_zero));
+  check_isinfp ("real(ccosh(-Inf - 0i)) = +Inf", __real__ result);
+  check ("imag(ccosh(-Inf - 0i)) = -0", __imag__ result, minus_zero);
+
+  result = FUNC(ccosh) (BUILD_COMPLEX (plus_infty, plus_infty));
+  check_isinfp ("real(ccosh(+Inf + i Inf)) = +Inf", __real__ result);
+  check_isnan ("imag(ccosh(+Inf + i Inf)) = NaN", __imag__ result);
+  result = FUNC(ccosh) (BUILD_COMPLEX (minus_infty, plus_infty));
+  check_isinfp ("real(ccosh(-Inf + i Inf)) = +Inf", __real__ result);
+  check_isnan ("imag(ccosh(-Inf + i Inf)) = NaN", __imag__ result);
+  result = FUNC(ccosh) (BUILD_COMPLEX (plus_infty, minus_infty));
+  check_isinfp ("real(ccosh(Inf - i Inf)) = +Inf", __real__ result);
+  check_isnan ("imag(ccosh(Inf - i Inf)) = NaN", __imag__ result);
+  result = FUNC(ccosh) (BUILD_COMPLEX (minus_infty, minus_infty));
+  check_isinfp ("real(ccosh(-Inf - i Inf)) = +Inf", __real__ result);
+  check_isnan ("imag(ccosh(-Inf - i Inf)) = NaN", __imag__ result);
+
+  result = FUNC(ccosh) (BUILD_COMPLEX (plus_infty, 4.625));
+  check_isinfn ("real(ccosh(+Inf + i4.625)) = -Inf", __real__ result);
+  check_isinfn ("imag(ccosh(+Inf + i4.625)) = -Inf", __imag__ result);
+  result = FUNC(ccosh) (BUILD_COMPLEX (minus_infty, 4.625));
+  check_isinfn ("real(ccosh(-Inf + i4.625)) = -Inf", __real__ result);
+  check_isinfn ("imag(ccosh(-Inf + i4.625)) = -Inf", __imag__ result);
+  result = FUNC(ccosh) (BUILD_COMPLEX (plus_infty, -4.625));
+  check_isinfn ("real(ccosh(+Inf - i4.625)) = -Inf", __real__ result);
+  check_isinfp ("imag(ccosh(+Inf - i4.625)) = +Inf", __imag__ result);
+  result = FUNC(ccosh) (BUILD_COMPLEX (minus_infty, -4.625));
+  check_isinfn ("real(ccosh(-Inf - i4.625)) = -Inf", __real__ result);
+  check_isinfp ("imag(ccosh(-Inf - i4.625)) = +Inf", __imag__ result);
+
+  result = FUNC(ccosh) (BUILD_COMPLEX (6.75, plus_infty));
+  check_isnan ("real(ccosh(6.75 + i Inf)) = NaN", __real__ result);
+  check_isnan ("imag(ccosh(6.75 + i Inf)) = NaN", __imag__ result);
+  result = FUNC(ccosh) (BUILD_COMPLEX (-6.75, plus_infty));
+  check_isnan ("real(ccosh(-6.75 + i Inf)) = NaN", __real__ result);
+  check_isnan ("imag(ccosh(-6.75 + i Inf)) = NaN", __imag__ result);
+  result = FUNC(ccosh) (BUILD_COMPLEX (6.75, minus_infty));
+  check_isnan ("real(ccosh(6.75 - i Inf)) = NaN", __real__ result);
+  check_isnan ("imag(ccosh(6.75 - i Inf)) = NaN", __imag__ result);
+  result = FUNC(ccosh) (BUILD_COMPLEX (-6.75, minus_infty));
+  check_isnan ("real(ccosh(-6.75 - i Inf)) = NaN", __real__ result);
+  check_isnan ("imag(ccosh(-6.75 - i Inf)) = NaN", __imag__ result);
+
+  result = FUNC(ccosh) (BUILD_COMPLEX (0.0, nan_value));
+  check_isnan ("real(ccosh(0 + i NaN)) = NaN", __real__ result);
+  check ("imag(ccosh(0 + i NaN)) = +-0", FUNC(fabs) (__imag__ result), 0);
+  result = FUNC(ccosh) (BUILD_COMPLEX (minus_zero, nan_value));
+  check_isnan ("real(ccosh(-0 + i NaN)) = NaN", __real__ result);
+  check ("imag(ccosh(-0 + i NaN)) = +-0", FUNC(fabs) (__imag__ result), 0);
+
+  result = FUNC(ccosh) (BUILD_COMPLEX (plus_infty, nan_value));
+  check_isinfp ("real(ccosh(+Inf + i NaN)) = +Inf", __real__ result);
+  check_isnan ("imag(ccosh(+Inf + i NaN)) = NaN", __imag__ result);
+  result = FUNC(ccosh) (BUILD_COMPLEX (minus_infty, nan_value));
+  check_isinfp ("real(ccosh(-Inf + i NaN)) = +Inf", __real__ result);
+  check_isnan ("imag(ccosh(-0 + i NaN)) = NaN", __imag__ result);
+
+  result = FUNC(ccosh) (BUILD_COMPLEX (9.0, nan_value));
+  check_isnan ("real(ccosh(9.0 + i NaN)) = NaN", __real__ result);
+  check_isnan ("imag(ccosh(9.0 + i NaN)) = NaN", __imag__ result);
+  result = FUNC(ccosh) (BUILD_COMPLEX (-9.0, nan_value));
+  check_isnan ("real(ccosh(-9.0 + i NaN)) = NaN", __real__ result);
+  check_isnan ("imag(ccosh(-9.0 + i NaN)) = NaN", __imag__ result);
+
+  result = FUNC(ccosh) (BUILD_COMPLEX (nan_value, 0.0));
+  check_isnan ("real(ccosh(NaN + i0)) = NaN", __real__ result);
+  check ("imag(ccosh(NaN + i0)) = NaN", __imag__ result, 0.0);
+  result = FUNC(ccosh) (BUILD_COMPLEX (nan_value, minus_zero));
+  check_isnan ("real(ccosh(NaN - i0)) = NaN", __real__ result);
+  check ("imag(ccosh(NaN - i0)) = NaN", __imag__ result, minus_zero);
+
+  result = FUNC(ccosh) (BUILD_COMPLEX (nan_value, 10.0));
+  check_isnan ("real(ccosh(NaN + i10)) = NaN", __real__ result);
+  check_isnan ("imag(ccosh(NaN + i10)) = NaN", __imag__ result);
+  result = FUNC(ccosh) (BUILD_COMPLEX (nan_value, -10.0));
+  check_isnan ("real(ccosh(NaN - i10)) = NaN", __real__ result);
+  check_isnan ("imag(ccosh(NaN - i10)) = NaN", __imag__ result);
+
+  result = FUNC(ccosh) (BUILD_COMPLEX (nan_value, plus_infty));
+  check_isnan ("real(ccosh(NaN + i Inf)) = NaN", __real__ result);
+  check_isnan ("imag(ccosh(NaN + i Inf)) = NaN", __imag__ result);
+  result = FUNC(ccosh) (BUILD_COMPLEX (nan_value, minus_infty));
+  check_isnan ("real(ccosh(NaN - i Inf)) = NaN", __real__ result);
+  check_isnan ("imag(ccosh(NaN - i Inf)) = NaN", __imag__ result);
+
+  result = FUNC(ccosh) (BUILD_COMPLEX (nan_value, nan_value));
+  check_isnan ("real(ccosh(NaN + i NaN)) = NaN", __real__ result);
+  check_isnan ("imag(ccosh(NaN + i NaN)) = NaN", __imag__ result);
+}
+
+
+#if 0
+/* Enable these tests as soon as the functions are available.  */
+static void
+cacos_test (void)
+{
+  __complex__ MATHTYPE result;
+
+  result = FUNC(cacos) (BUILD_COMPLEX (0, 0));
+  check ("real(cacos(0 + i0)) = pi/2", __real__ result, M_PI_2);
+  check ("imag(cacos(0 + i0)) = -0", __imag__ result, minus_zero);
+  result = FUNC(cacos) (BUILD_COMPLEX (minus_zero, 0));
+  check ("real(cacos(-0 + i0)) = pi/2", __real__ result, M_PI_2);
+  check ("imag(cacos(-0 + i0)) = -0", __imag__ result, minus_zero);
+  result = FUNC(cacos) (BUILD_COMPLEX (0, minus_zero));
+  check ("real(cacos(0 - i0)) = pi/2", __real__ result, M_PI_2);
+  check ("imag(cacos(0 - i0)) = 0", __imag__ result, 0);
+  result = FUNC(cacos) (BUILD_COMPLEX (minus_zero, minus_zero));
+  check ("real(cacos(-0 - i0)) = pi/2", __real__ result, M_PI_2);
+  check ("imag(cacos(-0 - i0)) = 0", __imag__ result, 0);
+
+  result = FUNC(cacos) (BUILD_COMPLEX (minus_infty, plus_infty));
+  check ("real(cacos(-Inf + i Inf)) = 3*pi/4", __real__ result, M_PI - M_PI_4);
+  check_isinfn ("imag(cacos(-Inf + i Inf)) = -Inf", __imag__ result);
+  result = FUNC(cacos) (BUILD_COMPLEX (minus_infty, minus_infty));
+  check ("real(cacos(-Inf - i Inf)) = 3*pi/4", __real__ result, M_PI - M_PI_4);
+  check_isinfp ("imag(cacos(-Inf - i Inf)) = +Inf", __imag__ result);
+
+  result = FUNC(cacos) (BUILD_COMPLEX (plus_infty, plus_infty));
+  check ("real(cacos(+Inf + i Inf)) = pi/4", __real__ result, M_PI_4);
+  check_isinfn ("imag(cacos(+Inf + i Inf)) = -Inf", __imag__ result);
+  result = FUNC(cacos) (BUILD_COMPLEX (plus_infty, minus_infty));
+  check ("real(cacos(+Inf - i Inf)) = pi/4", __real__ result, M_PI_4);
+  check_isinfp ("imag(cacos(+Inf - i Inf)) = +Inf", __imag__ result);
+
+  result = FUNC(cacos) (BUILD_COMPLEX (-10.0, plus_infty));
+  check ("real(cacos(-10.0 + i Inf)) = pi/2", __real__ result, M_PI_2);
+  check_isinfn ("imag(cacos(-10.0 + i Inf)) = -Inf", __imag__ result);
+  result = FUNC(cacos) (BUILD_COMPLEX (-10.0, minus_infty));
+  check ("real(cacos(-10.0 - i Inf)) = pi/2", __real__ result, M_PI_2);
+  check_isinfp ("imag(cacos(-10.0 - i Inf)) = +Inf", __imag__ result);
+  result = FUNC(cacos) (BUILD_COMPLEX (0, plus_infty));
+  check ("real(cacos(0 + i Inf)) = pi/2", __real__ result, M_PI_2);
+  check_isinfn ("imag(cacos(0 + i Inf)) = -Inf", __imag__ result);
+  result = FUNC(cacos) (BUILD_COMPLEX (0, minus_infty));
+  check ("real(cacos(0 - i Inf)) = pi/2", __real__ result, M_PI_2);
+  check_isinfp ("imag(cacos(0 - i Inf)) = +Inf", __imag__ result);
+  result = FUNC(cacos) (BUILD_COMPLEX (0.1, plus_infty));
+  check ("real(cacos(0.1 + i Inf)) = pi/2", __real__ result, M_PI_2);
+  check_isinfn ("imag(cacos(0.1 + i Inf)) = -Inf", __imag__ result);
+  result = FUNC(cacos) (BUILD_COMPLEX (0.1, minus_infty));
+  check ("real(cacos(0.1 - i Inf)) = pi/2", __real__ result, M_PI_2);
+  check_isinfp ("imag(cacos(0.1 - i Inf)) = +Inf", __imag__ result);
+
+  result = FUNC(cacos) (BUILD_COMPLEX (minus_infty, 0));
+  check ("real(cacos(-Inf + i0)) = pi", __real__ result, M_PI);
+  check_isinfn ("imag(cacos(-Inf + i0)) = -Inf", __imag__ result);
+  result = FUNC(cacos) (BUILD_COMPLEX (minus_infty, minus_zero));
+  check ("real(cacos(-Inf - i0)) = pi", __real__ result, M_PI);
+  check_isinfp ("imag(cacos(-Inf - i0)) = +Inf", __imag__ result);
+  result = FUNC(cacos) (BUILD_COMPLEX (minus_infty, 100));
+  check ("real(cacos(-Inf + i100)) = pi", __real__ result, M_PI);
+  check_isinfn ("imag(cacos(-Inf + i100)) = -Inf", __imag__ result);
+  result = FUNC(cacos) (BUILD_COMPLEX (minus_infty, -100));
+  check ("real(cacos(-Inf - i100)) = pi", __real__ result, M_PI);
+  check_isinfp ("imag(cacos(-Inf - i100)) = +Inf", __imag__ result);
+
+  result = FUNC(cacos) (BUILD_COMPLEX (plus_infty, 0));
+  check ("real(cacos(+Inf + i0)) = 0", __real__ result, 0);
+  check_isinfn ("imag(cacos(+Inf + i0)) = -Inf", __imag__ result);
+  result = FUNC(cacos) (BUILD_COMPLEX (plus_infty, minus_zero));
+  check ("real(cacos(+Inf - i0)) = 0", __real__ result, 0);
+  check_isinfp ("imag(cacos(+Inf - i0)) = +Inf", __imag__ result);
+  result = FUNC(cacos) (BUILD_COMPLEX (plus_infty, 0.5));
+  check ("real(cacos(+Inf + i0.5)) = 0", __real__ result, 0);
+  check_isinfn ("imag(cacos(+Inf + i0.5)) = -Inf", __imag__ result);
+  result = FUNC(cacos) (BUILD_COMPLEX (plus_infty, -0.5));
+  check ("real(cacos(+Inf - i0.5)) = 0", __real__ result, 0);
+  check_isinfp ("imag(cacos(+Inf - i0.5)) = +Inf", __imag__ result);
+
+  result = FUNC(cacos) (BUILD_COMPLEX (plus_infty, nan_value));
+  check_isnan ("real(cacos(+Inf + i NaN)) = NaN", __real__ result);
+  check_isinfp ("imag(cacos(+Inf + i NaN)) = +-Inf",
+		FUNC(fabs) (__imag__ result));
+  result = FUNC(cacos) (BUILD_COMPLEX (minus_infty, nan_value));
+  check_isnan ("real(cacos(-Inf + i NaN)) = NaN", __real__ result);
+  check_isinfp ("imag(cacos(-Inf + i NaN)) = +-Inf",
+		FUNC(fabs) (__imag__ result));
+
+  result = FUNC(cacos) (BUILD_COMPLEX (0, nan_value));
+  check ("real(cacos(0 + i NaN)) = pi/2", __real__ result, M_PI_2);
+  check_isnan ("imag(cacos(0 + i NaN)) = NaN", __imag__ result);
+  result = FUNC(cacos) (BUILD_COMPLEX (minus_zero, nan_value));
+  check ("real(cacos(-0 + i NaN)) = pi/2", __real__ result, M_PI_2);
+  check_isnan ("imag(cacos(-0 + i NaN)) = NaN", __imag__ result);
+
+  result = FUNC(cacos) (BUILD_COMPLEX (nan_value, plus_infty));
+  check_isnan ("real(cacos(NaN + i Inf)) = NaN", __real__ result);
+  check_isinfn ("imag(cacos(NaN + i Inf)) = -Inf", __imag__ result);
+  result = FUNC(cacos) (BUILD_COMPLEX (nan_value, minus_infty));
+  check_isnan ("real(cacos(NaN - i Inf)) = NaN", __real__ result);
+  check_isinfp ("imag(cacos(NaN - i Inf)) = +Inf", __imag__ result);
+
+  result = FUNC(cacos) (BUILD_COMPLEX (10.5, nan_value));
+  check_isnan ("real(cacos(10.5 + i NaN)) = NaN", __real__ result);
+  check_isnan ("imag(cacos(10.5 + i NaN)) = NaN", __imag__ result);
+  result = FUNC(cacos) (BUILD_COMPLEX (-10.5, nan_value));
+  check_isnan ("real(cacos(-10.5 + i NaN)) = NaN", __real__ result);
+  check_isnan ("imag(cacos(-10.5 + i NaN)) = NaN", __imag__ result);
+
+  result = FUNC(cacos) (BUILD_COMPLEX (nan_value, 0.75));
+  check_isnan ("real(cacos(NaN + i0.75)) = NaN", __real__ result);
+  check_isnan ("imag(cacos(NaN + i0.75)) = NaN", __imag__ result);
+  result = FUNC(cacos) (BUILD_COMPLEX (-10.5, nan_value));
+  check_isnan ("real(cacos(NaN - i0.75)) = NaN", __real__ result);
+  check_isnan ("imag(cacos(NaN - i0.75)) = NaN", __imag__ result);
+
+  result = FUNC(cacos) (BUILD_COMPLEX (nan_value, nan_value));
+  check_isnan ("real(cacos(NaN + i NaN)) = NaN", __real__ result);
+  check_isnan ("imag(cacos(NaN + i NaN)) = NaN", __imag__ result);
+}
+
+
+static void
+cacosh_test (void)
+{
+  __complex__ MATHTYPE result;
+
+  result = FUNC(cacosh) (BUILD_COMPLEX (0, 0));
+  check ("real(cacosh(0 + i0)) = 0", __real__ result, 0);
+  check ("imag(cacosh(0 + i0)) = pi/2", __imag__ result, M_PI_2);
+  result = FUNC(cacosh) (BUILD_COMPLEX (minus_zero, 0));
+  check ("real(cacosh(-0 + i0)) = 0", __real__ result, 0);
+  check ("imag(cacosh(-0 + i0)) = pi/2", __imag__ result, M_PI_2);
+  result = FUNC(cacosh) (BUILD_COMPLEX (0, minus_zero));
+  check ("real(cacosh(0 - i0)) = 0", __real__ result, 0);
+  check ("imag(cacosh(0 - i0)) = -pi/2", __imag__ result, -M_PI_2);
+  result = FUNC(cacosh) (BUILD_COMPLEX (minus_zero, minus_zero));
+  check ("real(cacosh(-0 - i0)) = 0", __real__ result, 0);
+  check ("imag(cacosh(-0 - i0)) = -pi/2", __imag__ result, -M_PI_2);
+
+  result = FUNC(cacosh) (BUILD_COMPLEX (minus_infty, plus_infty));
+  check_isinfp ("real(cacosh(-Inf + i Inf)) = +Inf", __real__ result);
+  check ("imag(cacosh(-Inf + i Inf)) = 3*pi/4", __imag__ result,
+	 M_PI - M_PI_4);
+  result = FUNC(cacosh) (BUILD_COMPLEX (minus_infty, minus_infty));
+  check_isinfp ("real(cacosh(-Inf - i Inf)) = +Inf", __real__ result);
+  check ("imag(cacosh(-Inf - i Inf)) = -3*pi/4", __imag__ result,
+	 M_PI_4 - M_PI);
+
+  result = FUNC(cacosh) (BUILD_COMPLEX (plus_infty, plus_infty));
+  check_isinfp ("real(cacosh(+Inf + i Inf)) = +Inf", __real__ result);
+  check ("imag(cacosh(+Inf + i Inf)) = pi/4", __imag__ result, M_PI_4);
+  result = FUNC(cacosh) (BUILD_COMPLEX (plus_infty, minus_infty));
+  check_isinfp ("real(cacosh(+Inf - i Inf)) = +Inf", __real__ result);
+  check ("imag(cacosh(+Inf - i Inf)) = -pi/4", __imag__ result, -M_PI_4);
+
+  result = FUNC(cacosh) (BUILD_COMPLEX (-10.0, plus_infty));
+  check_isinfp ("real(cacosh(-10.0 + i Inf)) = +Inf", __real__ result);
+  check ("imag(cacosh(-10.0 + i Inf)) = pi/2", __imag__ result, M_PI_2);
+  result = FUNC(cacosh) (BUILD_COMPLEX (-10.0, minus_infty));
+  check_isinfp ("real(cacosh(-10.0 - i Inf)) = +Inf", __real__ result);
+  check ("imag(cacosh(-10.0 - i Inf)) = -pi/2", __imag__ result, -M_PI_2);
+  result = FUNC(cacosh) (BUILD_COMPLEX (0, plus_infty));
+  check_isinfp ("real(cacosh(0 + i Inf)) = +Inf", __real__ result);
+  check ("imag(cacosh(0 + i Inf)) = pi/2", __imag__ result, M_PI_2);
+  result = FUNC(cacosh) (BUILD_COMPLEX (0, minus_infty));
+  check_isinfp ("real(cacosh(0 - i Inf)) = +Inf", __real__ result);
+  check ("imag(cacosh(0 - i Inf)) = -pi/2", __imag__ result, -M_PI_2);
+  result = FUNC(cacosh) (BUILD_COMPLEX (0.1, plus_infty));
+  check_isinfp ("real(cacosh(0.1 + i Inf)) = +Inf", __real__ result);
+  check ("imag(cacosh(0.1 + i Inf)) = pi/2", __imag__ result, M_PI_2);
+  result = FUNC(cacosh) (BUILD_COMPLEX (0.1, minus_infty));
+  check_isinfp ("real(cacosh(0.1 - i Inf)) = +Inf", __real__ result);
+  check ("imag(cacosh(0.1 - i Inf)) = -pi/2", __imag__ result, -M_PI_2);
+
+  result = FUNC(cacosh) (BUILD_COMPLEX (minus_infty, 0));
+  check_isinfp ("real(cacosh(-Inf + i0)) = +Inf", __real__ result);
+  check ("imag(cacosh(-Inf + i0)) = pi", __imag__ result, M_PI);
+  result = FUNC(cacosh) (BUILD_COMPLEX (minus_infty, minus_zero));
+  check_isinfp ("real(cacosh(-Inf - i0)) = +Inf", __real__ result);
+  check ("imag(cacosh(-Inf - i0)) = -pi", __imag__ result, -M_PI);
+  result = FUNC(cacosh) (BUILD_COMPLEX (minus_infty, 100));
+  check_isinfp ("real(cacosh(-Inf + i100)) = +Inf", __real__ result);
+  check ("imag(cacosh(-Inf + i100)) = pi", __imag__ result, M_PI);
+  result = FUNC(cacosh) (BUILD_COMPLEX (minus_infty, -100));
+  check_isinfp ("real(cacosh(-Inf - i100)) = +Inf", __real__ result);
+  check ("imag(cacosh(-Inf - i100)) = -pi", __imag__ result, -M_PI);
+
+  result = FUNC(cacosh) (BUILD_COMPLEX (plus_infty, 0));
+  check_isinfp ("real(cacosh(+Inf + i0)) = +Inf", __real__ result);
+  check ("imag(cacosh(+Inf + i0)) = 0", __imag__ result, 0);
+  result = FUNC(cacosh) (BUILD_COMPLEX (plus_infty, minus_zero));
+  check_isinfp ("real(cacosh(+Inf - i0)) = +Inf", __real__ result);
+  check ("imag(cacosh(+Inf - i0)) = -0", __imag__ result, minus_zero);
+  result = FUNC(cacosh) (BUILD_COMPLEX (plus_infty, 0.5));
+  check_isinfp ("real(cacosh(+Inf + i0.5)) = +Inf", __real__ result);
+  check ("imag(cacosh(+Inf + i0.5)) = 0", __imag__ result, 0);
+  result = FUNC(cacosh) (BUILD_COMPLEX (plus_infty, -0.5));
+  check_isinfp ("real(cacosh(+Inf - i0.5)) = +Inf", __real__ result);
+  check ("imag(cacosh(+Inf - i0.5)) = -0", __imag__ result, minus_zero);
+
+  result = FUNC(cacosh) (BUILD_COMPLEX (plus_infty, nan_value));
+  check_isinfp ("real(cacosh(+Inf + i NaN)) = +Inf", __real__ result);
+  check_isnan ("imag(cacosh(+Inf + i NaN)) = NaN", __imag__ result);
+  result = FUNC(cacosh) (BUILD_COMPLEX (minus_infty, nan_value));
+  check_isinfp ("real(cacosh(-Inf + i NaN)) = +Inf", __real__ result);
+  check_isnan ("imag(cacosh(-Inf + i NaN)) = NaN", __imag__ result);
+
+  result = FUNC(cacosh) (BUILD_COMPLEX (0, nan_value));
+  check_isnan ("real(cacosh(0 + i NaN)) = NaN", __real__ result);
+  check_isnan ("imag(cacosh(0 + i NaN)) = NaN", __imag__ result);
+  result = FUNC(cacosh) (BUILD_COMPLEX (minus_zero, nan_value));
+  check_isnan ("real(cacosh(-0 + i NaN)) = NaN", __real__ result);
+  check_isnan ("imag(cacosh(-0 + i NaN)) = NaN", __imag__ result);
+
+  result = FUNC(cacosh) (BUILD_COMPLEX (nan_value, plus_infty));
+  check_isinfp ("real(cacosh(NaN + i Inf)) = +Inf", __real__ result);
+  check_isnan ("imag(cacosh(NaN + i Inf)) = NaN", __imag__ result);
+  result = FUNC(cacosh) (BUILD_COMPLEX (nan_value, minus_infty));
+  check_isinfp ("real(cacosh(NaN - i Inf)) = +Inf", __real__ result);
+  check_isnan ("imag(cacosh(NaN - i Inf)) = NaN", __imag__ result);
+
+  result = FUNC(cacosh) (BUILD_COMPLEX (10.5, nan_value));
+  check_isnan ("real(cacosh(10.5 + i NaN)) = NaN", __real__ result);
+  check_isnan ("imag(cacosh(10.5 + i NaN)) = NaN", __imag__ result);
+  result = FUNC(cacosh) (BUILD_COMPLEX (-10.5, nan_value));
+  check_isnan ("real(cacosh(-10.5 + i NaN)) = NaN", __real__ result);
+  check_isnan ("imag(cacosh(-10.5 + i NaN)) = NaN", __imag__ result);
+
+  result = FUNC(cacosh) (BUILD_COMPLEX (nan_value, 0.75));
+  check_isnan ("real(cacosh(NaN + i0.75)) = NaN", __real__ result);
+  check_isnan ("imag(cacosh(NaN + i0.75)) = NaN", __imag__ result);
+  result = FUNC(cacosh) (BUILD_COMPLEX (-10.5, nan_value));
+  check_isnan ("real(cacosh(NaN - i0.75)) = NaN", __real__ result);
+  check_isnan ("imag(cacosh(NaN - i0.75)) = NaN", __imag__ result);
+
+  result = FUNC(cacosh) (BUILD_COMPLEX (nan_value, nan_value));
+  check_isnan ("real(cacosh(NaN + i NaN)) = NaN", __real__ result);
+  check_isnan ("imag(cacosh(NaN + i NaN)) = NaN", __imag__ result);
+}
+
+
+static void
+casinh_test (void)
+{
+  __complex__ MATHTYPE result;
+
+  result = FUNC(casinh) (BUILD_COMPLEX (0, 0));
+  check ("real(casinh(0 + i0)) = 0", __real__ result, 0);
+  check ("imag(casinh(0 + i0)) = 0", __imag__ result, 0);
+  result = FUNC(casinh) (BUILD_COMPLEX (minus_zero, 0));
+  check ("real(casinh(-0 + i0)) = -0", __real__ result, minus_zero);
+  check ("imag(casinh(-0 + i0)) = 0", __imag__ result, 0);
+  result = FUNC(casinh) (BUILD_COMPLEX (0, minus_zero));
+  check ("real(casinh(0 - i0)) = 0", __real__ result, 0);
+  check ("imag(casinh(0 - i0)) = -0", __imag__ result, minus_zero);
+  result = FUNC(casinh) (BUILD_COMPLEX (minus_zero, minus_zero));
+  check ("real(casinh(-0 - i0)) = -0", __real__ result, minus_zero);
+  check ("imag(casinh(-0 - i0)) = -0", __imag__ result, minus_zero);
+
+  result = FUNC(casinh) (BUILD_COMPLEX (plus_infty, plus_infty));
+  check_isinfp ("real(casinh(+Inf + i Inf)) = +Inf", __real__ result);
+  check ("imag(casinh(+Inf + i Inf)) = pi/4", __imag__ result, M_PI_4);
+  result = FUNC(casinh) (BUILD_COMPLEX (plus_infty, minus_infty));
+  check_isinfp ("real(casinh(+Inf - i Inf)) = +Inf", __real__ result);
+  check ("imag(casinh(+Inf - i Inf)) = -pi/4", __imag__ result, -M_PI_4);
+  result = FUNC(casinh) (BUILD_COMPLEX (minus_infty, plus_infty));
+  check_isinfn ("real(casinh(-Inf + i Inf)) = -Inf", __real__ result);
+  check ("imag(casinh(-Inf + i Inf)) = pi/4", __imag__ result, M_PI_4);
+  result = FUNC(casinh) (BUILD_COMPLEX (minus_infty, minus_infty));
+  check_isinfn ("real(casinh(-Inf - i Inf)) = -Inf", __real__ result);
+  check ("imag(casinh(-Inf - i Inf)) = -pi/4", __imag__ result, -M_PI_4);
+
+  result = FUNC(casinh) (BUILD_COMPLEX (-10.0, plus_infty));
+  check_isinfn ("real(casinh(-10.0 + i Inf)) = -Inf", __real__ result);
+  check ("imag(casinh(-10.0 + i Inf)) = pi/2", __imag__ result, M_PI_2);
+  result = FUNC(casinh) (BUILD_COMPLEX (-10.0, minus_infty));
+  check_isinfn ("real(casinh(-10.0 - i Inf)) = -Inf", __real__ result);
+  check ("imag(casinh(-10.0 - i Inf)) = -pi/2", __imag__ result, -M_PI_2);
+  result = FUNC(casinh) (BUILD_COMPLEX (0, plus_infty));
+  check_isinfp ("real(casinh(0 + i Inf)) = +Inf", __real__ result);
+  check ("imag(casinh(0 + i Inf)) = pi/2", __imag__ result, M_PI_2);
+  result = FUNC(casinh) (BUILD_COMPLEX (0, minus_infty));
+  check_isinfp ("real(casinh(0 - i Inf)) = +Inf", __real__ result);
+  check ("imag(casinh(0 - i Inf)) = -pi/2", __imag__ result, -M_PI_2);
+  result = FUNC(casinh) (BUILD_COMPLEX (0.1, plus_infty));
+  check_isinfp ("real(casinh(0.1 + i Inf)) = +Inf", __real__ result);
+  check ("imag(casinh(0.1 + i Inf)) = pi/2", __imag__ result, M_PI_2);
+  result = FUNC(casinh) (BUILD_COMPLEX (0.1, minus_infty));
+  check_isinfp ("real(casinh(0.1 - i Inf)) = +Inf", __real__ result);
+  check ("imag(casinh(0.1 - i Inf)) = -pi/2", __imag__ result, -M_PI_2);
+
+  result = FUNC(casinh) (BUILD_COMPLEX (minus_infty, 0));
+  check_isinfn ("real(casinh(-Inf + i0)) = -Inf", __real__ result);
+  check ("imag(casinh(-Inf + i0)) = 0", __imag__ result, 0);
+  result = FUNC(casinh) (BUILD_COMPLEX (minus_infty, minus_zero));
+  check_isinfn ("real(casinh(-Inf - i0)) = -Inf", __real__ result);
+  check ("imag(casinh(-Inf - i0)) = -0", __imag__ result, minus_zero);
+  result = FUNC(casinh) (BUILD_COMPLEX (minus_infty, 100));
+  check_isinfn ("real(casinh(-Inf + i100)) = -Inf", __real__ result);
+  check ("imag(casinh(-Inf + i100)) = 0", __imag__ result, 0);
+  result = FUNC(casinh) (BUILD_COMPLEX (minus_infty, -100));
+  check_isinfn ("real(casinh(-Inf - i100)) = -Inf", __real__ result);
+  check ("imag(casinh(-Inf - i100)) = -0", __imag__ result, minus_zero);
+
+  result = FUNC(casinh) (BUILD_COMPLEX (plus_infty, 0));
+  check_isinfp ("real(casinh(+Inf + i0)) = +Inf", __real__ result);
+  check ("imag(casinh(+Inf + i0)) = 0", __imag__ result, 0);
+  result = FUNC(casinh) (BUILD_COMPLEX (plus_infty, minus_zero));
+  check_isinfp ("real(casinh(+Inf - i0)) = +Inf", __real__ result);
+  check ("imag(casinh(+Inf - i0)) = -0", __imag__ result, minus_zero);
+  result = FUNC(casinh) (BUILD_COMPLEX (plus_infty, 0.5));
+  check_isinfp ("real(casinh(+Inf + i0.5)) = +Inf", __real__ result);
+  check ("imag(casinh(+Inf + i0.5)) = 0", __imag__ result, 0);
+  result = FUNC(casinh) (BUILD_COMPLEX (plus_infty, -0.5));
+  check_isinfp ("real(casinh(+Inf - i0.5)) = +Inf", __real__ result);
+  check ("imag(casinh(+Inf - i0.5)) = -0", __imag__ result, minus_zero);
+
+  result = FUNC(casinh) (BUILD_COMPLEX (plus_infty, nan_value));
+  check_isinfp ("real(casinh(+Inf + i NaN)) = +Inf", __real__ result);
+  check_isnan ("imag(casinh(+Inf + i NaN)) = NaN", __imag__ result);
+  result = FUNC(casinh) (BUILD_COMPLEX (minus_infty, nan_value));
+  check_isinfn ("real(casinh(-Inf + i NaN)) = -Inf", __real__ result);
+  check_isnan ("imag(casinh(-Inf + i NaN)) = NaN", __imag__ result);
+
+  result = FUNC(casinh) (BUILD_COMPLEX (nan_value, 0));
+  check_isnan ("real(casinh(NaN + i0)) = NaN", __real__ result);
+  check ("imag(casinh(NaN + i0)) = 0", __imag__ resul, 0);
+  result = FUNC(casinh) (BUILD_COMPLEX (minus_zero, nan_value));
+  check_isnan ("real(casinh(NaN - i0)) = NaN", __real__ result);
+  check ("imag(casinh(NaN - i0)) = -0", __imag__ result, minus_zero);
+
+  result = FUNC(casinh) (BUILD_COMPLEX (nan_value, plus_infty));
+  check_isinfp ("real(casinh(NaN + i Inf)) = +Inf",
+		FUNC(fabs) (__real__ result));
+  check_isnan ("imag(casinh(NaN + i Inf)) = NaN", __imag__ result);
+  result = FUNC(casinh) (BUILD_COMPLEX (nan_value, minus_infty));
+  check_isinfp ("real(casinh(NaN - i Inf)) = +Inf",
+		FUNC(fabs) (__real__ result));
+  check_isnan ("imag(casinh(NaN - i Inf)) = NaN", __imag__ result);
+
+  result = FUNC(casinh) (BUILD_COMPLEX (10.5, nan_value));
+  check_isnan ("real(casinh(10.5 + i NaN)) = NaN", __real__ result);
+  check_isnan ("imag(casinh(10.5 + i NaN)) = NaN", __imag__ result);
+  result = FUNC(casinh) (BUILD_COMPLEX (-10.5, nan_value));
+  check_isnan ("real(casinh(-10.5 + i NaN)) = NaN", __real__ result);
+  check_isnan ("imag(casinh(-10.5 + i NaN)) = NaN", __imag__ result);
+
+  result = FUNC(casinh) (BUILD_COMPLEX (nan_value, 0.75));
+  check_isnan ("real(casinh(NaN + i0.75)) = NaN", __real__ result);
+  check_isnan ("imag(casinh(NaN + i0.75)) = NaN", __imag__ result);
+  result = FUNC(casinh) (BUILD_COMPLEX (-10.5, nan_value));
+  check_isnan ("real(casinh(NaN - i0.75)) = NaN", __real__ result);
+  check_isnan ("imag(casinh(NaN - i0.75)) = NaN", __imag__ result);
+
+  result = FUNC(casinh) (BUILD_COMPLEX (nan_value, nan_value));
+  check_isnan ("real(casinh(NaN + i NaN)) = NaN", __real__ result);
+  check_isnan ("imag(casinh(NaN + i NaN)) = NaN", __imag__ result);
+}
+
+
+static void
+catanh_test (void)
+{
+  __complex__ MATHTYPE result;
+
+  result = FUNC(catanh) (BUILD_COMPLEX (0, 0));
+  check ("real(catanh(0 + i0)) = 0", __real__ result, 0);
+  check ("imag(catanh(0 + i0)) = 0", __imag__ result, 0);
+  result = FUNC(catanh) (BUILD_COMPLEX (minus_zero, 0));
+  check ("real(catanh(-0 + i0)) = -0", __real__ result, minus_zero);
+  check ("imag(catanh(-0 + i0)) = 0", __imag__ result, 0);
+  result = FUNC(catanh) (BUILD_COMPLEX (0, minus_zero));
+  check ("real(catanh(0 - i0)) = 0", __real__ result, 0);
+  check ("imag(catanh(0 - i0)) = -0", __imag__ result, minus_zero);
+  result = FUNC(catanh) (BUILD_COMPLEX (minus_zero, minus_zero));
+  check ("real(catanh(-0 - i0)) = -0", __real__ result, minus_zero);
+  check ("imag(catanh(-0 - i0)) = -0", __imag__ result, minus_zero);
+
+  result = FUNC(catanh) (BUILD_COMPLEX (plus_infty, plus_infty));
+  check ("real(catanh(+Inf + i Inf)) = 0", __real__ result, 0);
+  check ("imag(catanh(+Inf + i Inf)) = pi/2", __imag__ result, M_PI_2);
+  result = FUNC(catanh) (BUILD_COMPLEX (plus_infty, minus_infty));
+  check ("real(catanh(+Inf - i Inf)) = 0", __real__ result, 0);
+  check ("imag(catanh(+Inf - i Inf)) = -pi/2", __imag__ result, -M_PI_2);
+  result = FUNC(catanh) (BUILD_COMPLEX (minus_infty, plus_infty));
+  check ("real(catanh(-Inf + i Inf)) = -0", __real__ result, minus_zero);
+  check ("imag(catanh(-Inf + i Inf)) = pi/2", __imag__ result, M_PI_2);
+  result = FUNC(catanh) (BUILD_COMPLEX (minus_infty, minus_infty));
+  check ("real(catanh(-Inf - i Inf)) = -0", __real__ result, minus_zero);
+  check ("imag(catanh(-Inf - i Inf)) = -pi/2", __imag__ result, -M_PI_2);
+
+  result = FUNC(catanh) (BUILD_COMPLEX (-10.0, plus_infty));
+  check ("real(catanh(-10.0 + i Inf)) = -0", __real__ result, -minus_zero);
+  check ("imag(catanh(-10.0 + i Inf)) = pi/2", __imag__ result, M_PI_2);
+  result = FUNC(catanh) (BUILD_COMPLEX (-10.0, minus_infty));
+  check ("real(catanh(-10.0 - i Inf)) = -0", __real__ result, minus_infty);
+  check ("imag(catanh(-10.0 - i Inf)) = -pi/2", __imag__ result, -M_PI_2);
+  result = FUNC(catanh) (BUILD_COMPLEX (0, plus_infty));
+  check ("real(catanh(0 + i Inf)) = 0", __real__ result, 0);
+  check ("imag(catanh(0 + i Inf)) = pi/2", __imag__ result, M_PI_2);
+  result = FUNC(catanh) (BUILD_COMPLEX (0, minus_infty));
+  check ("real(catanh(0 - i Inf)) = 0", __real__ result, 0);
+  check ("imag(catanh(0 - i Inf)) = -pi/2", __imag__ result, -M_PI_2);
+  result = FUNC(catanh) (BUILD_COMPLEX (0.1, plus_infty));
+  check ("real(catanh(0.1 + i Inf)) = 0", __real__ result, 0);
+  check ("imag(catanh(0.1 + i Inf)) = pi/2", __imag__ result, M_PI_2);
+  result = FUNC(catanh) (BUILD_COMPLEX (0.1, minus_infty));
+  check ("real(catanh(0.1 - i Inf)) = 0", __real__ result, 0);
+  check ("imag(catanh(0.1 - i Inf)) = -pi/2", __imag__ result, -M_PI_2);
+
+  result = FUNC(catanh) (BUILD_COMPLEX (minus_infty, 0));
+  check ("real(catanh(-Inf + i0)) = -0", __real__ result, minus_zero);
+  check ("imag(catanh(-Inf + i0)) = pi/2", __imag__ result, M_PI_2);
+  result = FUNC(catanh) (BUILD_COMPLEX (minus_infty, minus_zero));
+  check ("real(catanh(-Inf - i0)) = -0", __real__ result, minus_zero);
+  check ("imag(catanh(-Inf - i0)) = -pi/2", __imag__ result, -M_PI_2);
+  result = FUNC(catanh) (BUILD_COMPLEX (minus_infty, 100));
+  check ("real(catanh(-Inf + i100)) = -0", __real__ result, minus_zero);
+  check ("imag(catanh(-Inf + i100)) = pi/2", __imag__ result, M_PI_2);
+  result = FUNC(catanh) (BUILD_COMPLEX (minus_infty, -100));
+  check ("real(catanh(-Inf - i100)) = -0", __real__ result, minus_zero);
+  check ("imag(catanh(-Inf - i100)) = -pi/2", __imag__ result, -M_PI_2);
+
+  result = FUNC(catanh) (BUILD_COMPLEX (plus_infty, 0));
+  check ("real(catanh(+Inf + i0)) = 0", __real__ result, 0);
+  check ("imag(catanh(+Inf + i0)) = pi/2", __imag__ result, M_PI_2);
+  result = FUNC(catanh) (BUILD_COMPLEX (plus_infty, minus_zero));
+  check ("real(catanh(+Inf - i0)) = 0", __real__ result, 0);
+  check ("imag(catanh(+Inf - i0)) = -pi/2", __imag__ result, -M_PI_2);
+  result = FUNC(catanh) (BUILD_COMPLEX (plus_infty, 0.5));
+  check ("real(catanh(+Inf + i0.5)) = 0", __real__ result, 0);
+  check ("imag(catanh(+Inf + i0.5)) = pi/2", __imag__ result, M_PI_2);
+  result = FUNC(catanh) (BUILD_COMPLEX (plus_infty, -0.5));
+  check ("real(catanh(+Inf - i0.5)) = 0", __real__ result, 0);
+  check ("imag(catanh(+Inf - i0.5)) = -pi/2", __imag__ result, -M_PI_2);
+
+  result = FUNC(catanh) (BUILD_COMPLEX (0, nan_value));
+  check ("real(catanh(0 + i NaN)) = 0", __real__ result, 0);
+  check_isnan ("imag(catanh(+Inf + i NaN)) = NaN", __imag__ result);
+  result = FUNC(catanh) (BUILD_COMPLEX (minus_zero, nan_value));
+  check ("real(catanh(-0 + i NaN)) = -0", __real__ result, minus_zero);
+  check_isnan ("imag(catanh(-Inf + i NaN)) = NaN", __imag__ result);
+
+  result = FUNC(catanh) (BUILD_COMPLEX (plus_infty, nan_value));
+  check ("real(catanh(+Inf + i NaN)) = 0", __real__ result, 0);
+  check_isnan ("imag(catanh(+Inf + i NaN)) = NaN", __imag__ result);
+  result = FUNC(catanh) (BUILD_COMPLEX (minus_infty, nan_value));
+  check ("real(catanh(-Inf + i NaN)) = -0", __real__ result, minus_zero);
+  check_isnan ("imag(catanh(-Inf + i NaN)) = NaN", __imag__ result);
+
+  result = FUNC(catanh) (BUILD_COMPLEX (nan_value, 0));
+  check_isnan ("real(catanh(NaN + i0)) = NaN", __real__ result);
+  check_isnan ("imag(catanh(NaN + i0)) = NaN", __imag__ resul);
+  result = FUNC(catanh) (BUILD_COMPLEX (minus_zero, nan_value));
+  check_isnan ("real(catanh(NaN - i0)) = NaN", __real__ result);
+  check_isnan ("imag(catanh(NaN - i0)) = NaN", __imag__ result);
+
+  result = FUNC(catanh) (BUILD_COMPLEX (nan_value, plus_infty));
+  check ("real(catanh(NaN + i Inf)) = +-0", FUNC(fabs) (__real__ result), 0);
+  check ("imag(catanh(NaN + i Inf)) = pi/2", __imag__ result, M_PI_2);
+  result = FUNC(catanh) (BUILD_COMPLEX (nan_value, minus_infty));
+  check ("real(catanh(NaN - i Inf)) = +-0", FUNC(fabs) (__real__ result), 0);
+  check ("imag(catanh(NaN - i Inf)) = -pi/2", __imag__ result, -M_PI_2);
+
+  result = FUNC(catanh) (BUILD_COMPLEX (10.5, nan_value));
+  check_isnan ("real(catanh(10.5 + i NaN)) = NaN", __real__ result);
+  check_isnan ("imag(catanh(10.5 + i NaN)) = NaN", __imag__ result);
+  result = FUNC(catanh) (BUILD_COMPLEX (-10.5, nan_value));
+  check_isnan ("real(catanh(-10.5 + i NaN)) = NaN", __real__ result);
+  check_isnan ("imag(catanh(-10.5 + i NaN)) = NaN", __imag__ result);
+
+  result = FUNC(catanh) (BUILD_COMPLEX (nan_value, 0.75));
+  check_isnan ("real(catanh(NaN + i0.75)) = NaN", __real__ result);
+  check_isnan ("imag(catanh(NaN + i0.75)) = NaN", __imag__ result);
+  result = FUNC(catanh) (BUILD_COMPLEX (-10.5, nan_value));
+  check_isnan ("real(catanh(NaN - i0.75)) = NaN", __real__ result);
+  check_isnan ("imag(catanh(NaN - i0.75)) = NaN", __imag__ result);
+
+  result = FUNC(catanh) (BUILD_COMPLEX (nan_value, nan_value));
+  check_isnan ("real(catanh(NaN + i NaN)) = NaN", __real__ result);
+  check_isnan ("imag(catanh(NaN + i NaN)) = NaN", __imag__ result);
+}
+#endif
+
+
+static void
 inverse_func_pair_test (const char *test_name,
 			mathfunc f1, mathfunc inverse,
 			MATHTYPE x, MATHTYPE epsilon)
@@ -1943,6 +2697,8 @@ main (int argc, char *argv[])
   remquo_test ();
 #endif
   cexp_test ();
+  csinh_test ();
+  ccosh_test ();
 
   identities ();
   inverse_functions ();
diff --git a/misc/Makefile b/misc/Makefile
index b789659eaa..e2db14daa0 100644
--- a/misc/Makefile
+++ b/misc/Makefile
@@ -64,7 +64,7 @@ install-lib := libbsd-compat.a libg.a
 non-lib.a := libbsd-compat.a
 gpl2lgpl := error.c error.h
 
-tests := tst-dirname
+tests := tst-dirname tst-tsearch
 
 include ../Rules
 
@@ -77,3 +77,9 @@ $(objpfx)libg.a: $(dep-dummy-lib); $(make-dummy-lib)
 
 
 CFLAGS-init-misc.c = -fkeep-inline-functions
+
+ifeq ($(build-shared),yes)
+$(objpfx)tst-tsearch: $(common-objpfx)math/libm.so$(libm.so-version)
+else
+$(objpfx)tst-tsearch: $(common-objpfx)math/libm.a
+endif
diff --git a/misc/tsearch.c b/misc/tsearch.c
index 6af6536a72..466536bf34 100644
--- a/misc/tsearch.c
+++ b/misc/tsearch.c
@@ -1,5 +1,6 @@
-/* Copyright (C) 1995, 1996 Free Software Foundation, Inc.
+/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
+   Contributed by Bernd Schmidt <crux@Pool.Informatik.RWTH-Aachen.DE>, 1997.
 
    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
@@ -16,175 +17,584 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-/* Tree search generalized from Knuth (6.2.2) Algorithm T just like
-   the AT&T man page says.
-
-   The node_t structure is for internal use only, lint doesn't grok it.
-
-   Written by reading the System V Interface Definition, not the code.
+/* Tree search for red/black trees.
+   The algorithm for adding nodes is taken from one of the many "Algorithms"
+   books by Robert Sedgewick, although the implementation differs.
+   The algorithm for deleting nodes can probably be found in a book named
+   "Introduction to Algorithms" by Cormen/Leiserson/Rivest.  At least that's
+   the book that my professor took most algorithms from during the "Data
+   Structures" course...
 
    Totally public domain.  */
-/*LINTLIBRARY*/
+
+/* Red/black trees are binary trees in which the edges are colored either red
+   or black.  They have the following properties:
+   1. The number of black edges on every path from the root to a leaf is
+      constant.
+   2. No two red edges are adjacent.
+   Therefore there is an upper bound on the length of every path, it's
+   O(log n) where n is the number of nodes in the tree.  No path can be longer
+   than 1+2*P where P is the length of the shortest path in the tree.
+   Useful for the implementation:
+   3. If one of the children of a node is NULL, then the other one is red
+      (if it exists).
+
+   In the implementation, not the edges are colored, but the nodes.  The color
+   interpreted as the color of the edge leading to this node.  The color is
+   meaningless for the root node, but we color the root node black for
+   convenience.  All added nodes are red initially.
+
+   Adding to a red/black tree is rather easy.  The right place is searched
+   with a usual binary tree search.  Additionally, whenever a node N is
+   reached that has two red successors, the successors are colored black and
+   the node itself colored red.  This moves red edges up the tree where they
+   pose less of a problem once we get to really insert the new node.  Changing
+   N's color to red may violate rule 2, however, so rotations may become
+   necessary to restore the invariants.  Adding a new red leaf may violate
+   the same rule, so afterwards an additional check is run and the tree
+   possibly rotated.
+
+   Deleting is hairy.  There are mainly two nodes involved: the node to be
+   deleted (n1), and another node that is to be unchained from the tree (n2).
+   If n1 has a successor (the node with a smallest key that is larger than
+   n1), then the successor becomes n2 and its contents are copied into n1,
+   otherwise n1 becomes n2.
+   Unchaining a node may violate rule 1: if n2 is black, one subtree is
+   missing one black edge afterwards.  The algorithm must try to move this
+   error upwards towards the root, so that the subtree that does not have
+   enough black edges becomes the whole tree.  Once that happens, the error
+   has disappeared.  It may not be necessary to go all the way up, since it
+   is possible that rotations and recoloring can fix the error before that.
+
+   Although the deletion algorithm must walk upwards through the tree, we
+   do not store parent pointers in the nodes.  Instead, delete allocates a
+   small array of parent pointers and fills it while descending the tree.
+   Since we know that the length of a path is O(log n), where n is the number
+   of nodes, this is likely to use less memory.  */
+
+/* Tree rotations look like this:
+      A                C
+     / \              / \
+    B   C            A   G
+   / \ / \  -->     / \
+   D E F G         B   F
+                  / \
+                 D   E
+
+   In this case, A has been rotated left.  This preserves the ordering of the
+   binary tree.  */
 
 #include <stdlib.h>
 #include <search.h>
 
-/* This routine is not very bad.  It makes many assumptions about
-   the compiler. It assumes that the first field in the node must be
-   the "key" field, which points to the datum. It is very tricky
-   stuff. H.J.  */
-
 typedef struct node_t
 {
+  /* Callers expect this to be the first element in the structure - do not
+     move!  */
   const void *key;
   struct node_t *left;
   struct node_t *right;
+  unsigned int red:1;
+} *node;
+
+#undef DEBUGGING
+
+#ifdef DEBUGGING
+
+/* Routines to check tree invariants.  */
+
+#include <assert.h>
+
+#define CHECK_TREE(a) check_tree(a)
+
+static void
+check_tree_recurse (node p, int d_sofar, int d_total)
+{
+  if (p == NULL)
+    {
+      assert (d_sofar == d_total);
+      return;
+    }
+
+  check_tree_recurse (p->left, d_sofar + (p->left && !p->left->red), d_total);
+  check_tree_recurse (p->right, d_sofar + (p->right && !p->right->red), d_total);
+  if (p->left)
+    assert (!(p->left->red && p->red));
+  if (p->right)
+    assert (!(p->right->red && p->red));
+}
+
+static void
+check_tree (node root)
+{
+  int cnt = 0;
+  node p;
+  if (root == NULL)
+    return;
+  root->red = 0;
+  for(p = root->left; p; p = p->left)
+    cnt += !p->red;
+  check_tree_recurse (root, 0, cnt);
 }
-node;
 
-/* Prototype fpr local function.  */
-static void trecurse __P ((const void *vroot, __action_fn_t action, int level));
 
+#else
 
-/* find or insert datum into search tree.
-char 	*key;		 key to be located
-node	**rootp;	 address of tree root
-int	(*compar)();	 ordering function
-*/
+#define CHECK_TREE(a)
+
+#endif
+
+/* Possibly "split" a node with two red successors, and/or fix up two red
+   edges in a row.  ROOTP is a pointer to the lowest node we visited, PARENTP
+   and GPARENTP pointers to its parent/grandparent.  P_R and GP_R contain the
+   comparison values that determined which way was taken in the tree to reach
+   ROOTP.  MODE is 1 if we need not do the split, but must check for two red
+   edges between GPARENTP and ROOTP.  */
+static void
+maybe_split_for_insert (node *rootp, node *parentp, node *gparentp,
+			int p_r, int gp_r, int mode)
+{
+  node root = *rootp;
+  node *rp, *lp;
+  rp = &(*rootp)->right;
+  lp = &(*rootp)->left;
+
+  /* See if we have to split this node (both successors red).  */
+  if (mode == 1
+      || ((*rp) != NULL && (*lp) != NULL && (*rp)->red && (*lp)->red))
+    {
+      /* This node becomes red, its successors black.  */
+      root->red = 1;
+      if (*rp)
+	(*rp)->red = 0;
+      if (*lp)
+	(*lp)->red = 0;
+
+      /* If the parent of this node is also red, we have to do
+	 rotations.  */
+      if (parentp != NULL && (*parentp)->red)
+	{
+	  node gp = *gparentp;
+	  node p = *parentp;
+	  /* There are two main cases:
+	     1. The edge types (left or right) of the two red edges differ.
+	     2. Both red edges are of the same type.
+	     There exist two symmetries of each case, so there is a total of
+	     4 cases.  */
+	  if ((p_r > 0) != (gp_r > 0))
+	    {
+	      /* Put the child at the top of the tree, with its parent
+		 and grandparent as successors.  */
+	      p->red = 1;
+	      gp->red = 1;
+	      root->red = 0;
+	      if (p_r < 0)
+		{
+		  /* Child is left of parent.  */
+		  p->left = *rp;
+		  *rp = p;
+		  gp->right = *lp;
+		  *lp = gp;
+		}
+	      else
+		{
+		  /* Child is right of parent.  */
+		  p->right = *lp;
+		  *lp = p;
+		  gp->left = *rp;
+		  *rp = gp;
+		}
+	      *gparentp = root;
+	    }
+	  else
+	    {
+	      *gparentp = *parentp;
+	      /* Parent becomes the top of the tree, grandparent and
+		 child are its successors.  */
+	      p->red = 0;
+	      gp->red = 1;
+	      if (p_r < 0)
+		{
+		  /* Left edges.  */
+		  gp->left = p->right;
+		  p->right = gp;
+		}
+	      else
+		{
+		  /* Right edges.  */
+		  gp->right = p->left;
+		  p->left = gp;
+		}
+	    }
+	}
+    }
+}
+
+/* Find or insert datum into search tree.
+   KEY is the key to be located, ROOTP is the address of tree root,
+   COMPAR the ordering function.  */
 void *
-__tsearch (key, vrootp, compar)
-     const void *key;
-     void **vrootp;
-     __compar_fn_t compar;
+__tsearch (const void *key, void **vrootp, __compar_fn_t compar)
 {
-  node *q;
-  node **rootp = (node **) vrootp;
+  node q;
+  node *parentp = NULL, *gparentp = NULL;
+  node *rootp = (node *) vrootp;
+  node *nextp;
+  int r = 0, p_r = 0, gp_r = 0; /* No they might not, Mr Compiler.  */
 
   if (rootp == NULL)
     return NULL;
 
-  while (*rootp != NULL)		/* Knuth's T1: */
-    {
-      int r;
+  /* This saves some additional tests below.  */
+  if (*rootp != NULL)
+    (*rootp)->red = 0;
+
+  CHECK_TREE (*rootp);
 
-      r = (*compar) (key, (*rootp)->key);
-      if (r == 0)			/* T2: */
-	return *rootp;			/* we found it! */
-      rootp = (r < 0)
-	      ? &(*rootp)->left		/* T3: follow left branch */
-	      : &(*rootp)->right;	/* T4: follow right branch */
+  nextp = rootp;
+  while (*nextp != NULL)
+    {
+      node root = *rootp;
+      r = (*compar) (key, root->key);
+      if (r == 0)
+	return root;
+
+      maybe_split_for_insert (rootp, parentp, gparentp, p_r, gp_r, 0);
+      /* If that did any rotations, parentp and gparentp are now garbage.
+	 That doesn't matter, because the values they contain are never
+	 used again in that case.  */
+
+      nextp = r < 0 ? &root->left : &root->right;
+      if (*nextp == NULL)
+	break;
+
+      gparentp = parentp;
+      parentp = rootp;
+      rootp = nextp;
+
+      gp_r = p_r;
+      p_r = r;
     }
 
-  q = (node *) malloc (sizeof (node));	/* T5: key not found */
-  if (q != NULL)			/* make new node */
+  q = (struct node_t *) malloc (sizeof (struct node_t));
+  if (q != NULL)
     {
-      *rootp = q;			/* link new node to old */
+      *nextp = q;			/* link new node to old */
       q->key = key;			/* initialize new node */
+      q->red = 1;
       q->left = q->right = NULL;
     }
+  if (nextp != rootp)
+    /* There may be two red edges in a row now, which we must avoid by
+       rotating the tree.  */
+    maybe_split_for_insert (nextp, rootp, parentp, r, p_r, 1);
 
   return q;
 }
 weak_alias (__tsearch, tsearch)
 
 
+/* Find datum in search tree.
+   KEY is the key to be located, ROOTP is the address of tree root,
+   COMPAR the ordering function.  */
 void *
 __tfind (key, vrootp, compar)
      const void *key;
      const void **vrootp;
      __compar_fn_t compar;
 {
-  node **rootp = (node **) vrootp;
+  node *rootp = (node *) vrootp;
 
   if (rootp == NULL)
     return NULL;
 
-  while (*rootp != NULL)		/* Knuth's T1: */
+  CHECK_TREE (*rootp);
+
+  while (*rootp != NULL)
     {
+      node root = *rootp;
       int r;
 
-      r = (*compar)(key, (*rootp)->key);
-      if (r == 0)			/* T2: */
-	return *rootp;			/* we found it! */
+      r = (*compar) (key, root->key);
+      if (r == 0)
+	return root;
 
-      rootp = (r < 0)
-	      ? &(*rootp)->left		/* T3: follow left branch */
-	      : &(*rootp)->right;	/* T4: follow right branch */
+      rootp = r < 0 ? &root->left : &root->right;
     }
-    return NULL;
+  return NULL;
 }
 weak_alias (__tfind, tfind)
 
 
-/* delete node with given key
-char	*key;		key to be deleted
-node	**rootp;	address of the root of tree
-int	(*compar)();	comparison function
-*/
+/* Delete node with given key.
+   KEY is the key to be deleted, ROOTP is the address of the root of tree,
+   COMPAR the comparison function.  */
 void *
-__tdelete (key, vrootp, compar)
-     const void *key;
-     void **vrootp;
-     __compar_fn_t compar;
+__tdelete (const void *key, void **vrootp, __compar_fn_t compar)
 {
-  node *p;
-  node *q;
-  node *r;
+  node p, q, r, retval;
   int cmp;
-  node **rootp = (node **) vrootp;
+  node *rootp = (node *) vrootp;
+  node root, unchained;
+  /* Stack of nodes so we remember the parents without recursion.  It's
+     _very_ unlikely that there are paths longer than 40 nodes.  The tree
+     would need to have around 250.000 nodes.  */
+  int stacksize = 40;
+  int sp = 0;
+  node **nodestack = alloca (sizeof (node *) * stacksize);
 
-  if (rootp == NULL || (p = *rootp) == NULL)
+  if (rootp == NULL)
     return NULL;
+  p = *rootp;
+  if (p == NULL)
+    return NULL;
+
+  CHECK_TREE (p);
 
   while ((cmp = (*compar) (key, (*rootp)->key)) != 0)
     {
+      if (sp == stacksize)
+	{
+	  node **newstack;
+	  stacksize += 20;
+	  newstack = alloca (sizeof (node *) * stacksize);
+	  memcpy (newstack, nodestack, sp * sizeof (node *));
+	  nodestack = newstack;
+	}
+
+      nodestack[sp++] = rootp;
       p = *rootp;
-      rootp = (cmp < 0)
-	      ? &(*rootp)->left		/* follow left branch */
-	      : &(*rootp)->right;	/* follow right branch */
+      rootp = ((cmp < 0)
+	       ? &(*rootp)->left
+	       : &(*rootp)->right);
       if (*rootp == NULL)
-	return NULL;			/* key not found */
+	return NULL;
     }
 
-  r = (*rootp)->right;			/* D1: */
-  q = (*rootp)->left;
-  if (q == NULL)			/* Left NULL? */
-    q = r;
-  else if (r != NULL)			/* Right link is NULL? */
+  /* This is bogus if the node to be deleted is the root... this routine
+     really should return an integer with 0 for success, -1 for failure
+     and errno = ESRCH or something.  */
+  retval = p;
+
+  /* We don't unchain the node we want to delete. Instead, we overwrite
+     it with its successor and unchain the successor.  If there is no
+     successor, we really unchain the node to be deleted.  */
+
+  root = *rootp;
+
+  r = root->right;
+  q = root->left;
+
+  if (q == NULL || r == NULL)
+    unchained = root;
+  else
     {
-      if (r->left == NULL)		/* D2: Find successor */
+      node *parent = rootp, *up = &root->right;
+      for (;;)
 	{
-	  r->left = q;
-	  q = r;
+	  if (sp == stacksize)
+	    {
+	      node **newstack;
+	      stacksize += 20;
+	      newstack = alloca (sizeof (node *) * stacksize);
+	      memcpy (newstack, nodestack, sp * sizeof (node *));
+	      nodestack = newstack;
+	    }
+	  nodestack[sp++] = parent;
+	  parent = up;
+	  if ((*up)->left == NULL)
+	    break;
+	  up = &(*up)->left;
 	}
+      unchained = *up;
+    }
+
+  /* We know that either the left or right successor of UNCHAINED is NULL.
+     R becomes the other one, it is chained into the parent of UNCHAINED.  */
+  r = unchained->left;
+  if (r == NULL)
+    r = unchained->right;
+  if (sp == 0)
+    *rootp = r;
+  else
+    {
+      q = *nodestack[sp-1];
+      if (unchained == q->right)
+	q->right = r;
       else
-	{				/* D3: Find (struct node_t *)0 link */
-	  for (q = r->left; q->left != NULL; q = r->left)
-	    r = q;
-	  r->left = q->right;
-	  q->left = (*rootp)->left;
-	  q->right = (*rootp)->right;
+	q->left = r;
+    }
+
+  if (unchained != root)
+    root->key = unchained->key;
+  if (!unchained->red)
+    {
+      /* Now we lost a black edge, which means that the number of black
+	 edges on every path is no longer constant.  We must balance the
+	 tree.  */
+      /* NODESTACK now contains all parents of R.  R is likely to be NULL
+	 in the first iteration.  */
+      /* NULL nodes are considered black throughout - this is necessary for
+	 correctness.  */
+      while (sp > 0 && (r == NULL || !r->red))
+	{
+	  node *pp = nodestack[sp - 1];
+	  p = *pp;
+	  /* Two symmetric cases.  */
+	  if (r == p->left)
+	    {
+	      /* Q is R's brother, P is R's parent.  The subtree with root
+		 R has one black edge less than the subtree with root Q.  */
+	      q = p->right;
+	      if (q != NULL && q->red)
+		{
+		  /* If Q is red, we know that P is black. We rotate P left
+		     so that Q becomes the top node in the tree, with P below
+		     it.  P is colored red, Q is colored black.
+		     This action does not change the black edge count for any
+		     leaf in the tree, but we will be able to recognize one
+		     of the following situations, which all require that Q
+		     is black.  */
+		  q->red = 0;
+		  p->red = 1;
+		  /* Left rotate p.  */
+		  p->right = q->left;
+		  q->left = p;
+		  *pp = q;
+		  /* Make sure pp is right if the case below tries to use
+		     it.  */
+		  nodestack[sp++] = pp = &q->left;
+		  q = p->right;
+		}
+	      /* We know that Q can't be NULL here.  We also know that Q is
+		 black.  */
+	      if ((q->left == NULL || !q->left->red)
+		  && (q->right == NULL || !q->right->red))
+		{
+		  /* Q has two black successors.  We can simply color Q red.
+		     The whole subtree with root P is now missing one black
+		     edge.  Note that this action can temporarily make the
+		     tree invalid (if P is red).  But we will exit the loop
+		     in that case and set P black, which both makes the tree
+		     valid and also makes the black edge count come out
+		     right.  If P is black, we are at least one step closer
+		     to the root and we'll try again the next iteration.  */
+		  q->red = 1;
+		  r = p;
+		}
+	      else
+		{
+		  /* Q is black, one of Q's successors is red.  We can
+		     repair the tree with one operation and will exit the
+		     loop afterwards.  */
+		  if (q->right == NULL || !q->right->red)
+		    {
+		      /* The left one is red.  We perform the same action as
+			 in maybe_split_for_insert where two red edges are
+			 adjacent but point in different directions:
+			 Q's left successor (let's call it Q2) becomes the
+			 top of the subtree we are looking at, its parent (Q)
+			 and grandparent (P) become its successors. The former
+			 successors of Q2 are placed below P and Q.
+			 P becomes black, and Q2 gets the color that P had.
+			 This changes the black edge count only for node R and
+			 its successors.  */
+		      node q2 = q->left;
+		      q2->red = p->red;
+		      p->right = q2->left;
+		      q->left = q2->right;
+		      q2->right = q;
+		      q2->left = p;
+		      *pp = q2;
+		      p->red = 0;
+		    }
+		  else
+		    {
+		      /* It's the right one.  Rotate P left. P becomes black,
+			 and Q gets the color that P had.  Q's right successor
+			 also becomes black.  This changes the black edge
+			 count only for node R and its successors.  */
+		      q->red = p->red;
+		      p->red = 0;
+
+		      q->right->red = 0;
+
+		      /* left rotate p */
+		      p->right = q->left;
+		      q->left = p;
+		      *pp = q;
+		    }
+
+		  /* We're done.  */
+		  sp = 1;
+		  r = NULL;
+		}
+	    }
+	  else
+	    {
+	      /* Comments: see above.  */
+	      q = p->left;
+	      if (q != NULL && q->red)
+		{
+		  q->red = 0;
+		  p->red = 1;
+		  p->left = q->right;
+		  q->right = p;
+		  *pp = q;
+		  nodestack[sp++] = pp = &q->right;
+		  q = p->left;
+		}
+	      if ((q->right == NULL || !q->right->red)
+		       && (q->left == NULL || !q->left->red))
+		{
+		  q->red = 1;
+		  r = p;
+		}
+	      else
+		{
+		  if (q->left == NULL || !q->left->red)
+		    {
+		      node q2 = q->right;
+		      q2->red = p->red;
+		      p->left = q2->right;
+		      q->right = q2->left;
+		      q2->left = q;
+		      q2->right = p;
+		      *pp = q2;
+		      p->red = 0;
+		    }
+		  else
+		    {
+		      q->red = p->red;
+		      p->red = 0;
+		      q->left->red = 0;
+		      p->left = q->right;
+		      q->right = p;
+		      *pp = q;
+		    }
+		  sp = 1;
+		  r = NULL;
+		}
+	    }
+	  --sp;
 	}
+      if (r != NULL)
+	r->red = 0;
     }
-  free ((struct node_t *) *rootp);	/* D4: Free node */
-  *rootp = q;				/* link parent to new node */
-  return p;
+
+  free (unchained);
+  return retval;
 }
 weak_alias (__tdelete, tdelete)
 
 
-/* Walk the nodes of a tree
-node	*root;		Root of the tree to be walked
-void	(*action)();	Function to be called at each node
-int	level;
-*/
+/* Walk the nodes of a tree.
+   ROOT is the root of the tree to be walked, ACTION the function to be
+   called at each node.  LEVEL is the level of ROOT in the whole tree.  */
 static void
-trecurse (vroot, action, level)
-     const void *vroot;
-     __action_fn_t action;
-     int level;
+trecurse (const void *vroot, __action_fn_t action, int level)
 {
-  node *root = (node *) vroot;
+  node root = (node ) vroot;
 
   if (root->left == NULL && root->right == NULL)
     (*action) (root, leaf, level);
@@ -201,17 +611,15 @@ trecurse (vroot, action, level)
 }
 
 
-/* void twalk(root, action)	Walk the nodes of a tree
-node	*root;			Root of the tree to be walked
-void	(*action)();		Function to be called at each node
-PTR
-*/
+/* Walk the nodes of a tree.
+   ROOT is the root of the tree to be walked, ACTION the function to be
+   called at each node.  */
 void
-__twalk (vroot, action)
-     const void *vroot;
-     __action_fn_t action;
+__twalk (const void *vroot, __action_fn_t action)
 {
-  const node *root = (node *) vroot;
+  const node root = (node) vroot;
+
+  CHECK_TREE (root);
 
   if (root != NULL && action != NULL)
     trecurse (root, action, 0);
diff --git a/misc/tst-tsearch.c b/misc/tst-tsearch.c
new file mode 100644
index 0000000000..eca11cbb95
--- /dev/null
+++ b/misc/tst-tsearch.c
@@ -0,0 +1,329 @@
+/* Test program for tsearch et al.
+   Copyright (C) 1997 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., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#define _GNU_SOURCE	1
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <search.h>
+
+#define SEED 0
+#define BALANCED 1
+#define PASSES 100
+
+#if BALANCED
+#include <math.h>
+#define SIZE 1000
+#else
+#define SIZE 100
+#endif
+
+enum order
+{
+  ascending,
+  descending,
+  randomorder
+};
+
+enum action
+{
+  build,
+  build_and_del,
+  delete,
+  find
+};
+
+/* Set to 1 if a test is flunked.  */
+static int error = 0;
+
+/* The keys we add to the tree.  */
+static int x[SIZE];
+
+/* Pointers into the key array, possibly permutated, to define an order
+   for insertion/removal.  */
+static int y[SIZE];
+
+/* Flags set for each element visited during a tree walk.  */
+static int z[SIZE];
+
+/* Depths for all the elements, to check that the depth is constant for
+   all three visits.  */
+static int depths[SIZE];
+
+/* Maximum depth during a tree walk.  */
+static int max_depth;
+
+/* Compare two keys.  */
+static int
+cmp_fn (const void *a, const void *b)
+{
+  return *(const int *) a - *(const int *) b;
+}
+
+/* Permute an array of integers.  */
+static void
+memfry (int *string)
+{
+  int i;
+
+  for (i = 0; i < SIZE; ++i)
+    {
+      int32_t j;
+      int c;
+
+      j = random () % SIZE;
+
+      c = string[i];
+      string[i] = string[j];
+      string[j] = c;
+    }
+}
+
+static void
+walk_action (const void *nodep, const VISIT which, const int depth)
+{
+  int key = **(int **) nodep;
+
+  if (depth > max_depth)
+    max_depth = depth;
+  if (which == leaf || which == preorder)
+    {
+      ++z[key];
+      depths[key] = depth;
+    }
+  else
+    {
+      if (depths[key] != depth)
+	{
+	  fputs ("Depth for one element is not constant during tree walk.\n",
+		 stderr);
+	}
+    }
+}
+
+static void
+walk_tree (void *root, int expected_count)
+{
+  int i;
+
+  memset (z, 0, sizeof z);
+  max_depth = 0;
+
+  twalk (root, walk_action);
+  for (i = 0; i < expected_count; ++i)
+    if (z[i] != 1)
+      {
+	fputs ("Node was not visited.\n", stderr);
+	error = 1;
+      }
+
+#if BALANCED
+  if (max_depth > log (expected_count) * 2 + 2)
+#else
+  if (max_depth > expected_count)
+#endif
+    {
+      fputs ("Depth too large during tree walk.\n", stderr);
+      error = 1;
+    }
+}
+
+/* Perform an operation on a tree.  */
+static void
+mangle_tree (enum order how, enum action what, void **root, int lag)
+{
+  int i;
+
+  if (how == randomorder)
+    {
+      for (i = 0; i < SIZE; ++i)
+	y[i] = i;
+      memfry (y);
+    }
+
+  for (i = 0; i < SIZE + lag; ++i)
+    {
+      void *elem;
+      int j, k;
+
+      switch (how)
+	{
+	case randomorder:
+	  if (i >= lag)
+	    k = y[i - lag];
+	  else
+	    k = y[SIZE - i - 1 + lag];
+	  j = y[i];
+	  break;
+
+	case ascending:
+	  k = i - lag;
+	  j = i;
+	  break;
+
+	case descending:
+	  k = SIZE - i - 1 + lag;
+	  j = SIZE - i - 1;
+	  break;
+
+	default:
+	  /* This never should happen, but gcc isn't smart enough to
+	     recognize it.  */
+	  abort ();
+	}
+
+      switch (what)
+	{
+	case build_and_del:
+	case build:
+	  if (i < SIZE)
+	    {
+	      if (tfind (x + j, (const void **) root, cmp_fn) != NULL)
+		{
+		  fputs ("Found element which is not in tree yet.\n", stderr);
+		  error = 1;
+		}
+	      elem = tsearch (x + j, root, cmp_fn);
+	      if (elem == 0
+		  || tfind (x + j, (const void **) root, cmp_fn) == NULL)
+		{
+		  fputs ("Couldn't find element after it was added.\n",
+			 stderr);
+		  error = 1;
+		}
+	    }
+
+	  if (what == build || i < lag)
+	    break;
+
+	  j = k;
+	  /* fall through */
+
+	case delete:
+	  elem = tfind (x + j, (const void **) root, cmp_fn);
+	  if (elem == NULL || tdelete (x + j, root, cmp_fn) == NULL)
+	    {
+	      fputs ("Error deleting element.\n", stderr);
+	      error = 1;
+	    }
+	  break;
+
+	case find:
+	  if (tfind (x + j, (const void **) root, cmp_fn) == NULL)
+	    {
+	      fputs ("Couldn't find element after it was added.\n", stderr);
+	      error = 1;
+	    }
+	  break;
+
+	}
+    }
+}
+
+
+int
+main (int argc, char **argv)
+{
+  int total_error = 0;
+  static int state[8] = { 1, 2, 3, 4, 5, 6, 7, 8 };
+  void *root = NULL;
+  int i, j;
+
+  initstate (SEED, state, 8);
+
+  for (i = 0; i < SIZE; ++i)
+    x[i] = i;
+
+  /* Do this loop several times to get different permutations for the
+     random case.  */
+  fputs ("Series I\n", stderr);
+  for (i = 0; i < PASSES; ++i)
+    {
+      fprintf (stderr, "Pass %d... ", i + 1);
+      fflush (stdout);
+      error = 0;
+
+      mangle_tree (ascending, build, &root, 0);
+      mangle_tree (ascending, find, &root, 0);
+      mangle_tree (descending, find, &root, 0);
+      mangle_tree (randomorder, find, &root, 0);
+      walk_tree (root, SIZE);
+      mangle_tree (ascending, delete, &root, 0);
+
+      mangle_tree (ascending, build, &root, 0);
+      walk_tree (root, SIZE);
+      mangle_tree (descending, delete, &root, 0);
+
+      mangle_tree (ascending, build, &root, 0);
+      walk_tree (root, SIZE);
+      mangle_tree (randomorder, delete, &root, 0);
+
+      mangle_tree (descending, build, &root, 0);
+      mangle_tree (ascending, find, &root, 0);
+      mangle_tree (descending, find, &root, 0);
+      mangle_tree (randomorder, find, &root, 0);
+      walk_tree (root, SIZE);
+      mangle_tree (descending, delete, &root, 0);
+
+      mangle_tree (descending, build, &root, 0);
+      walk_tree (root, SIZE);
+      mangle_tree (descending, delete, &root, 0);
+
+      mangle_tree (descending, build, &root, 0);
+      walk_tree (root, SIZE);
+      mangle_tree (randomorder, delete, &root, 0);
+
+      mangle_tree (randomorder, build, &root, 0);
+      mangle_tree (ascending, find, &root, 0);
+      mangle_tree (descending, find, &root, 0);
+      mangle_tree (randomorder, find, &root, 0);
+      walk_tree (root, SIZE);
+      mangle_tree (randomorder, delete, &root, 0);
+
+      for (j = 1; j < SIZE; j *= 2)
+	{
+	  mangle_tree (randomorder, build_and_del, &root, j);
+	}
+
+      fputs (error ? " failed!\n" : " ok.\n", stderr);
+      total_error |= error;
+    }
+
+  fputs ("Series II\n", stderr);
+  for (i = 1; i < SIZE; i *= 2)
+    {
+      fprintf (stderr, "For size %d... ", i);
+      fflush (stdout);
+      error = 0;
+
+      mangle_tree (ascending, build_and_del, &root, i);
+      mangle_tree (descending, build_and_del, &root, i);
+      mangle_tree (ascending, build_and_del, &root, i);
+      mangle_tree (descending, build_and_del, &root, i);
+      mangle_tree (ascending, build_and_del, &root, i);
+      mangle_tree (descending, build_and_del, &root, i);
+      mangle_tree (ascending, build_and_del, &root, i);
+      mangle_tree (descending, build_and_del, &root, i);
+
+      fputs (error ? " failed!\n" : " ok.\n", stderr);
+      total_error |= error;
+    }
+
+  return total_error;
+}
diff --git a/nss/nsswitch.c b/nss/nsswitch.c
index 5bcacf296d..f36fe9607d 100644
--- a/nss/nsswitch.c
+++ b/nss/nsswitch.c
@@ -241,13 +241,13 @@ __nss_configure_lookup (const char *dbname, const char *service_line)
 
 
 static int
-nss_dlerror_run (void (*operate) (void))
+nss_dlerror_run (void (*operate) (void *), void *args)
 {
   char *last_errstring = NULL;
   const char *last_object_name = NULL;
   int result;
 
-  (void) _dl_catch_error (&last_errstring, &last_object_name, operate);
+  (void) _dl_catch_error (&last_errstring, &last_object_name, operate, args);
 
   result = last_errstring != NULL;
   if (result)
@@ -257,6 +257,42 @@ nss_dlerror_run (void (*operate) (void))
 }
 
 
+struct do_open_args
+{
+  /* Argument to do_open.  */
+  char *shlib_name;
+  service_user *ni;
+};
+
+struct get_sym_args
+{
+  /* Arguments to get_sym.  */
+  struct link_map *map;
+  char *name;
+
+  /* Return values of get_sym.  */
+  ElfW(Addr) loadbase;
+  const ElfW(Sym) *ref;
+};
+
+static void
+do_open (void *a)
+{
+  struct do_open_args *args = (struct do_open_args *) a;
+  /* Open and relocate the shared object.  */
+  args->ni->library->lib_handle = _dl_open (args->shlib_name, RTLD_LAZY);
+}
+
+static void
+get_sym (void *a)
+{
+  struct get_sym_args *args = (struct get_sym_args *) a;
+  struct link_map *scope[2] = { args->map, NULL };
+  args->ref = NULL;
+  args->loadbase = _dl_lookup_symbol (args->name, &args->ref,
+				      scope, args->map->l_name, 0);
+}
+
 /* Comparison function for searching NI->known tree.  */
 static int
 known_compare (const void *p1, const void *p2)
@@ -332,21 +368,19 @@ nss_lookup_function (service_user *ni, const char *fct_name)
 	      /* Load the shared library.  */
 	      size_t shlen = (7 + strlen (ni->library->name) + 3
 			      + strlen (__nss_shlib_revision) + 1);
-	      char shlib_name[shlen];
 
-	      void do_open (void)
-		{
-		  /* Open and relocate the shared object.  */
-		  ni->library->lib_handle = _dl_open (shlib_name, RTLD_LAZY);
-		}
+	      struct do_open_args args;
+	      args.shlib_name = __alloca (shlen);
+	      args.ni = ni;
 
 	      /* Construct shared object name.  */
-	      __stpcpy (__stpcpy (__stpcpy (__stpcpy (shlib_name, "libnss_"),
+	      __stpcpy (__stpcpy (__stpcpy (__stpcpy (args.shlib_name,
+						      "libnss_"),
 					    ni->library->name),
 				  ".so"),
 			__nss_shlib_revision);
 
-	      if (nss_dlerror_run (do_open) != 0)
+	      if (nss_dlerror_run (do_open, &args) != 0)
 		/* Failed to load the library.  */
 		ni->library->lib_handle = (void *) -1l;
 	    }
@@ -359,26 +393,19 @@ nss_lookup_function (service_user *ni, const char *fct_name)
 	      /* Get the desired function.  Again,  GNU ld.so magic ahead.  */
 	      size_t namlen = (5 + strlen (ni->library->name) + 1
 			       + strlen (fct_name) + 1);
-	      char name[namlen];
-	      struct link_map *map = ni->library->lib_handle;
-	      ElfW(Addr) loadbase;
-	      const ElfW(Sym) *ref = NULL;
-	      void get_sym (void)
-		{
-		  struct link_map *scope[2] = { map, NULL };
-		  loadbase = _dl_lookup_symbol (name, &ref,
-						scope, map->l_name, 0);
-		}
+	      struct get_sym_args args;
+	      args.name = __alloca (namlen);
+	      args.map = ni->library->lib_handle;
 
 	      /* Construct the function name.  */
-	      __stpcpy (__stpcpy (__stpcpy (__stpcpy (name, "_nss_"),
+	      __stpcpy (__stpcpy (__stpcpy (__stpcpy (args.name, "_nss_"),
 					    ni->library->name),
 				  "_"),
 			fct_name);
 
 	      /* Look up the symbol.  */
-	      result = (nss_dlerror_run (get_sym)
-			? NULL : (void *) (loadbase + ref->st_value));
+	      result = (nss_dlerror_run (get_sym, &args) ? NULL
+			: (void *) (args.loadbase + args.ref->st_value));
 	    }
 
 	  /* Remember function pointer for later calls.  Even if null, we
diff --git a/po/libc.pot b/po/libc.pot
index dfaea8a48b..4ad9360e52 100644
--- a/po/libc.pot
+++ b/po/libc.pot
@@ -5,8 +5,8 @@
 #, fuzzy
 msgid ""
 msgstr ""
-"Project-Id-Version: libc 2.0.1\n"
-"POT-Creation-Date: 1997-02-04 16:58+0100\n"
+"Project-Id-Version: libc 2.0.90\n"
+"POT-Creation-Date: 1997-03-27 03:03+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+DIST\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -14,51 +14,128 @@ msgstr ""
 "Content-Type: text/plain; charset=CHARSET\n"
 "Content-Transfer-Encoding: ENCODING\n"
 
-#: sunrpc/rpcinfo.c:612
+#: nis/nis_print.c:210
+msgid "\t\tAccess Rights : "
+msgstr ""
+
+#: nis/nis_print.c:208
+#, c-format
+msgid "\t\tAttributes    : %s\n"
+msgstr ""
+
+#: nis/nis_print.c:229
+#, c-format
+msgid "\tEntry data of type %s\n"
+msgstr ""
+
+#: nis/nis_print.c:115
+#, c-format
+msgid "\tName       : %s\n"
+msgstr ""
+
+#: nis/nis_print.c:116
+msgid "\tPublic Key : "
+msgstr ""
+
+#: nis/nis_print.c:142
+#, c-format
+msgid "\tUniversal addresses (%u)\n"
+msgstr ""
+
+#: nis/nis_print.c:206
+#, c-format
+msgid "\t[%d]\tName          : %s\n"
+msgstr ""
+
+#: nis/nis_print.c:232
+#, c-format
+msgid "\t[%u] - [%u bytes] "
+msgstr ""
+
+#: nis/nis_print.c:174
+#, c-format
+msgid ""
+"\n"
+"Direct Type : %d\n"
+msgstr ""
+
+#: nis/nis_print.c:188
+msgid ""
+"\n"
+"Group Members :\n"
+msgstr ""
+
+#: nis/nis_print.c:252
+#, c-format
+msgid ""
+"\n"
+"Time to Live  : %lu (seconds)\n"
+msgstr ""
+
+#: sunrpc/rpcinfo.c:680
 msgid "       rpcinfo -b prognum versnum\n"
 msgstr ""
 
-#: sunrpc/rpcinfo.c:613
+#: sunrpc/rpcinfo.c:681
 msgid "       rpcinfo -d prognum versnum\n"
 msgstr ""
 
-#: sunrpc/rpcinfo.c:611
+#: sunrpc/rpcinfo.c:679
 msgid "       rpcinfo -p [ host ]\n"
 msgstr ""
 
-#: sunrpc/rpcinfo.c:610
+#: sunrpc/rpcinfo.c:678
 msgid "       rpcinfo [ -n portnum ] -t host prognum [ versnum ]\n"
 msgstr ""
 
-#: sunrpc/rpcinfo.c:517
+#: nis/nis_print.c:286
+#, c-format
+msgid "    Data Length = %u\n"
+msgstr ""
+
+#: sunrpc/rpcinfo.c:577
 msgid "   program vers proto   port\n"
 msgstr ""
 
-#: time/zic.c:425
+#: time/zic.c:419
 #, c-format
 msgid " (rule from \"%s\", line %d)"
 msgstr ""
 
-#: locale/programs/ld-collate.c:360 locale/programs/ld-ctype.c:1235
+#: argp/argp-help.c:1511
+msgid " [OPTION...]"
+msgstr ""
+
+#: locale/programs/ld-collate.c:363 locale/programs/ld-ctype.c:1242
 msgid " done\n"
 msgstr ""
 
-#: time/zic.c:422
+#: time/zic.c:416
 #, c-format
 msgid "\"%s\", line %d: %s"
 msgstr ""
 
-#: time/zic.c:949
+#: time/zic.c:943
 #, c-format
 msgid "\"Zone %s\" line and -l option are mutually exclusive"
 msgstr ""
 
-#: time/zic.c:957
+#: time/zic.c:951
 #, c-format
 msgid "\"Zone %s\" line and -p option are mutually exclusive"
 msgstr ""
 
-#: time/zic.c:760
+#: argp/argp-help.c:183
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+msgstr ""
+
+#: argp/argp-help.c:191
+#, c-format
+msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+msgstr ""
+
+#: time/zic.c:754
 #, c-format
 msgid "%s in ruleless zone"
 msgstr ""
@@ -78,7 +155,7 @@ msgstr ""
 msgid "%s%sUnknown signal %d\n"
 msgstr ""
 
-#: time/zic.c:2155
+#: time/zic.c:2172
 #, c-format
 msgid "%s: %d did not sign extend correctly\n"
 msgstr ""
@@ -88,142 +165,147 @@ msgstr ""
 msgid "%s: <mb_cur_max> must be greater than <mb_cur_min>\n"
 msgstr ""
 
-#: time/zic.c:1445
+#: time/zic.c:1443
 #, c-format
 msgid "%s: Can't create %s: %s\n"
 msgstr ""
 
-#: time/zic.c:2134
+#: time/zic.c:2150
 #, c-format
 msgid "%s: Can't create directory %s: %s\n"
 msgstr ""
 
-#: time/zic.c:614
+#: time/zic.c:608
 #, c-format
 msgid "%s: Can't link from %s to %s: %s\n"
 msgstr ""
 
-#: time/zic.c:786
+#: time/zic.c:780
 #, c-format
 msgid "%s: Can't open %s: %s\n"
 msgstr ""
 
-#: time/zic.c:1435
+#: time/zic.c:1433
 #, c-format
 msgid "%s: Can't remove %s: %s\n"
 msgstr ""
 
-#: time/zic.c:855
+#: time/zic.c:849
 #, c-format
 msgid "%s: Error closing %s: %s\n"
 msgstr ""
 
-#: time/zic.c:848
+#: time/zic.c:842
 #, c-format
 msgid "%s: Error reading %s\n"
 msgstr ""
 
-#: time/zic.c:1509
+#: time/zic.c:1507
 #, c-format
 msgid "%s: Error writing %s\n"
 msgstr ""
 
-#: time/zdump.c:258
+#: time/zdump.c:266
 #, c-format
 msgid "%s: Error writing standard output "
 msgstr ""
 
-#: time/zic.c:833
+#: time/zic.c:827
 #, c-format
 msgid "%s: Leap line in non leap seconds file %s\n"
 msgstr ""
 
-#: time/zic.c:363
+#: time/zic.c:357
 #, c-format
 msgid "%s: Memory exhausted: %s\n"
 msgstr ""
 
-#: time/zic.c:528
+#: time/zic.c:522
 #, c-format
 msgid "%s: More than one -L option specified\n"
 msgstr ""
 
-#: time/zic.c:488
+#: time/zic.c:482
 #, c-format
 msgid "%s: More than one -d option specified\n"
 msgstr ""
 
-#: time/zic.c:498
+#: time/zic.c:492
 #, c-format
 msgid "%s: More than one -l option specified\n"
 msgstr ""
 
-#: time/zic.c:508
+#: time/zic.c:502
 #, c-format
 msgid "%s: More than one -p option specified\n"
 msgstr ""
 
-#: time/zic.c:518
+#: time/zic.c:512
 #, c-format
 msgid "%s: More than one -y option specified\n"
 msgstr ""
 
-#: time/zic.c:1860
+#: argp/argp-parse.c:628
+#, c-format
+msgid "%s: Too many arguments\n"
+msgstr ""
+
+#: time/zic.c:1872
 #, c-format
 msgid "%s: command was '%s', result was %d\n"
 msgstr ""
 
-#: locale/programs/charmap.c:593 locale/programs/locfile.c:878
+#: locale/programs/charmap.c:593 locale/programs/locfile.c:900
 #, c-format
 msgid "%s: error in state machine"
 msgstr ""
 
-#: posix/getopt.c:788
+#: posix/getopt.c:785
 #, c-format
 msgid "%s: illegal option -- %c\n"
 msgstr ""
 
-#: posix/getopt.c:791
+#: posix/getopt.c:788
 #, c-format
 msgid "%s: invalid option -- %c\n"
 msgstr ""
 
-#: posix/getopt.c:712
+#: posix/getopt.c:709
 #, c-format
 msgid "%s: option `%c%s' doesn't allow an argument\n"
 msgstr ""
 
-#: posix/getopt.c:683
+#: posix/getopt.c:680
 #, c-format
 msgid "%s: option `%s' is ambiguous\n"
 msgstr ""
 
-#: posix/getopt.c:729 posix/getopt.c:902
+#: posix/getopt.c:726 posix/getopt.c:899
 #, c-format
 msgid "%s: option `%s' requires an argument\n"
 msgstr ""
 
-#: posix/getopt.c:707
+#: posix/getopt.c:704
 #, c-format
 msgid "%s: option `--%s' doesn't allow an argument\n"
 msgstr ""
 
-#: posix/getopt.c:886
+#: posix/getopt.c:883
 #, c-format
 msgid "%s: option `-W %s' doesn't allow an argument\n"
 msgstr ""
 
-#: posix/getopt.c:868
+#: posix/getopt.c:865
 #, c-format
 msgid "%s: option `-W %s' is ambiguous\n"
 msgstr ""
 
-#: posix/getopt.c:821 posix/getopt.c:951
+#: posix/getopt.c:818 posix/getopt.c:948
 #, c-format
 msgid "%s: option requires an argument -- %c\n"
 msgstr ""
 
-#: time/zic.c:840 time/zic.c:1252 time/zic.c:1272
+#: time/zic.c:834 time/zic.c:1246 time/zic.c:1266
 #, c-format
 msgid "%s: panic: Invalid l_value %d\n"
 msgstr ""
@@ -233,17 +315,17 @@ msgstr ""
 msgid "%s: premature end of file"
 msgstr ""
 
-#: posix/getopt.c:762
+#: posix/getopt.c:759
 #, c-format
 msgid "%s: unrecognized option `%c%s'\n"
 msgstr ""
 
-#: posix/getopt.c:758
+#: posix/getopt.c:755
 #, c-format
 msgid "%s: unrecognized option `--%s'\n"
 msgstr ""
 
-#: time/zic.c:447
+#: time/zic.c:441
 #, c-format
 msgid ""
 "%s: usage is %s [ -s ] [ -v ] [ -l localtime ] [ -p posixrules ] [ -d "
@@ -251,59 +333,69 @@ msgid ""
 "\t[ -L leapseconds ] [ -y yearistype ] [ filename ... ]\n"
 msgstr ""
 
-#: time/zdump.c:165
+#: time/zdump.c:174
 #, c-format
 msgid "%s: usage is %s [ -v ] [ -c cutoff ] zonename ...\n"
 msgstr ""
 
-#: sunrpc/clnt_perr.c:125
+#: nis/nis_print.c:290
+msgid "(Unknown object)\n"
+msgstr ""
+
+#: sunrpc/clnt_perr.c:119
 #, c-format
 msgid "(unknown authentication error - %d)"
 msgstr ""
 
-#: sunrpc/rpcinfo.c:555
+#: sunrpc/rpcinfo.c:616
 msgid "(unknown)"
 msgstr ""
 
-#: catgets/gencat.c:254
+#: catgets/gencat.c:265
 msgid "*standard input*"
 msgstr ""
 
+#: catgets/gencat.c:120
+msgid ""
+"-o OUTPUT-FILE [INPUT-FILE]...\n"
+"[OUTPUT-FILE [INPUT-FILE]...]"
+msgstr ""
+
 #: stdio-common/../sysdeps/gnu/errlist.c:766
 msgid ".lib section in a.out corrupted"
 msgstr ""
 
-#: inet/rcmd.c:359
+#: inet/rcmd.c:363
 msgid ".rhosts fstat failed"
 msgstr ""
 
-#: inet/rcmd.c:355
+#: inet/rcmd.c:359
 msgid ".rhosts lstat failed"
 msgstr ""
 
-#: inet/rcmd.c:357
+#: inet/rcmd.c:361
 msgid ".rhosts not regular file"
 msgstr ""
 
-#: inet/rcmd.c:363
+#: inet/rcmd.c:367
 msgid ".rhosts writeable by other than owner"
 msgstr ""
 
-#: sunrpc/clnt_perr.c:112 sunrpc/clnt_perr.c:133
+#: sunrpc/clnt_perr.c:105 sunrpc/clnt_perr.c:126
 #, c-format
 msgid "; low version = %lu, high version = %lu"
 msgstr ""
 
-#: sunrpc/clnt_perr.c:119
+#: sunrpc/clnt_perr.c:112
 msgid "; why = "
 msgstr ""
 
-#: locale/programs/ld-ctype.c:326
+#: locale/programs/ld-ctype.c:331
 #, c-format
 msgid "<SP> character must not be in class `%s'"
 msgstr ""
 
-#: locale/programs/ld-ctype.c:317
+#: locale/programs/ld-ctype.c:321
 #, c-format
 msgid "<SP> character not in class `%s'"
 msgstr ""
@@ -319,6 +411,10 @@ msgstr ""
 msgid "Aborted"
 msgstr ""
 
+#: nis/nis_print.c:250
+msgid "Access Rights : "
+msgstr ""
+
 #: stdio-common/../sysdeps/gnu/errlist.c:762
 msgid "Accessing a corrupted shared library"
 msgstr ""
@@ -328,6 +424,10 @@ msgstr ""
 msgid "Address already in use"
 msgstr ""
 
+#: posix/../sysdeps/posix/gai_strerror.c:30
+msgid "Address family for hostname not supported"
+msgstr ""
+
 #. TRANS The address family specified for a socket is not supported; it is
 #. TRANS inconsistent with the protocol being used on the socket.  @xref{Sockets}.
 #: stdio-common/../sysdeps/gnu/errlist.c:349
@@ -351,11 +451,20 @@ msgstr ""
 msgid "Argument list too long"
 msgstr ""
 
+#: nis/nis_error.c:65
+msgid "Attempt to remove a non-empty table"
+msgstr ""
+
 #: stdio-common/../sysdeps/gnu/errlist.c:770
 msgid "Attempting to link in too many shared libraries"
 msgstr ""
 
-#: sunrpc/clnt_perr.c:276
+#: nis/nis_print.c:221
+#, c-format
+msgid "Attributes : %d\n"
+msgstr ""
+
+#: sunrpc/clnt_perr.c:273
 msgid "Authentication OK"
 msgstr ""
 
@@ -364,6 +473,10 @@ msgstr ""
 msgid "Authentication error"
 msgstr ""
 
+#: nis/nis_print.c:259
+msgid "BOGUS OBJECT\n"
+msgstr ""
+
 #. TRANS Bad address; an invalid pointer was detected.
 #. TRANS In the GNU system, this error never happens; you get a signal instead.
 #: stdio-common/../sysdeps/gnu/errlist.c:102
@@ -390,6 +503,18 @@ msgstr ""
 msgid "Bad system call"
 msgstr ""
 
+#: posix/../sysdeps/posix/gai_strerror.c:32
+msgid "Bad value for ai_flags"
+msgstr ""
+
+#: locale/programs/localedef.c:109
+msgid "Be strictly POSIX conform"
+msgstr ""
+
+#: nis/nis_print.c:237
+msgid "Binary data\n"
+msgstr ""
+
 #. TRANS A file that isn't a block special file was given in a situation that
 #. TRANS requires one.  For example, trying to mount an ordinary file as a file
 #. TRANS system in Unix gives this error.
@@ -397,7 +522,7 @@ msgstr ""
 msgid "Block device required"
 msgstr ""
 
-#: sunrpc/pmap_rmt.c:337
+#: sunrpc/pmap_rmt.c:356
 msgid "Broadcast select problem"
 msgstr ""
 
@@ -417,27 +542,35 @@ msgstr ""
 msgid "Bus error"
 msgstr ""
 
+#: nis/nis_print.c:44
+msgid "CDS"
+msgstr ""
+
 #: sysdeps/unix/sysv/linux/siglist.h:43
 msgid "CPU time limit exceeded"
 msgstr ""
 
+#: nis/nis_error.c:32
+msgid "Cache expired"
+msgstr ""
+
 #: stdio-common/../sysdeps/gnu/errlist.c:758
 msgid "Can not access a needed shared library"
 msgstr ""
 
-#: nis/ypclnt.c:694
+#: nis/ypclnt.c:697
 msgid "Can't bind to server which serves this domain"
 msgstr ""
 
-#: nis/ypclnt.c:706
+#: nis/ypclnt.c:709
 msgid "Can't communicate with portmapper"
 msgstr ""
 
-#: nis/ypclnt.c:708
+#: nis/ypclnt.c:711
 msgid "Can't communicate with ypbind"
 msgstr ""
 
-#: nis/ypclnt.c:710
+#: nis/ypclnt.c:713
 msgid "Can't communicate with ypserv"
 msgstr ""
 
@@ -454,7 +587,7 @@ msgstr ""
 msgid "Cannot assign requested address"
 msgstr ""
 
-#: sunrpc/pmap_rmt.c:255
+#: sunrpc/pmap_rmt.c:266
 msgid "Cannot create socket for broadcast rpc"
 msgstr ""
 
@@ -462,11 +595,11 @@ msgstr ""
 msgid "Cannot exec a shared library directly"
 msgstr ""
 
-#: sunrpc/pmap_rmt.c:349
+#: sunrpc/pmap_rmt.c:369
 msgid "Cannot receive reply to broadcast"
 msgstr ""
 
-#: sunrpc/pmap_clnt.c:79
+#: sunrpc/pmap_clnt.c:76
 msgid "Cannot register service"
 msgstr ""
 
@@ -475,11 +608,11 @@ msgstr ""
 msgid "Cannot send after transport endpoint shutdown"
 msgstr ""
 
-#: sunrpc/pmap_rmt.c:313
+#: sunrpc/pmap_rmt.c:329
 msgid "Cannot send broadcast packet"
 msgstr ""
 
-#: sunrpc/pmap_rmt.c:261
+#: sunrpc/pmap_rmt.c:273
 msgid "Cannot set socket option SO_BROADCAST"
 msgstr ""
 
@@ -487,29 +620,42 @@ msgstr ""
 msgid "Channel number out of range"
 msgstr ""
 
+#: nis/nis_print.c:201
+#, c-format
+msgid "Character Separator : %c\n"
+msgstr ""
+
 #: stdio-common/../sysdeps/unix/siglist.c:49
 #: sysdeps/unix/sysv/linux/siglist.h:39
 msgid "Child exited"
 msgstr ""
 
-#: sunrpc/clnt_perr.c:286
+#: sunrpc/clnt_perr.c:283
 msgid "Client credential too weak"
 msgstr ""
 
+#: nis/nis_print.c:203
+msgid "Columns             :\n"
+msgstr ""
+
 #: stdio-common/../sysdeps/gnu/errlist.c:738
 msgid "Communication error on send"
 msgstr ""
 
+#: locale/programs/localedef.c:117
+msgid "Compile locale specification"
+msgstr ""
+
 #. TRANS Go home and have a glass of warm, dairy-fresh milk.
 #: stdio-common/../sysdeps/gnu/errlist.c:601
 msgid "Computer bought the farm"
 msgstr ""
 
-#: locale/programs/ld-ctype.c:1198
+#: locale/programs/ld-ctype.c:1204
 msgid "Computing table size for character classes might take a while..."
 msgstr ""
 
-#: locale/programs/ld-collate.c:327
+#: locale/programs/ld-collate.c:329
 msgid "Computing table size for collation information might take a while..."
 msgstr ""
 
@@ -537,8 +683,12 @@ msgstr ""
 msgid "Continued"
 msgstr ""
 
-#: catgets/gencat.c:169 db/makedb.c:120 locale/programs/locale.c:187
-#: locale/programs/localedef.c:177
+#: db/makedb.c:57
+msgid "Convert key to lower case"
+msgstr ""
+
+#: catgets/gencat.c:235 db/makedb.c:230 locale/programs/locale.c:267
+#: locale/programs/localedef.c:392
 #, c-format
 msgid ""
 "Copyright (C) %s Free Software Foundation, Inc.\n"
@@ -550,10 +700,51 @@ msgstr ""
 msgid "Cputime limit exceeded"
 msgstr ""
 
-#: nis/ypclnt.c:720
+#: catgets/gencat.c:107
+msgid "Create C header file NAME containing symbol definitions"
+msgstr ""
+
+#: locale/programs/localedef.c:108
+msgid "Create output even if warning messages were issued"
+msgstr ""
+
+#: db/makedb.c:67
+msgid "Create simple DB database from textual input."
+msgstr ""
+
+#: nis/nis_print.c:253
+#, c-format
+msgid "Creation Time : %s"
+msgstr ""
+
+#: nis/nis_print.c:123
+msgid "DH.\n"
+msgstr ""
+
+#: nis/nis_print.c:265
+msgid "DIRECTORY\n"
+msgstr ""
+
+#: nis/nis_print.c:40
+msgid "DNANS"
+msgstr ""
+
+#: nis/nis_print.c:36
+msgid "DNS"
+msgstr ""
+
+#: nis/nis_error.c:51
+msgid "Database for table does not exist"
+msgstr ""
+
+#: nis/ypclnt.c:723
 msgid "Database is busy"
 msgstr ""
 
+#: nis/nis_print.c:172
+msgid "Default Access rights: "
+msgstr ""
+
 #. TRANS No default destination address was set for the socket.  You get this
 #. TRANS error when you try to transmit data over a connectionless socket,
 #. TRANS without first specifying a destination for the data with @code{connect}.
@@ -581,6 +772,11 @@ msgstr ""
 msgid "Device or resource busy"
 msgstr ""
 
+#: nis/nis_print.c:247
+#, c-format
+msgid "Directory     : %s\n"
+msgstr ""
+
 #. TRANS Directory not empty, where an empty directory was expected.  Typically,
 #. TRANS this error occurs when you are trying to delete a directory.
 #: stdio-common/../sysdeps/gnu/errlist.c:468
@@ -592,7 +788,15 @@ msgstr ""
 msgid "Disc quota exceeded"
 msgstr ""
 
-#: nis/ypclnt.c:766
+#: db/makedb.c:60
+msgid "Do not print messages while building database"
+msgstr ""
+
+#: catgets/gencat.c:109
+msgid "Do not use existing catalog, force new output file"
+msgstr ""
+
+#: nis/ypclnt.c:769
 msgid "Domain not bound"
 msgstr ""
 
@@ -601,19 +805,47 @@ msgstr ""
 msgid "EMT trap"
 msgstr ""
 
-#: sunrpc/clnt_perr.c:254
+#: nis/nis_print.c:277
+msgid "ENTRY\n"
+msgstr ""
+
+#: nis/nis_print.c:235
+msgid "Encrypted data\n"
+msgstr ""
+
+#: nis/nis_error.c:52
+msgid "Entry/Table type mismatch"
+msgstr ""
+
+#: sunrpc/clnt_perr.c:247
 #, c-format
 msgid "Error %d"
 msgstr ""
 
+#: nis/nis_error.c:56
+msgid "Error in RPC subsystem"
+msgstr ""
+
+#: nis/nis_error.c:66
+msgid "Error in accessing NIS+ cold start file.  Is NIS+ installed?"
+msgstr ""
+
 #: string/../sysdeps/mach/_strerror.c:52
 msgid "Error in unknown error system: "
 msgstr ""
 
+#: nis/nis_error.c:59
+msgid "Error while talking to callback proc"
+msgstr ""
+
 #: inet/ruserpass.c:161
 msgid "Error: .netrc file is readable by others."
 msgstr ""
 
+#: nis/nis_call.c:180
+msgid "Error: could not find a NIS_COLD_START file\n"
+msgstr ""
+
 #: stdio-common/../sysdeps/gnu/errlist.c:698
 msgid "Exchange full"
 msgstr ""
@@ -624,11 +856,11 @@ msgstr ""
 msgid "Exec format error"
 msgstr ""
 
-#: locale/programs/localedef.c:213
+#: locale/programs/localedef.c:195
 msgid "FATAL: system does not define `_POSIX2_LOCALEDEF'"
 msgstr ""
 
-#: sunrpc/clnt_perr.c:290
+#: sunrpc/clnt_perr.c:287
 msgid "Failed (unspecified error)"
 msgstr ""
 
@@ -666,11 +898,19 @@ msgstr ""
 msgid "Filesize limit exceeded"
 msgstr ""
 
+#: nis/nis_error.c:37
+msgid "First/Next chain broken"
+msgstr ""
+
 #: stdio-common/../sysdeps/unix/siglist.c:37
 #: sysdeps/unix/sysv/linux/siglist.h:28
 msgid "Floating point exception"
 msgstr ""
 
+#: nis/nis_error.c:67
+msgid "Full resync required for directory"
+msgstr ""
+
 #. TRANS Function not implemented.  Some functions have commands or options defined
 #. TRANS that might not be supported in all implementations, and this is the kind
 #. TRANS of error you get if you request them and they are not supported.
@@ -678,11 +918,44 @@ msgstr ""
 msgid "Function not implemented"
 msgstr ""
 
+#: nis/nis_print.c:269
+msgid "GROUP\n"
+msgstr ""
+
+#: argp/argp-help.c:201
+#, c-format
+msgid "Garbage in ARGP_HELP_FMT: %s"
+msgstr ""
+
+#: catgets/gencat.c:115
+msgid ""
+"Generate message catalog.\\vIf INPUT-FILE is -, input is read from standard "
+"input.  If OUTPUT-FILE\n"
+"is -, output is written to standard output.\n"
+msgstr ""
+
+#: nis/nis_error.c:36
+msgid "Generic system error"
+msgstr ""
+
+#: locale/programs/locale.c:75
+msgid "Get locale-specific information."
+msgstr ""
+
 #. TRANS This error code has no purpose.
 #: stdio-common/../sysdeps/gnu/errlist.c:606
 msgid "Gratuitous error"
 msgstr ""
 
+#: nis/nis_print.c:249
+#, c-format
+msgid "Group         : %s\n"
+msgstr ""
+
+#: nis/nis_print.c:185
+msgid "Group Flags :"
+msgstr ""
+
 #: stdio-common/../sysdeps/unix/siglist.c:30
 #: sysdeps/unix/sysv/linux/siglist.h:22
 msgid "Hangup"
@@ -702,10 +975,21 @@ msgstr ""
 msgid "I/O possible"
 msgstr ""
 
+#: db/makedb.c:70
+msgid ""
+"INPUT-FILE OUTPUT-FILE\n"
+"-o OUTPUT-FILE INPUT-FILE\n"
+"-u INPUT-FILE"
+msgstr ""
+
 #: stdio-common/../sysdeps/unix/siglist.c:35
 msgid "IOT trap"
 msgstr ""
 
+#: nis/nis_print.c:34
+msgid "IVY"
+msgstr ""
+
 #: stdio-common/../sysdeps/gnu/errlist.c:614
 msgid "Identifier removed"
 msgstr ""
@@ -718,6 +1002,10 @@ msgstr ""
 msgid "Illegal instruction"
 msgstr ""
 
+#: nis/nis_error.c:61
+msgid "Illegal object type for operation"
+msgstr ""
+
 #. TRANS Invalid seek operation (such as on a pipe).
 #: stdio-common/../sysdeps/gnu/errlist.c:201
 msgid "Illegal seek"
@@ -752,16 +1040,20 @@ msgstr ""
 msgid "Information request"
 msgstr ""
 
+#: locale/programs/localedef.c:99
+msgid "Input Files:"
+msgstr ""
+
 #. TRANS Input/output error; usually used for physical read or write errors.
 #: stdio-common/../sysdeps/gnu/errlist.c:40
 msgid "Input/output error"
 msgstr ""
 
-#: nis/ypclnt.c:700
+#: nis/ypclnt.c:703
 msgid "Internal NIS error"
 msgstr ""
 
-#: nis/ypclnt.c:764
+#: nis/ypclnt.c:767
 msgid "Internal ypbind error"
 msgstr ""
 
@@ -785,33 +1077,37 @@ msgstr ""
 msgid "Interrupted system call should be restarted"
 msgstr ""
 
+#: nis/nis_error.c:44
+msgid "Invalid Object for operation"
+msgstr ""
+
 #. TRANS Invalid argument.  This is used to indicate various kinds of problems
 #. TRANS with passing the wrong argument to a library function.
 #: stdio-common/../sysdeps/gnu/errlist.c:152
 msgid "Invalid argument"
 msgstr ""
 
-#: posix/regex.c:946
+#: posix/regex.c:960
 msgid "Invalid back reference"
 msgstr ""
 
-#: posix/regex.c:944
+#: posix/regex.c:958
 msgid "Invalid character class name"
 msgstr ""
 
-#: sunrpc/clnt_perr.c:278
+#: sunrpc/clnt_perr.c:275
 msgid "Invalid client credential"
 msgstr ""
 
-#: sunrpc/clnt_perr.c:282
+#: sunrpc/clnt_perr.c:279
 msgid "Invalid client verifier"
 msgstr ""
 
-#: posix/regex.c:943
+#: posix/regex.c:957
 msgid "Invalid collation character"
 msgstr ""
 
-#: posix/regex.c:950
+#: posix/regex.c:964
 msgid "Invalid content of \\{\\}"
 msgstr ""
 
@@ -832,15 +1128,15 @@ msgstr ""
 msgid "Invalid or incomplete multibyte or wide character"
 msgstr ""
 
-#: posix/regex.c:953
+#: posix/regex.c:967
 msgid "Invalid preceding regular expression"
 msgstr ""
 
-#: posix/regex.c:951
+#: posix/regex.c:965
 msgid "Invalid range end"
 msgstr ""
 
-#: posix/regex.c:942
+#: posix/regex.c:956
 msgid "Invalid regular expression"
 msgstr ""
 
@@ -852,7 +1148,7 @@ msgstr ""
 msgid "Invalid request descriptor"
 msgstr ""
 
-#: sunrpc/clnt_perr.c:288
+#: sunrpc/clnt_perr.c:285
 msgid "Invalid server verifier"
 msgstr ""
 
@@ -870,11 +1166,24 @@ msgstr ""
 msgid "Is a named type file"
 msgstr ""
 
+#: nis/nis_print.c:129
+msgid "Kerberous.\n"
+msgstr ""
+
 #: stdio-common/../sysdeps/unix/siglist.c:38
 #: sysdeps/unix/sysv/linux/siglist.h:29
 msgid "Killed"
 msgstr ""
 
+#: nis/nis_print.c:281
+msgid "LINK\n"
+msgstr ""
+
+#: nis/nis_local_names.c:125
+#, c-format
+msgid "LOCAL entry for UID %d in directory %s not unique\n"
+msgstr ""
+
 #: stdio-common/../sysdeps/gnu/errlist.c:686
 msgid "Level 2 halted"
 msgstr ""
@@ -891,6 +1200,10 @@ msgstr ""
 msgid "Level 3 reset"
 msgstr ""
 
+#: nis/nis_error.c:53
+msgid "Link Points to illegal name"
+msgstr ""
+
 #: stdio-common/../sysdeps/gnu/errlist.c:626
 msgid "Link has been severed"
 msgstr ""
@@ -899,11 +1212,11 @@ msgstr ""
 msgid "Link number out of range"
 msgstr ""
 
-#: nis/ypclnt.c:712
+#: nis/ypclnt.c:715
 msgid "Local domain name not set"
 msgstr ""
 
-#: nis/ypclnt.c:702
+#: nis/ypclnt.c:705
 msgid "Local resource allocation failure"
 msgstr ""
 
@@ -911,7 +1224,29 @@ msgstr ""
 msgid "Machine is not on the network"
 msgstr ""
 
-#: posix/regex.c:952
+#: nis/nis_error.c:45
+msgid "Malformed Name, or illegal name"
+msgstr ""
+
+#: argp/argp-help.c:1132
+msgid ""
+"Mandatory or optional arguments to long options are also mandatory or "
+"optional for any corresponding short options."
+msgstr ""
+
+#: nis/nis_print.c:112
+msgid "Master Server :\n"
+msgstr ""
+
+#: nis/nis_error.c:75
+msgid "Master server busy, full dump rescheduled."
+msgstr ""
+
+#: posix/../sysdeps/posix/gai_strerror.c:35
+msgid "Memory allocation failure"
+msgstr ""
+
+#: posix/regex.c:966
 msgid "Memory exhausted"
 msgstr ""
 
@@ -921,22 +1256,100 @@ msgstr ""
 msgid "Message too long"
 msgstr ""
 
+#: nis/nis_error.c:57
+msgid "Missing or malformed attribute"
+msgstr ""
+
+#: nis/nis_print.c:254
+#, c-format
+msgid "Mod. Time     : %s"
+msgstr ""
+
+#: nis/nis_error.c:50
+msgid "Modification failed"
+msgstr ""
+
+#: nis/nis_error.c:63
+msgid "Modify operation failed"
+msgstr ""
+
+#: locale/programs/locale.c:68
+msgid "Modify output format:"
+msgstr ""
+
 #: stdio-common/../sysdeps/gnu/errlist.c:618
 msgid "Multihop attempted"
 msgstr ""
 
-#: nis/ypclnt.c:716
+#: catgets/gencat.c:106 catgets/gencat.c:110 db/makedb.c:58
+#: locale/programs/localedef.c:120
+msgid "NAME"
+msgstr ""
+
+#: locale/programs/locale.c:78
+msgid ""
+"NAME\n"
+"[-a|-m]"
+msgstr ""
+
+#: nis/nis_print.c:30
+msgid "NIS"
+msgstr ""
+
+#: nis/ypclnt.c:719
 msgid "NIS client/server version mismatch - can't supply service"
 msgstr ""
 
-#: nis/ypclnt.c:714
+#: nis/ypclnt.c:717
 msgid "NIS map data base is bad"
 msgstr ""
 
+#: nis/nis_error.c:68
+msgid "NIS+ operation failed"
+msgstr ""
+
+#: nis/nis_error.c:33
+msgid "NIS+ servers unreachable"
+msgstr ""
+
+#: nis/nis_error.c:69
+msgid "NIS+ service is unavailable or not installed"
+msgstr ""
+
+#: nis/nis_print.c:262
+msgid "NO OBJECT\n"
+msgstr ""
+
+#: nis/nis_print.c:220
+#, c-format
+msgid "Name : %s\n"
+msgstr ""
+
+#: nis/nis_print.c:106
+#, c-format
+msgid "Name : '%s'\n"
+msgstr ""
+
+#: nis/nis_error.c:40
+msgid "Name not served by this server"
+msgstr ""
+
 #: stdio-common/../sysdeps/gnu/errlist.c:746
 msgid "Name not unique on network"
 msgstr ""
 
+#: posix/../sysdeps/posix/gai_strerror.c:37
+msgid "Name or service not known"
+msgstr ""
+
+#: nis/nis_error.c:49
+msgid "Name/entry isn't unique"
+msgstr ""
+
+#: nis/nis_error.c:58
+msgid "Named object is not searchable"
+msgstr ""
+
 #. TRANS ???
 #: stdio-common/../sysdeps/gnu/errlist.c:554
 msgid "Need authenticator"
@@ -966,6 +1379,10 @@ msgstr ""
 msgid "No XENIX semaphores available"
 msgstr ""
 
+#: posix/../sysdeps/posix/gai_strerror.c:36
+msgid "No address associated with hostname"
+msgstr ""
+
 #: resolv/herror.c:77
 msgid "No address associated with name"
 msgstr ""
@@ -992,6 +1409,10 @@ msgstr ""
 msgid "No data available"
 msgstr ""
 
+#: nis/nis_error.c:73
+msgid "No file space on server"
+msgstr ""
+
 #. TRANS No locks available.  This is used by the file locking facilities; see
 #. TRANS @ref{File Locks}.  This error is never generated by the GNU system, but
 #. TRANS it can result from an operation to an NFS server running another
@@ -1000,7 +1421,7 @@ msgstr ""
 msgid "No locks available"
 msgstr ""
 
-#: posix/regex.c:941
+#: posix/regex.c:955
 msgid "No match"
 msgstr ""
 
@@ -1008,15 +1429,15 @@ msgstr ""
 msgid "No message of desired type"
 msgstr ""
 
-#: nis/ypclnt.c:704
+#: nis/ypclnt.c:707
 msgid "No more records in map database"
 msgstr ""
 
-#: posix/regex.c:5204
+#: posix/regex.c:5324
 msgid "No previous regular expression"
 msgstr ""
 
-#: sunrpc/rpcinfo.c:515
+#: sunrpc/rpcinfo.c:573
 msgid "No remote programs registered.\n"
 msgstr ""
 
@@ -1038,11 +1459,11 @@ msgstr ""
 msgid "No such file or directory"
 msgstr ""
 
-#: nis/ypclnt.c:698
+#: nis/ypclnt.c:701
 msgid "No such key in map"
 msgstr ""
 
-#: nis/ypclnt.c:696
+#: nis/ypclnt.c:699
 msgid "No such map in server's domain"
 msgstr ""
 
@@ -1051,6 +1472,26 @@ msgstr ""
 msgid "No such process"
 msgstr ""
 
+#: argp/argp-parse.c:163
+msgid "No version known!?"
+msgstr ""
+
+#: nis/nis_error.c:60
+msgid "Non NIS+ namespace encountered"
+msgstr ""
+
+#: posix/../sysdeps/posix/gai_strerror.c:33
+msgid "Non-recoverable failure in name resolution"
+msgstr ""
+
+#: nis/nis_print.c:120
+msgid "None.\n"
+msgstr ""
+
+#: nis/nis_error.c:48
+msgid "Not Found, no such name"
+msgstr ""
+
 #: stdio-common/../sysdeps/gnu/errlist.c:786
 msgid "Not a XENIX named type file"
 msgstr ""
@@ -1060,6 +1501,28 @@ msgstr ""
 msgid "Not a directory"
 msgstr ""
 
+#: nis/nis_error.c:30
+msgid "Not found"
+msgstr ""
+
+#: nis/nis_error.c:43
+msgid "Not master server for this domain"
+msgstr ""
+
+#: nis/nis_error.c:39
+msgid "Not owner"
+msgstr ""
+
+#: nis/nis_print.c:200
+#, c-format
+msgid "Number of Columns   : %d\n"
+msgstr ""
+
+#: nis/nis_print.c:301
+#, c-format
+msgid "Number of objects : %u\n"
+msgstr ""
+
 #. TRANS Domain error; used by mathematical functions when an argument value does
 #. TRANS not fall into the domain over which the function is defined.
 #: stdio-common/../sysdeps/gnu/errlist.c:228
@@ -1072,6 +1535,20 @@ msgstr ""
 msgid "Numerical result out of range"
 msgstr ""
 
+#: nis/nis_print.c:305
+#, c-format
+msgid "Object #%d:\n"
+msgstr ""
+
+#: nis/nis_print.c:246
+#, c-format
+msgid "Object Name   : %s\n"
+msgstr ""
+
+#: nis/nis_print.c:255
+msgid "Object Type   : "
+msgstr ""
+
 #. TRANS An attempt was made to NFS-mount a remote file system with a file name that
 #. TRANS already specifies an NFS-mounted file.
 #. TRANS (This is an error on some operating systems, but we expect it to work
@@ -1080,7 +1557,11 @@ msgstr ""
 msgid "Object is remote"
 msgstr ""
 
-#: time/zic.c:1954
+#: nis/nis_error.c:42
+msgid "Object with same name exists"
+msgstr ""
+
+#: time/zic.c:1966
 msgid "Odd number of quotation marks"
 msgstr ""
 
@@ -1137,12 +1618,34 @@ msgstr ""
 msgid "Out of streams resources"
 msgstr ""
 
+#: locale/programs/localedef.c:106
+msgid "Output control:"
+msgstr ""
+
+#: nis/nis_print.c:248
+#, c-format
+msgid "Owner         : %s\n"
+msgstr ""
+
+#: nis/nis_print.c:285
+msgid "PRIVATE\n"
+msgstr ""
+
 #: stdio-common/../sysdeps/gnu/errlist.c:726
 msgid "Package not installed"
 msgstr ""
 
+#: nis/nis_error.c:54
+msgid "Partial Success"
+msgstr ""
+
+#: nis/nis_error.c:62
+msgid "Passed object is not the same object on server"
+msgstr ""
+
 #. TRANS Permission denied; the file permissions do not allow the attempted operation.
-#: nis/ypclnt.c:718 stdio-common/../sysdeps/gnu/errlist.c:96
+#: nis/nis_error.c:38 nis/ypclnt.c:721
+#: stdio-common/../sysdeps/gnu/errlist.c:96
 msgid "Permission denied"
 msgstr ""
 
@@ -1150,10 +1653,26 @@ msgstr ""
 msgid "Power failure"
 msgstr ""
 
-#: posix/regex.c:954
+#: posix/regex.c:968
 msgid "Premature end of regular expression"
 msgstr ""
 
+#: db/makedb.c:62
+msgid "Print content of database file, one entry a line"
+msgstr ""
+
+#: locale/programs/localedef.c:112
+msgid "Print more messages"
+msgstr ""
+
+#: nis/nis_error.c:29
+msgid "Probable success"
+msgstr ""
+
+#: nis/nis_error.c:31
+msgid "Probably not found"
+msgstr ""
+
 #: stdio-common/../sysdeps/unix/siglist.c:56
 #: sysdeps/unix/sysv/linux/siglist.h:46
 msgid "Profiling timer expired"
@@ -1190,6 +1709,10 @@ msgstr ""
 msgid "Protocol wrong type for socket"
 msgstr ""
 
+#: nis/nis_error.c:64
+msgid "Query illegal for named table"
+msgstr ""
+
 #: stdio-common/../sysdeps/unix/siglist.c:32
 #: sysdeps/unix/sysv/linux/siglist.h:24
 msgid "Quit"
@@ -1204,7 +1727,7 @@ msgstr ""
 msgid "RPC bad procedure for program"
 msgstr ""
 
-#: nis/ypclnt.c:692
+#: nis/ypclnt.c:695
 msgid "RPC failure on NIS operation"
 msgstr ""
 
@@ -1228,83 +1751,87 @@ msgstr ""
 msgid "RPC version wrong"
 msgstr ""
 
-#: sunrpc/clnt_perr.c:217
+#: sunrpc/clnt_perr.c:209
 msgid "RPC: (unknown error code)"
 msgstr ""
 
-#: sunrpc/clnt_perr.c:179
+#: sunrpc/clnt_perr.c:170
 msgid "RPC: Authentication error"
 msgstr ""
 
-#: sunrpc/clnt_perr.c:169
+#: sunrpc/clnt_perr.c:160
 msgid "RPC: Can't decode result"
 msgstr ""
 
-#: sunrpc/clnt_perr.c:167
+#: sunrpc/clnt_perr.c:158
 msgid "RPC: Can't encode arguments"
 msgstr ""
 
-#: sunrpc/clnt_perr.c:199
+#: sunrpc/clnt_perr.c:190
 msgid "RPC: Failed (unspecified error)"
 msgstr ""
 
-#: sunrpc/clnt_perr.c:177
+#: sunrpc/clnt_perr.c:168
 msgid "RPC: Incompatible versions of RPC"
 msgstr ""
 
-#: sunrpc/clnt_perr.c:195
+#: sunrpc/clnt_perr.c:186
 msgid "RPC: Port mapper failure"
 msgstr ""
 
-#: sunrpc/clnt_perr.c:185
+#: sunrpc/clnt_perr.c:176
 msgid "RPC: Procedure unavailable"
 msgstr ""
 
-#: sunrpc/clnt_perr.c:197
+#: sunrpc/clnt_perr.c:188
 msgid "RPC: Program not registered"
 msgstr ""
 
-#: sunrpc/clnt_perr.c:181
+#: sunrpc/clnt_perr.c:172
 msgid "RPC: Program unavailable"
 msgstr ""
 
-#: sunrpc/clnt_perr.c:183
+#: sunrpc/clnt_perr.c:174
 msgid "RPC: Program/version mismatch"
 msgstr ""
 
-#: sunrpc/clnt_perr.c:189
+#: sunrpc/clnt_perr.c:180
 msgid "RPC: Remote system error"
 msgstr ""
 
-#: sunrpc/clnt_perr.c:187
+#: sunrpc/clnt_perr.c:178
 msgid "RPC: Server can't decode arguments"
 msgstr ""
 
-#: sunrpc/clnt_perr.c:165
+#: sunrpc/clnt_perr.c:156
 msgid "RPC: Success"
 msgstr ""
 
-#: sunrpc/clnt_perr.c:175
+#: sunrpc/clnt_perr.c:166
 msgid "RPC: Timed out"
 msgstr ""
 
-#: sunrpc/clnt_perr.c:173
+#: sunrpc/clnt_perr.c:164
 msgid "RPC: Unable to receive"
 msgstr ""
 
-#: sunrpc/clnt_perr.c:171
+#: sunrpc/clnt_perr.c:162
 msgid "RPC: Unable to send"
 msgstr ""
 
-#: sunrpc/clnt_perr.c:191
+#: sunrpc/clnt_perr.c:182
 msgid "RPC: Unknown host"
 msgstr ""
 
-#: sunrpc/clnt_perr.c:193
+#: sunrpc/clnt_perr.c:184
 msgid "RPC: Unknown protocol"
 msgstr ""
 
-#: elf/dlsym.c:49
+#: nis/nis_print.c:126
+msgid "RSA.\n"
+msgstr ""
+
+#: elf/dlsym.c:49 elf/dlvsym.c:52
 msgid "RTLD_NEXT used in code not dynamically loaded"
 msgstr ""
 
@@ -1313,7 +1840,7 @@ msgstr ""
 msgid "Read-only file system"
 msgstr ""
 
-#: posix/regex.c:955
+#: posix/regex.c:969
 msgid "Regular expression too big"
 msgstr ""
 
@@ -1329,12 +1856,21 @@ msgstr ""
 msgid "Remove password or make file unreadable by others."
 msgstr ""
 
-#: catgets/gencat.c:224 db/makedb.c:227 locale/programs/locale.c:257
-#: locale/programs/localedef.c:408
+#: nis/nis_print.c:114
+msgid "Replicate :\n"
+msgstr ""
+
+#: argp/argp-help.c:1565
+#, c-format
+msgid "Report bugs to %s.\n"
+msgstr ""
+
+#: catgets/gencat.c:222 db/makedb.c:217 locale/programs/locale.c:254
+#: locale/programs/localedef.c:378
 msgid "Report bugs using the `glibcbug' script to <bugs@gnu.ai.mit.edu>.\n"
 msgstr ""
 
-#: nis/ypclnt.c:690
+#: nis/ypclnt.c:693
 msgid "Request arguments bad"
 msgstr ""
 
@@ -1391,19 +1927,44 @@ msgstr ""
 msgid "Resource temporarily unavailable"
 msgstr ""
 
+#: nis/nis_error.c:47
+msgid "Results Sent to callback proc"
+msgstr ""
+
+#: nis/nis_print.c:32
+msgid "SUNYP"
+msgstr ""
+
+#: nis/nis_print.c:202
+#, c-format
+msgid "Search Path         : %s\n"
+msgstr ""
+
 #: stdio-common/../sysdeps/unix/siglist.c:40
 #: sysdeps/unix/sysv/linux/siglist.h:31
 msgid "Segmentation fault"
 msgstr ""
 
-#: sunrpc/clnt_perr.c:280
+#: nis/nis_error.c:35
+msgid "Server busy, try again"
+msgstr ""
+
+#: nis/nis_error.c:41
+msgid "Server out of memory"
+msgstr ""
+
+#: sunrpc/clnt_perr.c:277
 msgid "Server rejected credential"
 msgstr ""
 
-#: sunrpc/clnt_perr.c:284
+#: sunrpc/clnt_perr.c:281
 msgid "Server rejected verifier"
 msgstr ""
 
+#: posix/../sysdeps/posix/gai_strerror.c:38
+msgid "Servname not supported for ai_socktype"
+msgstr ""
+
 #: stdio-common/../sysdeps/unix/siglist.c:29
 msgid "Signal 0"
 msgstr ""
@@ -1423,6 +1984,14 @@ msgstr ""
 msgid "Software caused connection abort"
 msgstr ""
 
+#: locale/programs/localedef.c:102
+msgid "Source definitions are found in FILE"
+msgstr ""
+
+#: locale/programs/localedef.c:104
+msgid "Specify code set for mapping ISO 10646 elements"
+msgstr ""
+
 #: stdio-common/../sysdeps/gnu/errlist.c:734
 msgid "Srmount error"
 msgstr ""
@@ -1439,6 +2008,11 @@ msgstr ""
 msgid "Stale NFS file handle"
 msgstr ""
 
+#: nis/nis_print.c:300
+#, c-format
+msgid "Status            : %s\n"
+msgstr ""
+
 #: stdio-common/../sysdeps/unix/siglist.c:47
 #: sysdeps/unix/sysv/linux/siglist.h:37
 msgid "Stopped"
@@ -1467,15 +2041,52 @@ msgstr ""
 msgid "Structure needs cleaning"
 msgstr ""
 
-#: nis/ypclnt.c:688 nis/ypclnt.c:762 posix/regex.c:940
+#: nis/nis_error.c:28 nis/ypclnt.c:691 nis/ypclnt.c:765 posix/regex.c:954
 #: stdio-common/../sysdeps/gnu/errlist.c:7
 msgid "Success"
 msgstr ""
 
-#: nis/ypclnt.c:768
+#: locale/programs/localedef.c:111
+msgid "Suppress warnings and information messages"
+msgstr ""
+
+#: locale/programs/localedef.c:101
+msgid "Symbolic character names defined in FILE"
+msgstr ""
+
+#: posix/../sysdeps/posix/gai_strerror.c:40
+msgid "System error"
+msgstr ""
+
+#: locale/programs/locale.c:63
+msgid "System information:"
+msgstr ""
+
+#: nis/ypclnt.c:771
 msgid "System resource allocation failure"
 msgstr ""
 
+#: locale/programs/localedef.c:374
+#, c-format
+msgid ""
+"System's directory for character maps: %s\n"
+"                       locale files  : %s\n"
+"%s"
+msgstr ""
+
+#: nis/nis_print.c:273
+msgid "TABLE\n"
+msgstr ""
+
+#: nis/nis_print.c:199
+#, c-format
+msgid "Table Type          : %s\n"
+msgstr ""
+
+#: posix/../sysdeps/posix/gai_strerror.c:31
+msgid "Temporary failure in name resolution"
+msgstr ""
+
 #: stdio-common/../sysdeps/unix/siglist.c:44
 #: sysdeps/unix/sysv/linux/siglist.h:34
 msgid "Terminated"
@@ -1490,10 +2101,19 @@ msgstr ""
 msgid "Text file busy"
 msgstr ""
 
+#: nis/nis_print.c:164
+#, c-format
+msgid "Time to live : %s\n"
+msgstr ""
+
 #: stdio-common/../sysdeps/gnu/errlist.c:650
 msgid "Timer expired"
 msgstr ""
 
+#: nis/nis_error.c:55
+msgid "Too Many Attributes"
+msgstr ""
+
 #. TRANS Too many levels of symbolic links were encountered in looking up a file name.
 #. TRANS This often indicates a cycle of symbolic links.
 #: stdio-common/../sysdeps/gnu/errlist.c:445
@@ -1551,7 +2171,7 @@ msgstr ""
 msgid "Trace/breakpoint trap"
 msgstr ""
 
-#: posix/regex.c:945
+#: posix/regex.c:959
 msgid "Trailing backslash"
 msgstr ""
 
@@ -1576,10 +2196,9 @@ msgstr ""
 msgid "Transport endpoint is not connected"
 msgstr ""
 
-#: catgets/gencat.c:208 db/makedb.c:209 locale/programs/locale.c:241
-#: locale/programs/localedef.c:389
+#: argp/argp-help.c:1538
 #, c-format
-msgid "Try `%s --help' for more information.\n"
+msgid "Try `%s --help' or `%s --usage' for more information.\n"
 msgstr ""
 
 #: inet/rcmd.c:137
@@ -1587,15 +2206,49 @@ msgstr ""
 msgid "Trying %s...\n"
 msgstr ""
 
+#: nis/nis_print.c:219
+#, c-format
+msgid "Type : %d\n"
+msgstr ""
+
+#: nis/nis_print.c:107
+#, c-format
+msgid "Type : %s\n"
+msgstr ""
+
+#: nis/nis_print.c:46
+msgid "UNKNOWN"
+msgstr ""
+
+#: nis/nis_error.c:72
+msgid "Unable to authenticate NIS+ client"
+msgstr ""
+
+#: nis/nis_error.c:71
+msgid "Unable to authenticate NIS+ server"
+msgstr ""
+
+#: nis/nis_error.c:46
+msgid "Unable to create callback"
+msgstr ""
+
+#: nis/nis_error.c:74
+msgid "Unable to create process on server"
+msgstr ""
+
 #: inet/ruserpass.c:246
 #, c-format
 msgid "Unknown .netrc keyword %s"
 msgstr ""
 
-#: nis/ypclnt.c:722
+#: nis/ypclnt.c:725
 msgid "Unknown NIS error code"
 msgstr ""
 
+#: posix/../sysdeps/posix/gai_strerror.c:51
+msgid "Unknown error"
+msgstr ""
+
 #: string/../sysdeps/generic/_strerror.c:44
 #: string/../sysdeps/mach/_strerror.c:67
 msgid "Unknown error "
@@ -1605,6 +2258,10 @@ msgstr ""
 msgid "Unknown host"
 msgstr ""
 
+#: nis/nis_error.c:34
+msgid "Unknown object"
+msgstr ""
+
 #: resolv/herror.c:120
 msgid "Unknown resolver error"
 msgstr ""
@@ -1618,27 +2275,31 @@ msgstr ""
 msgid "Unknown signal %d"
 msgstr ""
 
-#: misc/error.c:95
+#: misc/error.c:100
 msgid "Unknown system error"
 msgstr ""
 
-#: nis/ypclnt.c:770
+#: nis/ypclnt.c:773
 msgid "Unknown ypbind error"
 msgstr ""
 
-#: posix/regex.c:948
+#: nis/nis_print.c:132
+msgid "Unknown.\n"
+msgstr ""
+
+#: posix/regex.c:962
 msgid "Unmatched ( or \\("
 msgstr ""
 
-#: posix/regex.c:956
+#: posix/regex.c:970
 msgid "Unmatched ) or \\)"
 msgstr ""
 
-#: posix/regex.c:947
+#: posix/regex.c:961
 msgid "Unmatched [ or [^"
 msgstr ""
 
-#: posix/regex.c:949
+#: posix/regex.c:963
 msgid "Unmatched \\{"
 msgstr ""
 
@@ -1652,77 +2313,12 @@ msgstr ""
 msgid "Urgent I/O condition"
 msgstr ""
 
-#: catgets/gencat.c:212
-#, c-format
-msgid ""
-"Usage: %s [OPTION]... -o OUTPUT-FILE [INPUT-FILE]...\n"
-"       %s [OPTION]... [OUTPUT-FILE [INPUT-FILE]...]\n"
-"Mandatory arguments to long options are mandatory for short options too.\n"
-"  -H, --header        create C header file containing symbol definitions\n"
-"  -h, --help          display this help and exit\n"
-"      --new           do not use existing catalog, force new output file\n"
-"  -o, --output=NAME   write output to file NAME\n"
-"  -V, --version       output version information and exit\n"
-"If INPUT-FILE is -, input is read from standard input.  If OUTPUT-FILE\n"
-"is -, output is written to standard output.\n"
-msgstr ""
-
-#: db/makedb.c:213
-#, c-format
-msgid ""
-"Usage: %s [OPTION]... INPUT-FILE OUTPUT-FILE\n"
-"       %s [OPTION]... -o OUTPUT-FILE INPUT-FILE\n"
-"       %s [OPTION]... -u INPUT-FILE\n"
-"Mandatory arguments to long options are mandatory for short options too.\n"
-"  -f, --fold-case     convert key to lower case\n"
-"  -h, --help          display this help and exit\n"
-"  -o, --output=NAME   write output to file NAME\n"
-"      --quiet         don't print messages while building database\n"
-"  -u, --undo          print content of database file, one entry a line\n"
-"  -V, --version       output version information and exit\n"
-"If INPUT-FILE is -, input is read from standard input.\n"
-msgstr ""
-
-#: locale/programs/localedef.c:393
-#, c-format
-msgid ""
-"Usage: %s [OPTION]... name\n"
-"Mandatory arguments to long options are mandatory for short options too.\n"
-"  -c, --force               create output even if warning messages were "
-"issued\n"
-"  -h, --help                display this help and exit\n"
-"  -f, --charmap=FILE        symbolic character names defined in FILE\n"
-"  -i, --inputfile=FILE      source definitions are found in FILE\n"
-"  -u, --code-set-name=NAME  specify code set for mapping ISO 10646 elements\n"
-"  -v, --verbose             print more messages\n"
-"  -V, --version             output version information and exit\n"
-"      --posix               be strictly POSIX conform\n"
-"\n"
-"System's directory for character maps: %s\n"
-"                       locale files  : %s\n"
-msgstr ""
-
-#: locale/programs/locale.c:245
-#, c-format
-msgid ""
-"Usage: %s [OPTION]... name\n"
-"Mandatory arguments to long options are mandatory for short options too.\n"
-"  -h, --help            display this help and exit\n"
-"  -V, --version         output version information and exit\n"
-"\n"
-"  -a, --all-locales     write names of available locales\n"
-"  -m, --charmaps        write names of available charmaps\n"
-"\n"
-"  -c, --category-name   write names of selected categories\n"
-"  -k, --keyword-name    write names of selected keywords\n"
-msgstr ""
-
 #: posix/getconf.c:200
 #, c-format
 msgid "Usage: %s variable_name [pathname]\n"
 msgstr ""
 
-#: sunrpc/rpcinfo.c:609
+#: sunrpc/rpcinfo.c:677
 msgid "Usage: rpcinfo [ -n portnum ] -u host prognum [ versnum ]\n"
 msgstr ""
 
@@ -1745,7 +2341,7 @@ msgstr ""
 msgid "Virtual timer expired"
 msgstr ""
 
-#: time/zic.c:1859
+#: time/zic.c:1871
 msgid "Wild result from command execution"
 msgstr ""
 
@@ -1754,12 +2350,40 @@ msgstr ""
 msgid "Window changed"
 msgstr ""
 
-#: catgets/gencat.c:174 db/makedb.c:125 locale/programs/locale.c:192
-#: locale/programs/localedef.c:182
+#: locale/programs/locale.c:67
+msgid "Write names of available charmaps"
+msgstr ""
+
+#: locale/programs/locale.c:65
+msgid "Write names of available locales"
+msgstr ""
+
+#: locale/programs/locale.c:69
+msgid "Write names of selected categories"
+msgstr ""
+
+#: locale/programs/locale.c:70
+msgid "Write names of selected keywords"
+msgstr ""
+
+#: catgets/gencat.c:110 db/makedb.c:58
+msgid "Write output to file NAME"
+msgstr ""
+
+#: catgets/gencat.c:240 db/makedb.c:235 locale/programs/locale.c:272
+#: locale/programs/localedef.c:397
 #, c-format
 msgid "Written by %s.\n"
 msgstr ""
 
+#: nis/nis_print.c:38
+msgid "X500"
+msgstr ""
+
+#: nis/nis_print.c:42
+msgid "XCHS"
+msgstr ""
+
 #: nis/ypclnt.c:142
 msgid "YPBINDPROC_DOMAIN: Internal error\n"
 msgstr ""
@@ -1777,44 +2401,62 @@ msgstr ""
 msgid "YPBINDPROC_DOMAIN: Unknown error\n"
 msgstr ""
 
+#: nis/nis_error.c:70
+msgid "Yes, 42 is the meaning of life"
+msgstr ""
+
 #. TRANS You did @strong{what}?
 #: stdio-common/../sysdeps/gnu/errlist.c:596
 msgid "You really blew it this time"
 msgstr ""
 
-#: time/zic.c:1054
+#: time/zic.c:1048
 msgid "Zone continuation line end time is not after end time of previous line"
 msgstr ""
 
-#: locale/programs/charmap.c:397 locale/programs/locfile.c:341
+#: nis/nis_server.c:36 nis/nis_server.c:48 nis/nis_server.c:68
+#: nis/nis_server.c:80
+#, c-format
+msgid "__do_niscall: Error #%d\n"
+msgstr ""
+
+#: locale/programs/charmap.c:397 locale/programs/locfile.c:363
 #, c-format
 msgid "`%1$s' definition does not end with `END %1$s'"
 msgstr ""
 
-#: locale/programs/ld-monetary.c:358 locale/programs/ld-numeric.c:190
+#: locale/programs/ld-monetary.c:359 locale/programs/ld-numeric.c:190
 #, c-format
 msgid "`-1' must be last entry in `%s' field in `%s' category"
 msgstr ""
 
-#: locale/programs/ld-collate.c:1652
+#: locale/programs/ld-collate.c:1655
 msgid "`...' must only be used in `...' and `UNDEFINED' entries"
 msgstr ""
 
-#: locale/programs/locfile.c:538
+#: locale/programs/locfile.c:560
 msgid "`from' expected after first argument to `collating-element'"
 msgstr ""
 
-#: locale/programs/ld-collate.c:1109
+#: locale/programs/ld-collate.c:1112
 msgid ""
 "`from' string in collation element declaration contains unknown character"
 msgstr ""
 
+#: posix/../sysdeps/posix/gai_strerror.c:34
+msgid "ai_family not supported"
+msgstr ""
+
+#: posix/../sysdeps/posix/gai_strerror.c:39
+msgid "ai_socktype not supported"
+msgstr ""
+
 #: locale/programs/charmap.c:267
 #, c-format
 msgid "argument to <%s> must be a single character"
 msgstr ""
 
-#: locale/programs/locfile.c:215
+#: locale/programs/locfile.c:237
 #, c-format
 msgid "argument to `%s' must be a single character"
 msgstr ""
@@ -1823,19 +2465,23 @@ msgstr ""
 msgid "auth_none.c - Fatal marshalling problem"
 msgstr ""
 
-#: inet/rcmd.c:361
+#: sunrpc/auth_unix.c:118 sunrpc/auth_unix.c:124 sunrpc/auth_unix.c:153
+msgid "authunix_create: out of memory\n"
+msgstr ""
+
+#: inet/rcmd.c:365
 msgid "bad .rhosts owner"
 msgstr ""
 
-#: locale/programs/charmap.c:212 locale/programs/locfile.c:209
+#: locale/programs/charmap.c:212 locale/programs/locfile.c:231
 msgid "bad argument"
 msgstr ""
 
-#: time/zic.c:1176
+#: time/zic.c:1170
 msgid "blank FROM field on Link line"
 msgstr ""
 
-#: time/zic.c:1180
+#: time/zic.c:1174
 msgid "blank TO field on Link line"
 msgstr ""
 
@@ -1847,129 +2493,137 @@ msgstr ""
 msgid "bogus mcheck_status, library is buggy"
 msgstr ""
 
-#: sunrpc/pmap_rmt.c:179
+#: sunrpc/pmap_rmt.c:183
 msgid "broadcast: ioctl (get interface configuration)"
 msgstr ""
 
-#: sunrpc/pmap_rmt.c:186
+#: sunrpc/pmap_rmt.c:192
 msgid "broadcast: ioctl (get interface flags)"
 msgstr ""
 
-#: sunrpc/svc_udp.c:402
+#: sunrpc/svc_udp.c:439
+msgid "cache_set: could not allocate new rpc_buffer"
+msgstr ""
+
+#: sunrpc/svc_udp.c:433
+msgid "cache_set: victim alloc failed"
+msgstr ""
+
+#: sunrpc/svc_udp.c:422
 msgid "cache_set: victim not found"
 msgstr ""
 
-#: time/zic.c:1700
+#: time/zic.c:1698
 msgid "can't determine time zone abbreviation to use just after until time"
 msgstr ""
 
-#: sunrpc/svc_simple.c:64
+#: sunrpc/svc_simple.c:70
 #, c-format
 msgid "can't reassign procedure number %d\n"
 msgstr ""
 
-#: locale/programs/localedef.c:287
+#: locale/programs/localedef.c:271
 #, c-format
 msgid "cannot `stat' locale file `%s'"
 msgstr ""
 
-#: locale/programs/ld-collate.c:1314
+#: locale/programs/ld-collate.c:1317
 #, c-format
 msgid "cannot insert collation element `%.*s'"
 msgstr ""
 
-#: locale/programs/ld-collate.c:1493 locale/programs/ld-collate.c:1498
+#: locale/programs/ld-collate.c:1496 locale/programs/ld-collate.c:1501
 msgid "cannot insert into result table"
 msgstr ""
 
-#: locale/programs/ld-collate.c:1166 locale/programs/ld-collate.c:1208
+#: locale/programs/ld-collate.c:1169 locale/programs/ld-collate.c:1211
 #, c-format
 msgid "cannot insert new collating symbol definition: %s"
 msgstr ""
 
-#: db/makedb.c:161
+#: db/makedb.c:142
 #, c-format
 msgid "cannot open database file `%s': %s"
 msgstr ""
 
-#: catgets/gencat.c:260 db/makedb.c:180
+#: catgets/gencat.c:271 db/makedb.c:161
 #, c-format
 msgid "cannot open input file `%s'"
 msgstr ""
 
-#: locale/programs/localedef.c:221
+#: locale/programs/localedef.c:203
 #, c-format
 msgid "cannot open locale definition file `%s'"
 msgstr ""
 
-#: catgets/gencat.c:765 catgets/gencat.c:806 db/makedb.c:189
+#: catgets/gencat.c:776 catgets/gencat.c:817 db/makedb.c:170
 #, c-format
 msgid "cannot open output file `%s'"
 msgstr ""
 
-#: locale/programs/locfile.c:986
+#: locale/programs/locfile.c:1008
 #, c-format
 msgid "cannot open output file `%s' for category `%s'"
 msgstr ""
 
-#: locale/programs/ld-collate.c:1360
+#: locale/programs/ld-collate.c:1363
 msgid "cannot process order specification"
 msgstr ""
 
-#: locale/programs/locale.c:304
+#: locale/programs/locale.c:449
 #, c-format
 msgid "cannot read character map directory `%s'"
 msgstr ""
 
-#: locale/programs/locale.c:279
+#: locale/programs/locale.c:306
 #, c-format
 msgid "cannot read locale directory `%s'"
 msgstr ""
 
-#: locale/programs/localedef.c:309
+#: locale/programs/localedef.c:293
 #, c-format
 msgid "cannot read locale file `%s'"
 msgstr ""
 
-#: locale/programs/localedef.c:334
+#: locale/programs/localedef.c:318
 #, c-format
 msgid "cannot write output files to `%s'"
 msgstr ""
 
-#: locale/programs/localedef.c:377
+#: locale/programs/localedef.c:431
 msgid "category data requested more than once: should not happen"
 msgstr ""
 
-#: locale/programs/ld-ctype.c:265
+#: locale/programs/ld-ctype.c:266
 #, c-format
 msgid "character %s'%s' in class `%s' must be in class `%s'"
 msgstr ""
 
-#: locale/programs/ld-ctype.c:289
+#: locale/programs/ld-ctype.c:291
 #, c-format
 msgid "character %s'%s' in class `%s' must not be in class `%s'"
 msgstr ""
 
-#: locale/programs/ld-ctype.c:310
+#: locale/programs/ld-ctype.c:313
 msgid "character <SP> not defined in character map"
 msgstr ""
 
-#: locale/programs/ld-ctype.c:939 locale/programs/ld-ctype.c:1002
-#: locale/programs/ld-ctype.c:1010 locale/programs/ld-ctype.c:1018
-#: locale/programs/ld-ctype.c:1026 locale/programs/ld-ctype.c:1034
-#: locale/programs/ld-ctype.c:1042 locale/programs/ld-ctype.c:1068
-#: locale/programs/ld-ctype.c:1076 locale/programs/ld-ctype.c:1114
-#: locale/programs/ld-ctype.c:1141 locale/programs/ld-ctype.c:1152
+#: locale/programs/ld-ctype.c:944 locale/programs/ld-ctype.c:1007
+#: locale/programs/ld-ctype.c:1015 locale/programs/ld-ctype.c:1023
+#: locale/programs/ld-ctype.c:1031 locale/programs/ld-ctype.c:1039
+#: locale/programs/ld-ctype.c:1047 locale/programs/ld-ctype.c:1073
+#: locale/programs/ld-ctype.c:1081 locale/programs/ld-ctype.c:1119
+#: locale/programs/ld-ctype.c:1146 locale/programs/ld-ctype.c:1157
 #, c-format
 msgid "character `%s' not defined while needed as default value"
 msgstr ""
 
-#: locale/programs/ld-ctype.c:801
+#: locale/programs/ld-ctype.c:806
 #, c-format
 msgid "character class `%s' already defined"
 msgstr ""
 
-#: locale/programs/ld-ctype.c:833
+#: locale/programs/ld-ctype.c:838
 #, c-format
 msgid "character map `%s' already defined"
 msgstr ""
@@ -1979,21 +2633,29 @@ msgstr ""
 msgid "character map file `%s' not found"
 msgstr ""
 
-#: sunrpc/clnt_raw.c:106
+#: sunrpc/clnt_raw.c:112
 msgid "clnt_raw.c - Fatal header serialization error."
 msgstr ""
 
-#: locale/programs/ld-collate.c:1329
+#: sunrpc/clnt_tcp.c:125 sunrpc/clnt_tcp.c:133
+msgid "clnttcp_create: out of memory\n"
+msgstr ""
+
+#: sunrpc/clnt_udp.c:128 sunrpc/clnt_udp.c:138
+msgid "clntudp_create: out of memory\n"
+msgstr ""
+
+#: locale/programs/ld-collate.c:1332
 #, c-format
 msgid "collation element `%.*s' appears more than once: ignore line"
 msgstr ""
 
-#: locale/programs/ld-collate.c:1347
+#: locale/programs/ld-collate.c:1350
 #, c-format
 msgid "collation symbol `%.*s' appears more than once: ignore line"
 msgstr ""
 
-#: locale/programs/locfile.c:522
+#: locale/programs/locfile.c:544
 #, c-format
 msgid "collation symbol expected after `%s'"
 msgstr ""
@@ -2003,11 +2665,11 @@ msgstr ""
 msgid "connect to address %s: "
 msgstr ""
 
-#: sunrpc/svc_simple.c:70
+#: sunrpc/svc_simple.c:78
 msgid "couldn't create an rpc server\n"
 msgstr ""
 
-#: sunrpc/svc_simple.c:77
+#: sunrpc/svc_simple.c:86
 #, c-format
 msgid "couldn't register prog %d vers %d\n"
 msgstr ""
@@ -2017,14 +2679,14 @@ msgstr ""
 msgid "default character map file `%s' not found"
 msgstr ""
 
-#: locale/programs/ld-time.c:154
+#: locale/programs/ld-time.c:159
 #, c-format
 msgid ""
 "direction flag in string %d in `era' field in category `%s' is not '+' nor "
 "'-'"
 msgstr ""
 
-#: locale/programs/ld-time.c:164
+#: locale/programs/ld-time.c:169
 #, c-format
 msgid ""
 "direction flag in string %d in `era' field in category `%s' is not a single "
@@ -2036,86 +2698,90 @@ msgstr ""
 msgid "duplicate character name `%s'"
 msgstr ""
 
-#: locale/programs/ld-collate.c:1141
+#: locale/programs/ld-collate.c:1144
 msgid "duplicate collating element definition"
 msgstr ""
 
-#: locale/programs/ld-collate.c:1287
+#: locale/programs/ld-collate.c:1290
 #, c-format
 msgid "duplicate definition for character `%.*s'"
 msgstr ""
 
-#: db/makedb.c:311
+#: db/makedb.c:314
 msgid "duplicate key"
 msgstr ""
 
-#: catgets/gencat.c:379
+#: catgets/gencat.c:390
 msgid "duplicate set definition"
 msgstr ""
 
-#: time/zic.c:969
+#: time/zic.c:963
 #, c-format
 msgid "duplicate zone name %s (file \"%s\", line %d)"
 msgstr ""
 
-#: catgets/gencat.c:542
+#: catgets/gencat.c:553
 msgid "duplicated message identifier"
 msgstr ""
 
-#: catgets/gencat.c:515
+#: catgets/gencat.c:526
 msgid "duplicated message number"
 msgstr ""
 
-#: locale/programs/ld-collate.c:1696
+#: sunrpc/rpc_scan.c:384
+msgid "empty char string"
+msgstr ""
+
+#: locale/programs/ld-collate.c:1699
 msgid "empty weight name: line ignored"
 msgstr ""
 
-#: sunrpc/svc_udp.c:348
+#: sunrpc/svc_udp.c:365
 msgid "enablecache: cache already enabled"
 msgstr ""
 
-#: sunrpc/svc_udp.c:353
+#: sunrpc/svc_udp.c:371
 msgid "enablecache: could not allocate cache"
 msgstr ""
 
-#: sunrpc/svc_udp.c:360
+#: sunrpc/svc_udp.c:379
 msgid "enablecache: could not allocate cache data"
 msgstr ""
 
-#: sunrpc/svc_udp.c:366
+#: sunrpc/svc_udp.c:386
 msgid "enablecache: could not allocate cache fifo"
 msgstr ""
 
-#: locale/programs/ld-collate.c:1419
+#: locale/programs/ld-collate.c:1422
 msgid "end point of ellipsis range is bigger then start"
 msgstr ""
 
-#: locale/programs/ld-collate.c:1149
+#: locale/programs/ld-collate.c:1152
 msgid "error while inserting collation element into hash table"
 msgstr ""
 
-#: locale/programs/ld-collate.c:1161
+#: locale/programs/ld-collate.c:1164
 msgid "error while inserting to hash table"
 msgstr ""
 
-#: locale/programs/locfile.c:465
+#: locale/programs/locfile.c:487
 msgid "expect string argument for `copy'"
 msgstr ""
 
-#: time/zic.c:860
+#: time/zic.c:854
 msgid "expected continuation line not found"
 msgstr ""
 
-#: locale/programs/locfile.c:1010
+#: locale/programs/locfile.c:1032
 #, c-format
 msgid "failure while writing data for category `%s'"
 msgstr ""
 
-#: nis/ypclnt.c:186
+#: nis/ypclnt.c:187
 msgid "fcntl: F_SETFD"
 msgstr ""
 
-#: locale/programs/ld-monetary.c:154 locale/programs/ld-numeric.c:95
+#: locale/programs/ld-monetary.c:155 locale/programs/ld-numeric.c:95
 #, c-format
 msgid "field `%s' in category `%s' not defined"
 msgstr ""
@@ -2125,53 +2791,57 @@ msgstr ""
 msgid "field `%s' in category `%s' undefined"
 msgstr ""
 
-#: locale/programs/locfile.c:547
+#: locale/programs/locfile.c:569
 msgid "from-value of `collating-element' must be a string"
 msgstr ""
 
-#: locale/programs/linereader.c:328
+#: locale/programs/linereader.c:327
 msgid "garbage at end of character code specification"
 msgstr ""
 
-#: locale/programs/linereader.c:214
+#: locale/programs/linereader.c:213
 msgid "garbage at end of number"
 msgstr ""
 
-#: locale/programs/ld-time.c:183
+#: locale/programs/ld-time.c:188
 #, c-format
 msgid ""
 "garbage at end of offset value in string %d in `era' field in category `%s'"
 msgstr ""
 
-#: locale/programs/ld-time.c:238
+#: locale/programs/ld-time.c:243
 #, c-format
 msgid ""
 "garbage at end of starting date in string %d in `era' field in category `%s'"
 msgstr ""
 
-#: locale/programs/ld-time.c:310
+#: locale/programs/ld-time.c:316
 #, c-format
 msgid ""
 "garbage at end of stopping date in string %d in `era' field in category `%s'"
 msgstr ""
 
-#: sunrpc/get_myaddr.c:73
+#: sunrpc/get_myaddr.c:75
 msgid "get_myaddress: ioctl (get interface configuration)"
 msgstr ""
 
-#: time/zic.c:1153
+#: time/zic.c:1147
 msgid "illegal CORRECTION field on Leap line"
 msgstr ""
 
-#: time/zic.c:1157
+#: time/zic.c:1151
 msgid "illegal Rolling/Stationary field on Leap line"
 msgstr ""
 
-#: locale/programs/ld-collate.c:1767
+#: locale/programs/ld-collate.c:1770
 msgid "illegal character constant in string"
 msgstr ""
 
-#: locale/programs/ld-collate.c:1116
+#: sunrpc/rpc_scan.c:313
+msgid "illegal character in file: "
+msgstr ""
+
+#: locale/programs/ld-collate.c:1119
 msgid "illegal collation element"
 msgstr ""
 
@@ -2183,7 +2853,7 @@ msgstr ""
 msgid "illegal encoding given"
 msgstr ""
 
-#: locale/programs/linereader.c:546
+#: locale/programs/linereader.c:545
 msgid "illegal escape sequence at end of string"
 msgstr ""
 
@@ -2191,118 +2861,118 @@ msgstr ""
 msgid "illegal names for character range"
 msgstr ""
 
-#: locale/programs/ld-time.c:176
+#: locale/programs/ld-time.c:181
 #, c-format
 msgid "illegal number for offset in string %d in `era' field in category `%s'"
 msgstr ""
 
-#: catgets/gencat.c:352 catgets/gencat.c:429
+#: catgets/gencat.c:363 catgets/gencat.c:440
 msgid "illegal set number"
 msgstr ""
 
-#: locale/programs/ld-time.c:230
+#: locale/programs/ld-time.c:235
 #, c-format
 msgid "illegal starting date in string %d in `era' field in category `%s'"
 msgstr ""
 
-#: locale/programs/ld-time.c:302
+#: locale/programs/ld-time.c:308
 #, c-format
 msgid "illegal stopping date in string %d in `era' field in category `%s'"
 msgstr ""
 
-#: locale/programs/ld-ctype.c:807
+#: locale/programs/ld-ctype.c:812
 #, c-format
 msgid "implementation limit: no more than %d character classes allowed"
 msgstr ""
 
-#: locale/programs/ld-ctype.c:839
+#: locale/programs/ld-ctype.c:844
 #, c-format
 msgid "implementation limit: no more than %d character maps allowed"
 msgstr ""
 
-#: db/makedb.c:163
+#: db/makedb.c:144
 msgid "incorrectly formatted file"
 msgstr ""
 
-#: time/zic.c:817
+#: time/zic.c:811
 msgid "input line of unknown type"
 msgstr ""
 
-#: time/zic.c:1748
+#: time/zic.c:1760
 msgid "internal error - addtype called with bad isdst"
 msgstr ""
 
-#: time/zic.c:1756
+#: time/zic.c:1768
 msgid "internal error - addtype called with bad ttisgmt"
 msgstr ""
 
-#: time/zic.c:1752
+#: time/zic.c:1764
 msgid "internal error - addtype called with bad ttisstd"
 msgstr ""
 
-#: locale/programs/ld-ctype.c:301
+#: locale/programs/ld-ctype.c:304
 #, c-format
 msgid "internal error in %s, line %u"
 msgstr ""
 
-#: time/zic.c:1025
+#: time/zic.c:1019
 msgid "invalid GMT offset"
 msgstr ""
 
-#: time/zic.c:1028
+#: time/zic.c:1022
 msgid "invalid abbreviation format"
 msgstr ""
 
-#: time/zic.c:1118 time/zic.c:1317 time/zic.c:1331
+#: time/zic.c:1112 time/zic.c:1313 time/zic.c:1327
 msgid "invalid day of month"
 msgstr ""
 
-#: time/zic.c:1276
+#: time/zic.c:1270
 msgid "invalid ending year"
 msgstr ""
 
-#: time/zic.c:1090
+#: time/zic.c:1084
 msgid "invalid leaping year"
 msgstr ""
 
-#: time/zic.c:1105 time/zic.c:1208
+#: time/zic.c:1099 time/zic.c:1202
 msgid "invalid month name"
 msgstr ""
 
-#: time/zic.c:924
+#: time/zic.c:918
 msgid "invalid saved time"
 msgstr ""
 
-#: time/zic.c:1256
+#: time/zic.c:1250
 msgid "invalid starting year"
 msgstr ""
 
-#: time/zic.c:1134 time/zic.c:1236
+#: time/zic.c:1128 time/zic.c:1230
 msgid "invalid time of day"
 msgstr ""
 
-#: time/zic.c:1322
+#: time/zic.c:1318
 msgid "invalid weekday name"
 msgstr ""
 
-#: locale/programs/ld-collate.c:1412
+#: locale/programs/ld-collate.c:1415
 msgid "line after ellipsis must contain character definition"
 msgstr ""
 
-#: locale/programs/ld-collate.c:1391
+#: locale/programs/ld-collate.c:1394
 msgid "line before ellipsis does not contain definition for character constant"
 msgstr ""
 
-#: time/zic.c:797
+#: time/zic.c:791
 msgid "line too long"
 msgstr ""
 
-#: locale/programs/localedef.c:281
+#: locale/programs/localedef.c:265
 #, c-format
 msgid "locale file `%s', used in `copy' statement, not found"
 msgstr ""
 
-#: catgets/gencat.c:610
+#: catgets/gencat.c:621
 msgid "malformed line ignored"
 msgstr ""
 
@@ -2315,8 +2985,8 @@ msgid "memory clobbered past end of allocated block"
 msgstr ""
 
 #: locale/programs/ld-collate.c:167 locale/programs/ld-collate.c:173
-#: locale/programs/ld-collate.c:177 locale/programs/ld-collate.c:1439
-#: locale/programs/ld-collate.c:1468 locale/programs/locfile.c:940
+#: locale/programs/ld-collate.c:177 locale/programs/ld-collate.c:1442
+#: locale/programs/ld-collate.c:1471 locale/programs/locfile.c:962
 #: locale/programs/xmalloc.c:68 posix/getconf.c:250
 msgid "memory exhausted"
 msgstr ""
@@ -2329,21 +2999,25 @@ msgstr ""
 msgid "memory is consistent, library is buggy"
 msgstr ""
 
-#: locale/programs/ld-time.c:348
+#: locale/programs/ld-time.c:355
 #, c-format
 msgid "missing era format in string %d in `era' field in category `%s'"
 msgstr ""
 
-#: locale/programs/ld-time.c:337
+#: locale/programs/ld-time.c:344
 #, c-format
 msgid "missing era name in string %d in `era' field in category `%s'"
 msgstr ""
 
-#: time/zic.c:919
+#: gmon/gmon.c:128
+msgid "monstartup: out of memory\n"
+msgstr ""
+
+#: time/zic.c:913
 msgid "nameless rule"
 msgstr ""
 
-#: sunrpc/svc_simple.c:140
+#: sunrpc/svc_simple.c:153
 #, c-format
 msgid "never registered prog %d\n"
 msgstr ""
@@ -2353,19 +3027,19 @@ msgstr ""
 msgid "no correct regular expression for field `%s' in category `%s': %s"
 msgstr ""
 
-#: time/zic.c:2074
+#: time/zic.c:2086
 msgid "no day in month matches rule"
 msgstr ""
 
-#: locale/programs/ld-collate.c:259
+#: locale/programs/ld-collate.c:260
 msgid "no definition of `UNDEFINED'"
 msgstr ""
 
-#: locale/programs/locfile.c:479
+#: locale/programs/locfile.c:501
 msgid "no other keyword shall be specified when `copy' is used"
 msgstr ""
 
-#: locale/programs/localedef.c:340
+#: locale/programs/localedef.c:324
 msgid "no output file produced because warning were issued"
 msgstr ""
 
@@ -2388,23 +3062,31 @@ msgstr ""
 msgid "only WIDTH definitions are allowed to follow the CHARMAP definition"
 msgstr ""
 
-#: db/makedb.c:327
+#: sunrpc/pm_getmaps.c:73
+msgid "pmap_getmaps rpc problem"
+msgstr ""
+
+#: sunrpc/rpc_scan.c:525 sunrpc/rpc_scan.c:535
+msgid "preprocessor error"
+msgstr ""
+
+#: db/makedb.c:330
 #, c-format
 msgid "problems while reading `%s'"
 msgstr ""
 
-#: sunrpc/rpcinfo.c:222 sunrpc/rpcinfo.c:350
+#: sunrpc/rpcinfo.c:237 sunrpc/rpcinfo.c:384
 #, c-format
 msgid "program %lu is not available\n"
 msgstr ""
 
-#: sunrpc/rpcinfo.c:245 sunrpc/rpcinfo.c:282 sunrpc/rpcinfo.c:371
-#: sunrpc/rpcinfo.c:408 sunrpc/rpcinfo.c:429 sunrpc/rpcinfo.c:462
+#: sunrpc/rpcinfo.c:265 sunrpc/rpcinfo.c:311 sunrpc/rpcinfo.c:409
+#: sunrpc/rpcinfo.c:455 sunrpc/rpcinfo.c:478 sunrpc/rpcinfo.c:512
 #, c-format
 msgid "program %lu version %lu is not available\n"
 msgstr ""
 
-#: sunrpc/rpcinfo.c:466
+#: sunrpc/rpcinfo.c:518
 #, c-format
 msgid "program %lu version %lu ready and waiting\n"
 msgstr ""
@@ -2423,43 +3105,43 @@ msgstr ""
 msgid "rcmd: write (setting up stderr): %m\n"
 msgstr ""
 
-#: sunrpc/svc_simple.c:83
+#: sunrpc/svc_simple.c:93
 msgid "registerrpc: out of memory\n"
 msgstr ""
 
-#: time/zic.c:1809
+#: time/zic.c:1821
 msgid "repeated leap second moment"
 msgstr ""
 
-#: sunrpc/rpcinfo.c:659
+#: sunrpc/rpcinfo.c:733
 #, c-format
 msgid "rpcinfo: %s is unknown host\n"
 msgstr ""
 
-#: sunrpc/rpcinfo.c:626
+#: sunrpc/rpcinfo.c:696
 #, c-format
 msgid "rpcinfo: %s is unknown service\n"
 msgstr ""
 
-#: sunrpc/rpcinfo.c:600
+#: sunrpc/rpcinfo.c:668
 #, c-format
 msgid "rpcinfo: Could not delete registration for prog %s version %s\n"
 msgstr ""
 
-#: sunrpc/rpcinfo.c:576
+#: sunrpc/rpcinfo.c:640
 #, c-format
 msgid "rpcinfo: broadcast failed: %s\n"
 msgstr ""
 
-#: sunrpc/rpcinfo.c:505
+#: sunrpc/rpcinfo.c:560
 msgid "rpcinfo: can't contact portmapper"
 msgstr ""
 
-#: sunrpc/rpcinfo.c:510
+#: sunrpc/rpcinfo.c:567
 msgid "rpcinfo: can't contact portmapper: "
 msgstr ""
 
-#: time/zic.c:710 time/zic.c:712
+#: time/zic.c:704 time/zic.c:706
 msgid "same rule name in multiple files"
 msgstr ""
 
@@ -2471,90 +3153,98 @@ msgstr ""
 msgid "socket: protocol failure in circuit setup\n"
 msgstr ""
 
-#: locale/programs/locfile.c:600
+#: locale/programs/locfile.c:622
 msgid "sorting order `forward' and `backward' are mutually exclusive"
 msgstr ""
 
-#: locale/programs/ld-collate.c:1568 locale/programs/ld-collate.c:1614
+#: locale/programs/ld-collate.c:1571 locale/programs/ld-collate.c:1617
 msgid ""
 "specification of sorting weight for collation symbol does not make sense"
 msgstr ""
 
-#: time/zic.c:781
+#: time/zic.c:775
 msgid "standard input"
 msgstr ""
 
-#: time/zdump.c:260
+#: time/zdump.c:268
 msgid "standard output"
 msgstr ""
 
-#: locale/programs/ld-time.c:256
+#: locale/programs/ld-time.c:262
 #, c-format
 msgid "starting date is illegal in string %d in `era' field in category `%s'"
 msgstr ""
 
-#: time/zic.c:1280
+#: time/zic.c:1274
 msgid "starting year greater than ending year"
 msgstr ""
 
-#: locale/programs/ld-time.c:328
+#: locale/programs/ld-time.c:335
 #, c-format
 msgid "stopping date is illegal in string %d in `era' field in category `%s'"
 msgstr ""
 
-#: sunrpc/svc_tcp.c:201 sunrpc/svc_tcp.c:206
+#: sunrpc/svc_run.c:66
+msgid "svc_run: - select failed"
+msgstr ""
+
+#: sunrpc/svc_tcp.c:202 sunrpc/svc_tcp.c:208
 msgid "svc_tcp: makefd_xprt: out of memory\n"
 msgstr ""
 
-#: sunrpc/svc_tcp.c:149
+#: sunrpc/svc_tcp.c:154
 msgid "svctcp_.c - cannot getsockname or listen"
 msgstr ""
 
-#: sunrpc/svc_tcp.c:136
+#: sunrpc/svc_tcp.c:139
 msgid "svctcp_.c - udp socket creation problem"
 msgstr ""
 
-#: sunrpc/svc_tcp.c:156 sunrpc/svc_tcp.c:163
+#: sunrpc/svc_tcp.c:162 sunrpc/svc_tcp.c:170
 msgid "svctcp_create: out of memory\n"
 msgstr ""
 
-#: sunrpc/svc_udp.c:123
+#: sunrpc/svc_udp.c:131
 msgid "svcudp_create - cannot getsockname"
 msgstr ""
 
-#: sunrpc/svc_udp.c:111
+#: sunrpc/svc_udp.c:139 sunrpc/svc_udp.c:145 sunrpc/svc_udp.c:151
+msgid "svcudp_create: out of memory\n"
+msgstr ""
+
+#: sunrpc/svc_udp.c:117
 msgid "svcudp_create: socket creation problem"
 msgstr ""
 
-#: locale/programs/ld-collate.c:1191
+#: locale/programs/ld-collate.c:1194
 #, c-format
 msgid ""
 "symbol for multicharacter collating element `%.*s' duplicates element "
 "definition"
 msgstr ""
 
-#: locale/programs/ld-collate.c:1064
+#: locale/programs/ld-collate.c:1067
 #, c-format
 msgid ""
 "symbol for multicharacter collating element `%.*s' duplicates other element "
 "definition"
 msgstr ""
 
-#: locale/programs/ld-collate.c:1200
+#: locale/programs/ld-collate.c:1203
 #, c-format
 msgid ""
 "symbol for multicharacter collating element `%.*s' duplicates other symbol "
 "definition"
 msgstr ""
 
-#: locale/programs/ld-collate.c:1073
+#: locale/programs/ld-collate.c:1076
 #, c-format
 msgid ""
 "symbol for multicharacter collating element `%.*s' duplicates symbol "
 "definition"
 msgstr ""
 
-#: locale/programs/ld-collate.c:1055 locale/programs/ld-collate.c:1182
+#: locale/programs/ld-collate.c:1058 locale/programs/ld-collate.c:1185
 #, c-format
 msgid ""
 "symbol for multicharacter collating element `%.*s' duplicates symbolic name "
@@ -2569,51 +3259,51 @@ msgstr ""
 msgid "syntax error in %s definition: %s"
 msgstr ""
 
-#: locale/programs/locfile.c:620
+#: locale/programs/locfile.c:642
 msgid "syntax error in `order_start' directive"
 msgstr ""
 
-#: locale/programs/locfile.c:362
+#: locale/programs/locfile.c:384
 msgid "syntax error in character class definition"
 msgstr ""
 
-#: locale/programs/locfile.c:420
+#: locale/programs/locfile.c:442
 msgid "syntax error in character conversion definition"
 msgstr ""
 
-#: locale/programs/locfile.c:662
+#: locale/programs/locfile.c:684
 msgid "syntax error in collating order definition"
 msgstr ""
 
-#: locale/programs/locfile.c:512
+#: locale/programs/locfile.c:534
 msgid "syntax error in collation definition"
 msgstr ""
 
-#: locale/programs/locfile.c:335
+#: locale/programs/locfile.c:357
 msgid "syntax error in definition of LC_CTYPE category"
 msgstr ""
 
-#: locale/programs/locfile.c:278
+#: locale/programs/locfile.c:300
 msgid "syntax error in definition of new character class"
 msgstr ""
 
-#: locale/programs/locfile.c:288
+#: locale/programs/locfile.c:310
 msgid "syntax error in definition of new character map"
 msgstr ""
 
-#: locale/programs/locfile.c:873
+#: locale/programs/locfile.c:895
 msgid "syntax error in message locale definition"
 msgstr ""
 
-#: locale/programs/locfile.c:784
+#: locale/programs/locfile.c:806
 msgid "syntax error in monetary locale definition"
 msgstr ""
 
-#: locale/programs/locfile.c:811
+#: locale/programs/locfile.c:833
 msgid "syntax error in numeric locale definition"
 msgstr ""
 
-#: locale/programs/locfile.c:722
+#: locale/programs/locfile.c:744
 msgid "syntax error in order specification"
 msgstr ""
 
@@ -2622,23 +3312,23 @@ msgstr ""
 msgid "syntax error in prolog: %s"
 msgstr ""
 
-#: locale/programs/locfile.c:849
+#: locale/programs/locfile.c:871
 msgid "syntax error in time locale definition"
 msgstr ""
 
-#: locale/programs/locfile.c:255
+#: locale/programs/locfile.c:277
 msgid "syntax error: not inside a locale definition section"
 msgstr ""
 
-#: catgets/gencat.c:381 catgets/gencat.c:517 catgets/gencat.c:544
+#: catgets/gencat.c:392 catgets/gencat.c:528 catgets/gencat.c:555
 msgid "this is the first definition"
 msgstr ""
 
-#: time/zic.c:1123
+#: time/zic.c:1117
 msgid "time before zero"
 msgstr ""
 
-#: time/zic.c:1131 time/zic.c:1974 time/zic.c:1993
+#: time/zic.c:1125 time/zic.c:1986 time/zic.c:2005
 msgid "time overflow"
 msgstr ""
 
@@ -2654,23 +3344,23 @@ msgstr ""
 msgid "too many character classes defined"
 msgstr ""
 
-#: time/zic.c:1803
+#: time/zic.c:1815
 msgid "too many leap seconds"
 msgstr ""
 
-#: time/zic.c:1775
+#: time/zic.c:1787
 msgid "too many local time types"
 msgstr ""
 
-#: time/zic.c:1729
+#: time/zic.c:1741
 msgid "too many transitions?!"
 msgstr ""
 
-#: locale/programs/ld-collate.c:1623
+#: locale/programs/ld-collate.c:1626
 msgid "too many weights"
 msgstr ""
 
-#: time/zic.c:2097
+#: time/zic.c:2109
 msgid "too many, or too long, time zone abbreviations"
 msgstr ""
 
@@ -2678,16 +3368,16 @@ msgstr ""
 msgid "trailing garbage at end of line"
 msgstr ""
 
-#: sunrpc/svc_simple.c:132
+#: sunrpc/svc_simple.c:145
 #, c-format
 msgid "trouble replying to prog %d\n"
 msgstr ""
 
-#: locale/programs/ld-collate.c:1383
+#: locale/programs/ld-collate.c:1386
 msgid "two lines in a row containing `...' are not allowed"
 msgstr ""
 
-#: time/zic.c:1287
+#: time/zic.c:1281
 msgid "typed single year"
 msgstr ""
 
@@ -2702,48 +3392,52 @@ msgstr ""
 
 #: locale/programs/ld-messages.c:193 locale/programs/ld-messages.c:204
 #: locale/programs/ld-messages.c:215 locale/programs/ld-messages.c:226
-#: locale/programs/ld-time.c:696
+#: locale/programs/ld-time.c:703
 #, c-format
 msgid "unknown character in field `%s' of category `%s'"
 msgstr ""
 
-#: locale/programs/locfile.c:585
+#: locale/programs/locfile.c:607
 msgid "unknown collation directive"
 msgstr ""
 
-#: catgets/gencat.c:478
+#: catgets/gencat.c:489
 #, c-format
 msgid "unknown directive `%s': line ignored"
 msgstr ""
 
-#: catgets/gencat.c:457
+#: catgets/gencat.c:468
 #, c-format
 msgid "unknown set `%s'"
 msgstr ""
 
-#: locale/programs/ld-collate.c:1367 locale/programs/ld-collate.c:1558
-#: locale/programs/ld-collate.c:1732
+#: locale/programs/ld-collate.c:1370 locale/programs/ld-collate.c:1561
+#: locale/programs/ld-collate.c:1735
 #, c-format
 msgid "unknown symbol `%.*s': line ignored"
 msgstr ""
 
-#: time/zic.c:753
+#: time/zic.c:747
 msgid "unruly zone"
 msgstr ""
 
-#: catgets/gencat.c:962
+#: catgets/gencat.c:973
 msgid "unterminated message"
 msgstr ""
 
-#: locale/programs/linereader.c:515 locale/programs/linereader.c:550
+#: locale/programs/linereader.c:514 locale/programs/linereader.c:549
 msgid "unterminated string"
 msgstr ""
 
-#: locale/programs/linereader.c:385
+#: sunrpc/rpc_scan.c:352 sunrpc/rpc_scan.c:378
+msgid "unterminated string constant"
+msgstr ""
+
+#: locale/programs/linereader.c:384
 msgid "unterminated symbolic name"
 msgstr ""
 
-#: locale/programs/ld-collate.c:1685
+#: locale/programs/ld-collate.c:1688
 msgid "unterminated weight name"
 msgstr ""
 
@@ -2751,7 +3445,7 @@ msgstr ""
 msgid "upper limit in range is not smaller then lower limit"
 msgstr ""
 
-#: time/zic.c:2040
+#: time/zic.c:2052
 msgid "use of 2/29 in non leap-year"
 msgstr ""
 
@@ -2765,7 +3459,7 @@ msgstr ""
 msgid "value for <%s> must lie between 1 and 4"
 msgstr ""
 
-#: locale/programs/ld-monetary.c:148 locale/programs/ld-numeric.c:89
+#: locale/programs/ld-monetary.c:149 locale/programs/ld-numeric.c:89
 #, c-format
 msgid "value for field `%s' in category `%s' must not be the empty string"
 msgstr ""
@@ -2774,7 +3468,7 @@ msgstr ""
 msgid "value of <mb_cur_max> must be greater than the value of <mb_cur_min>"
 msgstr ""
 
-#: locale/programs/ld-monetary.c:138
+#: locale/programs/ld-monetary.c:139
 msgid ""
 "value of field `int_curr_symbol' in category `LC_MONETARY' does not "
 "correspond to a valid name in ISO 4217"
@@ -2785,60 +3479,67 @@ msgid ""
 "value of field `int_curr_symbol' in category `LC_MONETARY' has wrong length"
 msgstr ""
 
-#: locale/programs/ld-monetary.c:370 locale/programs/ld-numeric.c:199
+#: locale/programs/ld-monetary.c:373 locale/programs/ld-numeric.c:204
 #, c-format
 msgid "values for field `%s' in category `%s' must be smaller than 127"
 msgstr ""
 
-#: locale/programs/ld-monetary.c:366
-#, c-format
-msgid "values for field `%s' in category `%s' must not be zero"
-msgstr ""
-
 #: login/utmp_file.c:84
 msgid "while opening UTMP file"
 msgstr ""
 
-#: catgets/gencat.c:989
+#: catgets/gencat.c:1000
 msgid "while opening old catalog file"
 msgstr ""
 
-#: db/makedb.c:354
+#: locale/programs/locale.c:346
+msgid "while preparing output"
+msgstr ""
+
+#: db/makedb.c:357
 msgid "while reading database"
 msgstr ""
 
-#: db/makedb.c:316
+#: db/makedb.c:319
 msgid "while writing data base file"
 msgstr ""
 
-#: db/makedb.c:142
+#: db/makedb.c:122
 msgid "wrong number of arguments"
 msgstr ""
 
-#: time/zic.c:1081
+#: time/zic.c:1075
 msgid "wrong number of fields on Leap line"
 msgstr ""
 
-#: time/zic.c:1172
+#: time/zic.c:1166
 msgid "wrong number of fields on Link line"
 msgstr ""
 
-#: time/zic.c:915
+#: time/zic.c:909
 msgid "wrong number of fields on Rule line"
 msgstr ""
 
-#: time/zic.c:985
+#: time/zic.c:979
 msgid "wrong number of fields on Zone continuation line"
 msgstr ""
 
-#: time/zic.c:943
+#: time/zic.c:937
 msgid "wrong number of fields on Zone line"
 msgstr ""
 
-#: nis/ypclnt.c:810
+#: sunrpc/xdr_ref.c:79
+msgid "xdr_reference: out of memory\n"
+msgstr ""
+
+#: sunrpc/xdr_rec.c:146 sunrpc/xdr_rec.c:161
+msgid "xdrrec_create: out of memory\n"
+msgstr ""
+
+#: nis/ypclnt.c:813
 msgid "yp_update: cannot convert host to netname\n"
 msgstr ""
 
-#: nis/ypclnt.c:822
+#: nis/ypclnt.c:825
 msgid "yp_update: cannot get server address\n"
 msgstr ""
diff --git a/stdio-common/bug5.c b/stdio-common/bug5.c
index 59fb6bb9d9..8c3d0e3bc7 100644
--- a/stdio-common/bug5.c
+++ b/stdio-common/bug5.c
@@ -56,6 +56,10 @@ main (void)
   puts ("There should be no further output from this test.");
   fflush (stdout);
 
+  /* We must remove this entry to assure the `cmp' binary does not use
+     the perhaps incompatible new shared libraries.  */
+  unsetenv ("LD_LIBRARY_PATH");
+
   asprintf (&printbuf, "cmp %s %s", inname, outname);
   result = system (printbuf);
   remove (inname);
diff --git a/stdio-common/test-popen.c b/stdio-common/test-popen.c
index a17606e503..426da4a24c 100644
--- a/stdio-common/test-popen.c
+++ b/stdio-common/test-popen.c
@@ -1,9 +1,27 @@
-#include <ansidecl.h>
+/* Copyright (C) 1997 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., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+
 #include <stdio.h>
 #include <stdlib.h>
 
 void
-DEFUN(write_data, (stream), FILE *stream)
+write_data (FILE *stream)
 {
   int i;
   for (i=0; i<100; i++)
@@ -15,7 +33,7 @@ DEFUN(write_data, (stream), FILE *stream)
 }
 
 void
-DEFUN(read_data, (stream), FILE *stream)
+read_data (FILE *stream)
 {
   int i, j;
 
@@ -32,11 +50,15 @@ DEFUN(read_data, (stream), FILE *stream)
 }
 
 int
-DEFUN_VOID(main)
+main (void)
 {
   FILE *output, *input;
   int wstatus, rstatus;
 
+  /* We must remove this entry to assure the `cat' binary does not use
+     the perhaps incompatible new shared libraries.  */
+  unsetenv ("LD_LIBRARY_PATH");
+
   output = popen ("/bin/cat >/tmp/tstpopen.tmp", "w");
   if (output == NULL)
     {
diff --git a/sysdeps/libm-i387/s_cexp.S b/sysdeps/libm-i387/s_cexp.S
new file mode 100644
index 0000000000..48e002b2f6
--- /dev/null
+++ b/sysdeps/libm-i387/s_cexp.S
@@ -0,0 +1,248 @@
+/* ix87 specific implementation of complex exponential function for double.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <sysdep.h>
+
+#ifdef __ELF__
+	.section .rodata
+#else
+	.text
+#endif
+	.align ALIGNARG(4)
+	ASM_TYPE_DIRECTIVE(huge_nan_null_null,@object)
+huge_nan_null_null:
+	.byte 0, 0, 0, 0, 0, 0, 0xf0, 0x7f
+	.byte 0, 0, 0, 0, 0, 0, 0xff, 0x7f
+	.double	0.0
+	.double	0.0
+	.byte 0, 0, 0, 0, 0, 0, 0xf0, 0x7f
+	.byte 0, 0, 0, 0, 0, 0, 0xff, 0x7f
+	.double 0.0
+	.byte 0, 0, 0, 0, 0, 0, 0, 0x80
+	ASM_SIZE_DIRECTIVE(huge_nan_null_null)
+
+	ASM_TYPE_DIRECTIVE(twopi,@object)
+twopi:
+	.byte 0x35, 0xc2, 0x68, 0x21, 0xa2, 0xda, 0xf, 0xc9, 0x1, 0x40
+	.byte 0, 0, 0, 0, 0, 0
+	ASM_SIZE_DIRECTIVE(twopi)
+
+	ASM_TYPE_DIRECTIVE(l2e,@object)
+l2e:
+	.byte 0xbc, 0xf0, 0x17, 0x5c, 0x29, 0x3b, 0xaa, 0xb8, 0xff, 0x3f
+	.byte 0, 0, 0, 0, 0, 0
+	ASM_SIZE_DIRECTIVE(l2e)
+
+	ASM_TYPE_DIRECTIVE(one,@object)
+one:	.double 1.0
+	ASM_SIZE_DIRECTIVE(one)
+
+
+#ifdef PIC
+#define MO(op) op##@GOTOFF(%ecx)
+#define MOX(op,x,f) op##@GOTOFF(%ecx,x,f)
+#else
+#define MO(op) op
+#define MOX(op,x,f) op(,x,f)
+#endif
+
+	.text
+ENTRY(__cexp)
+	fldl	8(%esp)			/* x */
+	fxam
+	fnstsw
+	fldl	16(%esp)		/* y : x */
+#ifdef  PIC
+        call    1f
+1:      popl    %ecx
+        addl    $_GLOBAL_OFFSET_TABLE_+[.-1b], %ecx
+#endif
+	movb	%ah, %dh
+	andb	$0x45, %ah
+	cmpb	$0x05, %ah
+	je	1f			/* Jump if real part is +-Inf */
+	cmpb	$0x01, %ah
+	je	2f			/* Jump if real part is NaN */
+
+	fxam				/* y : x */
+	fnstsw
+	/* If the imaginary part is not finite we return NaN+i NaN, as
+	   for the case when the real part is NaN.  A test for +-Inf and
+	   NaN would be necessary.  But since we know the stack register
+	   we applied `fxam' to is not empty we can simply use one test.
+	   Check your FPU manual for more information.  */
+	andb	$0x01, %ah
+	cmpb	$0x01, %ah
+	je	2f
+
+	/* We have finite numbers in the real and imaginary part.  Do
+	   the real work now.  */
+	fxch			/* x : y */
+	fldt	MO(l2e)		/* log2(e) : x : y */
+	fmulp			/* x * log2(e) : y */
+	fld	%st		/* x * log2(e) : x * log2(e) : y */
+	frndint			/* int(x * log2(e)) : x * log2(e) : y */
+	fsubr	%st, %st(1)	/* int(x * log2(e)) : frac(x * log2(e)) : y */
+	fxch			/* frac(x * log2(e)) : int(x * log2(e)) : y */
+	f2xm1			/* 2^frac(x * log2(e))-1 : int(x * log2(e)) : y */
+	faddl	MO(one)		/* 2^frac(x * log2(e)) : int(x * log2(e)) : y */
+	fscale			/* e^x : int(x * log2(e)) : y */
+	fst	%st(1)		/* e^x : e^x : y */
+	fxch	%st(2)		/* y : e^x : e^x */
+	fsincos			/* cos(y) : sin(y) : e^x : e^x */
+	fnstsw
+	testl	$0x400, %eax
+	jnz	7f
+	fmulp	%st, %st(3)	/* sin(y) : e^x : e^x * cos(y) */
+	fmulp	%st, %st(1)	/* e^x * sin(y) : e^x * cos(y) */
+	movl	4(%esp), %eax		/* Pointer to memory for result.  */
+	fstpl	8(%eax)
+	fstpl	(%eax)
+	ret	$4
+
+	/* We have to reduce the argument to fsincos.  */
+	.align ALIGNARG(4)
+7:	fldt	MO(twopi)	/* 2*pi : y : e^x : e^x */
+	fxch			/* y : 2*pi : e^x : e^x */
+8:	fprem1			/* y%(2*pi) : 2*pi : e^x : e^x */
+	fnstsw
+	testl	$0x400, %eax
+	jnz	8b
+	fstp	%st(1)		/* y%(2*pi) : e^x : e^x */
+	fsincos			/* cos(y) : sin(y) : e^x : e^x */
+	fmulp	%st, %st(3)
+	fmulp	%st, %st(1)
+	movl	4(%esp), %eax		/* Pointer to memory for result.  */
+	fstpl	8(%eax)
+	fstpl	(%eax)
+	ret	$4
+
+	/* The real part is +-inf.  We must make further differences.  */
+	.align ALIGNARG(4)
+1:	fxam			/* y : x */
+	fnstsw
+	movb	%ah, %dl
+	andb	$0x01, %ah	/* See above why 0x01 is usable here.  */
+	cmpb	$0x01, %ah
+	je	3f
+
+
+	/* The real part is +-Inf and the imaginary part is finite.  */
+	andl	$0x245, %edx
+	cmpb	$0x40, %dl	/* Imaginary part == 0?  */
+	je	4f		/* Yes ->  */
+
+	fxch			/* x : y */
+	shrl	$5, %edx
+	fstp	%st(0)		/* y */ /* Drop the real part.  */
+	andl	$16, %edx	/* This puts the sign bit of the real part
+				   in bit 4.  So we can use it to index a
+				   small array to select 0 or Inf.  */
+	fsincos			/* cos(y) : sin(y) */
+	fnstsw
+	testl	$0x0400, %eax
+	jnz	5f
+	fldl	MOX(huge_nan_null_null,%edx,1)
+	movl	4(%esp), %edx		/* Pointer to memory for result.  */
+	fstl	8(%edx)
+	fstpl	(%edx)
+	ftst
+	fnstsw
+	shll	$23, %eax
+	andl	$0x80000000, %eax
+	orl	%eax, 4(%edx)
+	fstp	%st(0)
+	ftst
+	fnstsw
+	shll	$23, %eax
+	andl	$0x80000000, %eax
+	orl	%eax, 12(%edx)
+	fstp	%st(0)
+	ret	$4
+	/* We must reduce the argument to fsincos.  */
+	.align ALIGNARG(4)
+5:	fldt	MO(twopi)
+	fxch
+6:	fprem1
+	fnstsw
+	testl	$0x400, %eax
+	jnz	6b
+	fstp	%st(1)
+	fsincos
+	fldl	MOX(huge_nan_null_null,%edx,1)
+	movl	4(%esp), %edx		/* Pointer to memory for result.  */
+	fstl	8(%edx)
+	fstpl	(%edx)
+	ftst
+	fnstsw
+	shll	$23, %eax
+	andl	$0x80000000, %eax
+	orl	%eax, 4(%edx)
+	fstp	%st(0)
+	ftst
+	fnstsw
+	shll	$23, %eax
+	andl	$0x80000000, %eax
+	orl	%eax, 12(%edx)
+	fstp	%st(0)
+	ret	$4
+
+	/* The real part is +-Inf and the imaginary part is +-0.  So return
+	   +-Inf+-0i.  */
+	.align ALIGNARG(4)
+4:	movl	4(%esp), %eax		/* Pointer to memory for result.  */
+	fstpl	8(%eax)
+	shrl	$5, %edx
+	fstp	%st(0)
+	andl	$16, %edx
+	fldl	MOX(huge_nan_null_null,%edx,1)
+	fstpl	(%eax)
+	ret	$4
+
+	/* The real part is +-Inf, the imaginary is also is not finite.  */
+	.align ALIGNARG(4)
+3:	fstp	%st(0)
+	fstp	%st(0)		/* <empty> */
+	movl	%edx, %eax
+	shrl	$5, %edx
+	shll	$4, %eax
+	andl	$16, %edx
+	andl	$32, %eax
+	orl	%eax, %edx
+	movl	4(%esp), %eax		/* Pointer to memory for result.  */
+
+	fldl	MOX(huge_nan_null_null,%edx,1)
+	fldl	MOX(huge_nan_null_null+8,%edx,1)
+	fstpl	8(%eax)
+	fstpl	(%eax)
+	ret	$4
+
+	/* The real part is NaN.  */
+	.align ALIGNARG(4)
+2:	fstp	%st(0)
+	fstp	%st(0)
+	movl	4(%esp), %eax		/* Pointer to memory for result.  */
+	fldl	MO(huge_nan_null_null+8)
+	fstl	(%eax)
+	fstpl	8(%eax)
+	ret	$4
+
+END(__cexp)
+weak_alias (__cexp, cexp)
diff --git a/sysdeps/libm-i387/s_cexpf.S b/sysdeps/libm-i387/s_cexpf.S
new file mode 100644
index 0000000000..6fd414b045
--- /dev/null
+++ b/sysdeps/libm-i387/s_cexpf.S
@@ -0,0 +1,245 @@
+/* ix87 specific implementation of complex exponential function for double.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <sysdep.h>
+
+#ifdef __ELF__
+	.section .rodata
+#else
+	.text
+#endif
+	.align ALIGNARG(4)
+	ASM_TYPE_DIRECTIVE(huge_nan_null_null,@object)
+huge_nan_null_null:
+	.byte 0, 0, 0x80, 0x7f
+	.byte 0, 0, 0xc0, 0x7f
+	.float	0.0
+	.float	0.0
+	.byte 0, 0, 0x80, 0x7f
+	.byte 0, 0, 0xc0, 0x7f
+	.float 0.0
+	.byte 0, 0, 0, 0x80
+	ASM_SIZE_DIRECTIVE(huge_nan_null_null)
+
+	ASM_TYPE_DIRECTIVE(twopi,@object)
+twopi:
+	.byte 0x35, 0xc2, 0x68, 0x21, 0xa2, 0xda, 0xf, 0xc9, 0x1, 0x40
+	.byte 0, 0, 0, 0, 0, 0
+	ASM_SIZE_DIRECTIVE(twopi)
+
+	ASM_TYPE_DIRECTIVE(l2e,@object)
+l2e:
+	.byte 0xbc, 0xf0, 0x17, 0x5c, 0x29, 0x3b, 0xaa, 0xb8, 0xff, 0x3f
+	.byte 0, 0, 0, 0, 0, 0
+	ASM_SIZE_DIRECTIVE(l2e)
+
+	ASM_TYPE_DIRECTIVE(one,@object)
+one:	.double 1.0
+	ASM_SIZE_DIRECTIVE(one)
+
+
+#ifdef PIC
+#define MO(op) op##@GOTOFF(%ecx)
+#define MOX(op,x,f) op##@GOTOFF(%ecx,x,f)
+#else
+#define MO(op) op
+#define MOX(op,x,f) op(,x,f)
+#endif
+
+	.text
+ENTRY(__cexpf)
+	flds	4(%esp)			/* x */
+	fxam
+	fnstsw
+	flds	8(%esp)			/* y : x */
+#ifdef  PIC
+        call    1f
+1:      popl    %ecx
+        addl    $_GLOBAL_OFFSET_TABLE_+[.-1b], %ecx
+#endif
+	movb	%ah, %dh
+	andb	$0x45, %ah
+	cmpb	$0x05, %ah
+	je	1f			/* Jump if real part is +-Inf */
+	cmpb	$0x01, %ah
+	je	2f			/* Jump if real part is NaN */
+
+	fxam				/* y : x */
+	fnstsw
+	/* If the imaginary part is not finite we return NaN+i NaN, as
+	   for the case when the real part is NaN.  A test for +-Inf and
+	   NaN would be necessary.  But since we know the stack register
+	   we applied `fxam' to is not empty we can simply use one test.
+	   Check your FPU manual for more information.  */
+	andb	$0x01, %ah
+	cmpb	$0x01, %ah
+	je	2f
+
+	/* We have finite numbers in the real and imaginary part.  Do
+	   the real work now.  */
+	fxch			/* x : y */
+	fldt	MO(l2e)		/* log2(e) : x : y */
+	fmulp			/* x * log2(e) : y */
+	fld	%st		/* x * log2(e) : x * log2(e) : y */
+	frndint			/* int(x * log2(e)) : x * log2(e) : y */
+	fsubr	%st, %st(1)	/* int(x * log2(e)) : frac(x * log2(e)) : y */
+	fxch			/* frac(x * log2(e)) : int(x * log2(e)) : y */
+	f2xm1			/* 2^frac(x * log2(e))-1 : int(x * log2(e)) : y */
+	faddl	MO(one)		/* 2^frac(x * log2(e)) : int(x * log2(e)) : y */
+	fscale			/* e^x : int(x * log2(e)) : y */
+	fst	%st(1)		/* e^x : e^x : y */
+	fxch	%st(2)		/* y : e^x : e^x */
+	fsincos			/* cos(y) : sin(y) : e^x : e^x */
+	fnstsw
+	testl	$0x400, %eax
+	jnz	7f
+	fmulp	%st, %st(3)	/* sin(y) : e^x : e^x * cos(y) */
+	fmulp	%st, %st(1)	/* e^x * sin(y) : e^x * cos(y) */
+	subl	$8, %esp
+	fstps	4(%esp)
+	fstps	(%esp)
+	popl	%eax
+	popl	%edx
+	ret
+
+	/* We have to reduce the argument to fsincos.  */
+	.align ALIGNARG(4)
+7:	fldt	MO(twopi)	/* 2*pi : y : e^x : e^x */
+	fxch			/* y : 2*pi : e^x : e^x */
+8:	fprem1			/* y%(2*pi) : 2*pi : e^x : e^x */
+	fnstsw
+	testl	$0x400, %eax
+	jnz	8b
+	fstp	%st(1)		/* y%(2*pi) : e^x : e^x */
+	fsincos			/* cos(y) : sin(y) : e^x : e^x */
+	fmulp	%st, %st(3)
+	fmulp	%st, %st(1)
+	subl	$8, %esp
+	fstps	4(%esp)
+	fstps	(%esp)
+	popl	%eax
+	popl	%edx
+	ret
+
+	/* The real part is +-inf.  We must make further differences.  */
+	.align ALIGNARG(4)
+1:	fxam			/* y : x */
+	fnstsw
+	movb	%ah, %dl
+	andb	$0x01, %ah	/* See above why 0x01 is usable here.  */
+	cmpb	$0x01, %ah
+	je	3f
+
+
+	/* The real part is +-Inf and the imaginary part is finite.  */
+	andl	$0x245, %edx
+	cmpb	$0x40, %dl	/* Imaginary part == 0?  */
+	je	4f		/* Yes ->  */
+
+	fxch			/* x : y */
+	shrl	$6, %edx
+	fstp	%st(0)		/* y */ /* Drop the real part.  */
+	andl	$8, %edx	/* This puts the sign bit of the real part
+				   in bit 3.  So we can use it to index a
+				   small array to select 0 or Inf.  */
+	fsincos			/* cos(y) : sin(y) */
+	fnstsw
+	testl	$0x0400, %eax
+	jnz	5f
+	fxch
+	ftst
+	fnstsw
+	fstp	%st(0)
+	shll	$23, %eax
+	andl	$0x80000000, %eax
+	orl	MOX(huge_nan_null_null,%edx,1), %eax
+	movl	MOX(huge_nan_null_null,%edx,1), %ecx
+	movl	%eax, %edx
+	ftst
+	fnstsw
+	fstp	%st(0)
+	shll	$23, %eax
+	andl	$0x80000000, %eax
+	orl	%ecx, %eax
+	ret
+	/* We must reduce the argument to fsincos.  */
+	.align ALIGNARG(4)
+5:	fldt	MO(twopi)
+	fxch
+6:	fprem1
+	fnstsw
+	testl	$0x400, %eax
+	jnz	6b
+	fstp	%st(1)
+	fsincos
+	fxch
+	ftst
+	fnstsw
+	fstp	%st(0)
+	shll	$23, %eax
+	andl	$0x80000000, %eax
+	orl	MOX(huge_nan_null_null,%edx,1), %eax
+	movl	MOX(huge_nan_null_null,%edx,1), %ecx
+	movl	%eax, %edx
+	ftst
+	fnstsw
+	fstp	%st(0)
+	shll	$23, %eax
+	andl	$0x80000000, %eax
+	orl	%ecx, %eax
+	ret
+
+	/* The real part is +-Inf and the imaginary part is +-0.  So return
+	   +-Inf+-0i.  */
+	.align ALIGNARG(4)
+4:	subl	$4, %esp
+	fstps	(%esp)
+	shrl	$6, %edx
+	fstp	%st(0)
+	andl	$8, %edx
+	movl	MOX(huge_nan_null_null,%edx,1), %eax
+	popl	%edx
+	ret
+
+	/* The real part is +-Inf, the imaginary is also is not finite.  */
+	.align ALIGNARG(4)
+3:	fstp	%st(0)
+	fstp	%st(0)		/* <empty> */
+	movl	%edx, %eax
+	shrl	$6, %edx
+	shll	$3, %eax
+	andl	$8, %edx
+	andl	$16, %eax
+	orl	%eax, %edx
+
+	movl	MOX(huge_nan_null_null,%edx,1), %eax
+	movl	MOX(huge_nan_null_null+4,%edx,1), %edx
+	ret
+
+	/* The real part is NaN.  */
+	.align ALIGNARG(4)
+2:	fstp	%st(0)
+	fstp	%st(0)
+	movl	MO(huge_nan_null_null+4), %eax
+	movl	%eax, %edx
+	ret
+
+END(__cexpf)
+weak_alias (__cexpf, cexpf)
diff --git a/sysdeps/libm-i387/s_cexpl.S b/sysdeps/libm-i387/s_cexpl.S
new file mode 100644
index 0000000000..fa31e74162
--- /dev/null
+++ b/sysdeps/libm-i387/s_cexpl.S
@@ -0,0 +1,249 @@
+/* ix87 specific implementation of complex exponential function for double.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <sysdep.h>
+
+#ifdef __ELF__
+	.section .rodata
+#else
+	.text
+#endif
+	.align ALIGNARG(4)
+	ASM_TYPE_DIRECTIVE(huge_nan_null_null,@object)
+huge_nan_null_null:
+	.byte 0, 0, 0, 0, 0, 0, 0xf0, 0x7f
+	.byte 0, 0, 0, 0, 0, 0, 0xff, 0x7f
+	.double	0.0
+	.double	0.0
+	.byte 0, 0, 0, 0, 0, 0, 0xf0, 0x7f
+	.byte 0, 0, 0, 0, 0, 0, 0xff, 0x7f
+	.double 0.0
+	.byte 0, 0, 0, 0, 0, 0, 0, 0x80
+	ASM_SIZE_DIRECTIVE(huge_nan_null_null)
+
+	ASM_TYPE_DIRECTIVE(twopi,@object)
+twopi:
+	.byte 0x35, 0xc2, 0x68, 0x21, 0xa2, 0xda, 0xf, 0xc9, 0x1, 0x40
+	.byte 0, 0, 0, 0, 0, 0
+	ASM_SIZE_DIRECTIVE(twopi)
+
+	ASM_TYPE_DIRECTIVE(l2e,@object)
+l2e:
+	.byte 0xbc, 0xf0, 0x17, 0x5c, 0x29, 0x3b, 0xaa, 0xb8, 0xff, 0x3f
+	.byte 0, 0, 0, 0, 0, 0
+	ASM_SIZE_DIRECTIVE(l2e)
+
+	ASM_TYPE_DIRECTIVE(one,@object)
+one:	.double 1.0
+	ASM_SIZE_DIRECTIVE(one)
+
+
+#ifdef PIC
+#define MO(op) op##@GOTOFF(%ecx)
+#define MOX(op,x,f) op##@GOTOFF(%ecx,x,f)
+#else
+#define MO(op) op
+#define MOX(op,x,f) op(,x,f)
+#endif
+
+	.text
+ENTRY(__cexpl)
+	fldt	8(%esp)			/* x */
+	fxam
+	fnstsw
+	fldt	20(%esp)		/* y : x */
+#ifdef  PIC
+        call    1f
+1:      popl    %ecx
+        addl    $_GLOBAL_OFFSET_TABLE_+[.-1b], %ecx
+#endif
+	movb	%ah, %dh
+	andb	$0x45, %ah
+	cmpb	$0x05, %ah
+	je	1f			/* Jump if real part is +-Inf */
+	cmpb	$0x01, %ah
+	je	2f			/* Jump if real part is NaN */
+
+	fxam				/* y : x */
+	fnstsw
+	/* If the imaginary part is not finite we return NaN+i NaN, as
+	   for the case when the real part is NaN.  A test for +-Inf and
+	   NaN would be necessary.  But since we know the stack register
+	   we applied `fxam' to is not empty we can simply use one test.
+	   Check your FPU manual for more information.  */
+	andb	$0x01, %ah
+	cmpb	$0x01, %ah
+	je	2f
+
+	/* We have finite numbers in the real and imaginary part.  Do
+	   the real work now.  */
+	fxch			/* x : y */
+	fldt	MO(l2e)		/* log2(e) : x : y */
+	fmulp			/* x * log2(e) : y */
+	fld	%st		/* x * log2(e) : x * log2(e) : y */
+	frndint			/* int(x * log2(e)) : x * log2(e) : y */
+	fsubr	%st, %st(1)	/* int(x * log2(e)) : frac(x * log2(e)) : y */
+	fxch			/* frac(x * log2(e)) : int(x * log2(e)) : y */
+	f2xm1			/* 2^frac(x * log2(e))-1 : int(x * log2(e)) : y */
+	faddl	MO(one)		/* 2^frac(x * log2(e)) : int(x * log2(e)) : y */
+	fscale			/* e^x : int(x * log2(e)) : y */
+	fst	%st(1)		/* e^x : e^x : y */
+	fxch	%st(2)		/* y : e^x : e^x */
+	fsincos			/* cos(y) : sin(y) : e^x : e^x */
+	fnstsw
+	testl	$0x400, %eax
+	jnz	7f
+	fmulp	%st, %st(3)	/* sin(y) : e^x : e^x * cos(y) */
+	fmulp	%st, %st(1)	/* e^x * sin(y) : e^x * cos(y) */
+	movl	4(%esp), %eax		/* Pointer to memory for result.  */
+	fstpt	12(%eax)
+	fstpt	(%eax)
+	ret	$4
+
+	/* We have to reduce the argument to fsincos.  */
+	.align ALIGNARG(4)
+7:	fldt	MO(twopi)	/* 2*pi : y : e^x : e^x */
+	fxch			/* y : 2*pi : e^x : e^x */
+8:	fprem1			/* y%(2*pi) : 2*pi : e^x : e^x */
+	fnstsw
+	testl	$0x400, %eax
+	jnz	8b
+	fstp	%st(1)		/* y%(2*pi) : e^x : e^x */
+	fsincos			/* cos(y) : sin(y) : e^x : e^x */
+	fmulp	%st, %st(3)
+	fmulp	%st, %st(1)
+	movl	4(%esp), %eax		/* Pointer to memory for result.  */
+	fstpt	12(%eax)
+	fstpt	(%eax)
+	ret	$4
+
+	/* The real part is +-inf.  We must make further differences.  */
+	.align ALIGNARG(4)
+1:	fxam			/* y : x */
+	fnstsw
+	movb	%ah, %dl
+	andb	$0x01, %ah	/* See above why 0x01 is usable here.  */
+	cmpb	$0x01, %ah
+	je	3f
+
+
+	/* The real part is +-Inf and the imaginary part is finite.  */
+	andl	$0x245, %edx
+	cmpb	$0x40, %dl	/* Imaginary part == 0?  */
+	je	4f		/* Yes ->  */
+
+	fxch			/* x : y */
+	shrl	$5, %edx
+	fstp	%st(0)		/* y */ /* Drop the real part.  */
+	andl	$16, %edx	/* This puts the sign bit of the real part
+				   in bit 4.  So we can use it to index a
+				   small array to select 0 or Inf.  */
+	fsincos			/* cos(y) : sin(y) */
+	fnstsw
+	testl	$0x0400, %eax
+	jnz	5f
+	fldl	MOX(huge_nan_null_null,%edx,1)
+	movl	4(%esp), %edx		/* Pointer to memory for result.  */
+	fstl	8(%edx)
+	fstpl	(%edx)
+	ftst
+	fnstsw
+	shll	$7, %eax
+	andl	$0x8000, %eax
+	orl	%eax, 8(%edx)
+	fstp	%st(0)
+	ftst
+	fnstsw
+	shll	$7, %eax
+	andl	$0x8000, %eax
+	orl	%eax, 20(%edx)
+	fstp	%st(0)
+	ret	$4
+	/* We must reduce the argument to fsincos.  */
+	.align ALIGNARG(4)
+5:	fldt	MO(twopi)
+	fxch
+6:	fprem1
+	fnstsw
+	testl	$0x400, %eax
+	jnz	6b
+	fstp	%st(1)
+	fsincos
+	fldl	MOX(huge_nan_null_null,%edx,1)
+	movl	4(%esp), %edx		/* Pointer to memory for result.  */
+	fstl	8(%edx)
+	fstpl	(%edx)
+	ftst
+	fnstsw
+	shll	$7, %eax
+	andl	$0x8000, %eax
+	orl	%eax, 8(%edx)
+	fstp	%st(0)
+	ftst
+	fnstsw
+	shll	$7, %eax
+	andl	$0x8000, %eax
+	orl	%eax, 20(%edx)
+	fstp	%st(0)
+	ret	$4
+
+	/* The real part is +-Inf and the imaginary part is +-0.  So return
+	   +-Inf+-0i.  */
+	.align ALIGNARG(4)
+4:	movl	4(%esp), %eax		/* Pointer to memory for result.  */
+	fstpt	12(%eax)
+	shrl	$5, %edx
+	fstp	%st(0)
+	andl	$16, %edx
+	fldl	MOX(huge_nan_null_null,%edx,1)
+	fstpt	(%eax)
+	ret	$4
+
+	/* The real part is +-Inf, the imaginary is also is not finite.  */
+	.align ALIGNARG(4)
+3:	fstp	%st(0)
+	fstp	%st(0)		/* <empty> */
+	movl	%edx, %eax
+	shrl	$5, %edx
+	shll	$4, %eax
+	andl	$16, %edx
+	andl	$32, %eax
+	orl	%eax, %edx
+	movl	4(%esp), %eax		/* Pointer to memory for result.  */
+
+	fldl	MOX(huge_nan_null_null,%edx,1)
+	fldl	MOX(huge_nan_null_null+8,%edx,1)
+	fstpt	12(%eax)
+	fstpt	(%eax)
+	ret	$4
+
+	/* The real part is NaN.  */
+	.align ALIGNARG(4)
+2:	fstp	%st(0)
+	fstp	%st(0)
+	movl	4(%esp), %eax		/* Pointer to memory for result.  */
+	fldl	MO(huge_nan_null_null+8)
+	fld	%st(0)
+	fstpt	(%eax)
+	fstpt	12(%eax)
+	ret	$4
+
+END(__cexpl)
+weak_alias (__cexpl, cexpl)
diff --git a/sysdeps/libm-ieee754/s_ccosh.c b/sysdeps/libm-ieee754/s_ccosh.c
new file mode 100644
index 0000000000..f01b245e77
--- /dev/null
+++ b/sysdeps/libm-ieee754/s_ccosh.c
@@ -0,0 +1,95 @@
+/* Complex cosine hyperbole function for double.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <complex.h>
+#include <math.h>
+
+
+__complex__ double
+__ccosh (__complex__ double x)
+{
+  __complex__ double retval;
+
+  __real__ x = fabs (__real__ x);
+
+  if (isfinite (__real__ x))
+    {
+      if (isfinite (__imag__ x))
+	{
+	  double exp_val = __exp (__real__ x);
+	  double rec_exp_val = 1.0 / exp_val;
+
+	  __real__ retval = 0.5 * (exp_val + rec_exp_val) * __cos (__imag__ x);
+	  __imag__ retval = 0.5 * (exp_val + rec_exp_val) * __sin (__imag__ x);
+	}
+      else
+	{
+	  if (__real__ x == 0)
+	    {
+	      __imag__ retval = 0.0;
+	      __real__ retval = __nan ("") + __nan ("");
+	    }
+	  else
+	    {
+	      __real__ retval = __nan ("");
+	      __imag__ retval = __nan ("") + __nan ("");
+	    }
+	}
+    }
+  else if (__isinf (__real__ x))
+    {
+      if (__imag__ x == 0.0)
+	{
+	  __real__ retval = HUGE_VAL;
+	  __imag__ retval = __imag__ x;
+	}
+      else if (isfinite (__imag__ x))
+	{
+	  __real__ retval = __copysign (HUGE_VAL, __cos (__imag__ x));
+	  __imag__ retval = __copysign (HUGE_VAL, __sin (__imag__ x));
+	}
+      else
+	{
+	  /* The addition raises the invalid exception.  */
+	  __real__ retval = HUGE_VAL;
+	  __imag__ retval = __nan ("") + __nan ("");
+	}
+    }
+  else
+    {
+      if (__imag__ x == 0.0)
+	{
+	  __real__ retval = __nan ("");
+	  __imag__ retval = __imag__ x;
+	}
+      else
+	{
+	  __real__ retval = __nan ("");
+	  __imag__ retval = __nan ("");
+	}
+    }
+
+  return retval;
+}
+weak_alias (__ccosh, ccosh)
+#ifdef NO_LONG_DOUBLE
+strong_alias (__ccosh, __ccoshl)
+weak_alias (__ccosh, ccoshl)
+#endif
diff --git a/sysdeps/libm-ieee754/s_ccoshf.c b/sysdeps/libm-ieee754/s_ccoshf.c
new file mode 100644
index 0000000000..9f2774b6c7
--- /dev/null
+++ b/sysdeps/libm-ieee754/s_ccoshf.c
@@ -0,0 +1,93 @@
+/* Complex cosine hyperbole function for float.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <complex.h>
+#include <math.h>
+
+
+__complex__ float
+__ccoshf (__complex__ float x)
+{
+  __complex__ float retval;
+
+  __real__ x = fabsf (__real__ x);
+
+  if (isfinite (__real__ x))
+    {
+      if (isfinite (__imag__ x))
+	{
+	  float exp_val = __expf (__real__ x);
+	  float rec_exp_val = 1.0 / exp_val;
+
+	  __real__ retval = (0.5 * (exp_val + rec_exp_val)
+			     * __cosf (__imag__ x));
+	  __imag__ retval = (0.5 * (exp_val + rec_exp_val)
+			     * __sinf (__imag__ x));
+	}
+      else
+	{
+	  if (__real__ x == 0)
+	    {
+	      __imag__ retval = 0.0;
+	      __real__ retval = __nanf ("") + __nanf ("");
+	    }
+	  else
+	    {
+	      __real__ retval = __nanf ("");
+	      __imag__ retval = __nanf ("") + __nanf ("");
+	    }
+	}
+    }
+  else if (__isinff (__real__ x))
+    {
+      if (__imag__ x == 0.0)
+	{
+	  __real__ retval = HUGE_VALF;
+	  __imag__ retval = __imag__ x;
+	}
+      else if (isfinite (__imag__ x))
+	{
+	  __real__ retval = __copysignf (HUGE_VALF, __cosf (__imag__ x));
+	  __imag__ retval = __copysignf (HUGE_VALF, __sinf (__imag__ x));
+	}
+      else
+	{
+	  /* The addition raises the invalid exception.  */
+	  __real__ retval = HUGE_VALF;
+	  __imag__ retval = __nanf ("") + __nanf ("");
+	}
+    }
+  else
+    {
+      if (__imag__ x == 0.0)
+	{
+	  __real__ retval = __nanf ("");
+	  __imag__ retval = __imag__ x;
+	}
+      else
+	{
+	  __real__ retval = __nanf ("");
+	  __imag__ retval = __nanf ("");
+	}
+    }
+
+  return retval;
+}
+weak_alias (__ccoshf, ccoshf)
diff --git a/sysdeps/libm-ieee754/s_ccoshl.c b/sysdeps/libm-ieee754/s_ccoshl.c
new file mode 100644
index 0000000000..fd553418b4
--- /dev/null
+++ b/sysdeps/libm-ieee754/s_ccoshl.c
@@ -0,0 +1,93 @@
+/* Complex cosine hyperbole function for long double.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <complex.h>
+#include <math.h>
+
+
+__complex__ long double
+__ccoshl (__complex__ long double x)
+{
+  __complex__ long double retval;
+
+  __real__ x = fabsl (__real__ x);
+
+  if (isfinite (__real__ x))
+    {
+      if (isfinite (__imag__ x))
+	{
+	  long double exp_val = __expl (__real__ x);
+	  long double rec_exp_val = 1.0 / exp_val;
+
+	  __real__ retval = (0.5 * (exp_val + rec_exp_val)
+			     * __cosl (__imag__ x));
+	  __imag__ retval = (0.5 * (exp_val + rec_exp_val)
+			     * __sinl (__imag__ x));
+	}
+      else
+	{
+	  if (__real__ x == 0)
+	    {
+	      __imag__ retval = 0.0;
+	      __real__ retval = __nanl ("") + __nanl ("");
+	    }
+	  else
+	    {
+	      __real__ retval = __nanl ("");
+	      __imag__ retval = __nanl ("") + __nanl ("");
+	    }
+	}
+    }
+  else if (__isinfl (__real__ x))
+    {
+      if (__imag__ x == 0.0)
+	{
+	  __real__ retval = HUGE_VALL;
+	  __imag__ retval = __imag__ x;
+	}
+      else if (isfinite (__imag__ x))
+	{
+	  __real__ retval = __copysignl (HUGE_VALL, __cosl (__imag__ x));
+	  __imag__ retval = __copysignl (HUGE_VALL, __sinl (__imag__ x));
+	}
+      else
+	{
+	  /* The addition raises the invalid exception.  */
+	  __real__ retval = HUGE_VALL;
+	  __imag__ retval = __nanl ("") + __nanl ("");
+	}
+    }
+  else
+    {
+      if (__imag__ x == 0.0)
+	{
+	  __real__ retval = __nanl ("");
+	  __imag__ retval = __imag__ x;
+	}
+      else
+	{
+	  __real__ retval = __nanl ("");
+	  __imag__ retval = __nanl ("");
+	}
+    }
+
+  return retval;
+}
+weak_alias (__ccoshl, ccoshl)
diff --git a/sysdeps/libm-ieee754/s_cexp.c b/sysdeps/libm-ieee754/s_cexp.c
index 46f9f612eb..233a40014f 100644
--- a/sysdeps/libm-ieee754/s_cexp.c
+++ b/sysdeps/libm-ieee754/s_cexp.c
@@ -1,4 +1,4 @@
-/* Return value of complex exponential function for double complex value.
+/* Return value of complex exponential function for float complex value.
    Copyright (C) 1997 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
@@ -31,33 +31,52 @@ __cexp (__complex__ double x)
     {
       if (isfinite (__imag__ x))
 	{
-	  retval = __exp (__real__ x) * (__cos (__imag__ x)
-					 + 1i * __sin (__imag__ x));
+	  double exp_val = __exp (__real__ x);
+
+	  __real__ retval = exp_val * __cos (__imag__ x);
+	  __imag__ retval = exp_val * __sin (__imag__ x);
 	}
       else
-	/* If the imaginary part is +-inf or NaN and the real part is
-	   not +-inf the result is NaN + iNan.  */
-	retval = __nan ("") + 1.0i * __nan ("");
+	{
+	  /* If the imaginary part is +-inf or NaN and the real part
+	     is not +-inf the result is NaN + iNaN.  */
+	  __real__ retval = __nan ("");
+	  __imag__ retval = __nan ("");
+	}
     }
   else if (__isinf (__real__ x))
     {
-      if (isfinite (__imag x))
+      if (isfinite (__imag__ x))
 	{
 	  if (signbit (__real__ x) == 0 && __imag__ x == 0.0)
 	    retval = HUGE_VAL;
 	  else
-	    retval = ((signbit (__real__ x) ? 0.0 : HUGE_VAL)
-		      * (__cos (__imag__ x) + 1i * __sin (__imag__ x)));
+	    {
+	      double value = signbit (__real__ x) ? 0.0 : HUGE_VAL;
+
+	      __real__ retval = value * __cos (__imag__ x);
+	      __imag__ retval = value * __sin (__imag__ x);
+	    }
+	}
+      else if (signbit (__real__ x) == 0)
+	{
+	  __real__ retval = HUGE_VAL;
+	  __imag__ retval = __nan ("");
 	}
-      else if (signbit (__real__ x))
-	retval = HUGE_VAL + 1.0i * __nan ("");
       else
 	retval = 0.0;
     }
   else
-    /* If the real part is NaN the result is NaN + iNan.  */
-    retval = __nan ("") + 1.0i * __nan ("");
+    {
+      /* If the real part is NaN the result is NaN + iNaN.  */
+      __real__ retval = __nan ("");
+      __imag__ retval = __nan ("");
+    }
 
   return retval;
 }
 weak_alias (__cexp, cexp)
+#ifdef NO_LONG_DOUBLE
+string_alias (__cexp, __cexpl)
+weak_alias (__cexp, cexpl)
+#endif
diff --git a/sysdeps/libm-ieee754/s_cexpf.c b/sysdeps/libm-ieee754/s_cexpf.c
index 261b18cb3a..c5d8f0cc07 100644
--- a/sysdeps/libm-ieee754/s_cexpf.c
+++ b/sysdeps/libm-ieee754/s_cexpf.c
@@ -33,8 +33,16 @@ __cexpf (__complex__ float x)
 	{
 	  float exp_val = __expf (__real__ x);
 
-	  __real__ retval = exp_val * __cosf (__imag__ x);
-	  __imag__ retval = exp_val * __sinf (__imag__ x);
+	  if (isfinite (exp_val))
+	    {
+	      __real__ retval = exp_val * __cosf (__imag__ x);
+	      __imag__ retval = exp_val * __sinf (__imag__ x);
+	    }
+	  else
+	    {
+	      __real__ retval = __copysignf (exp_val, __cosf (__imag__ x));
+	      __imag__ retval = __copysignf (exp_val, __sinf (__imag__ x));
+	    }
 	}
       else
 	{
@@ -48,14 +56,17 @@ __cexpf (__complex__ float x)
     {
       if (isfinite (__imag__ x))
 	{
-	  if (signbit (__real__ x) == 0 && __imag__ x == 0.0)
-	    retval = HUGE_VALF;
+	  float value = signbit (__real__ x) ? 0.0 : HUGE_VALF;
+
+	  if (__imag__ x == 0.0)
+	    {
+	      __real__ retval = value;
+	      __imag__ retval = __imag__ x;
+	    }
 	  else
 	    {
-	      float value = signbit (__real__ x) ? 0.0 : HUGE_VALF;
-
-	      __real__ retval = value * __cosf (__imag__ x);
-	      __imag__ retval = value * __sinf (__imag__ x);
+	      __real__ retval = __copysignf (value, __cosf (__imag__ x));
+	      __imag__ retval = __copysignf (value, __sinf (__imag__ x));
 	    }
 	}
       else if (signbit (__real__ x) == 0)
@@ -64,7 +75,10 @@ __cexpf (__complex__ float x)
 	  __imag__ retval = __nanf ("");
 	}
       else
-	retval = 0.0;
+	{
+	  __real__ retval = 0.0;
+	  __imag__ retval = __copysignf (0.0, __imag__ x);
+	}
     }
   else
     {
diff --git a/sysdeps/libm-ieee754/s_cexpl.c b/sysdeps/libm-ieee754/s_cexpl.c
index 779286f6b3..f1cdf43ec8 100644
--- a/sysdeps/libm-ieee754/s_cexpl.c
+++ b/sysdeps/libm-ieee754/s_cexpl.c
@@ -33,8 +33,16 @@ __cexpl (__complex__ long double x)
 	{
 	  long double exp_val = __expl (__real__ x);
 
-	  __real__ retval = exp_val * __cosl (__imag__ x);
-	  __imag__ retval = exp_val * __sinl (__imag__ x);
+	  if (isfinite (exp_val))
+	    {
+	      __real__ retval = exp_val * __cosl (__imag__ x);
+	      __imag__ retval = exp_val * __sinl (__imag__ x);
+	    }
+	  else
+	    {
+	      __real__ retval = __copysignl (exp_val, __cosl (__imag__ x));
+	      __imag__ retval = __copysignl (exp_val, __sinl (__imag__ x));
+	    }
 	}
       else
 	{
@@ -48,14 +56,17 @@ __cexpl (__complex__ long double x)
     {
       if (isfinite (__imag__ x))
 	{
-	  if (signbit (__real__ x) == 0 && __imag__ x == 0.0)
-	    retval = HUGE_VAL;
+	  long double value = signbit (__real__ x) ? 0.0 : HUGE_VALL;
+
+	  if (__imag__ x == 0.0)
+	    {
+	      __real__ retval = value;
+	      __imag__ retval = __imag__ x;
+	    }
 	  else
 	    {
-	      long double value = signbit (__real__ x) ? 0.0 : HUGE_VALL;
-
-	      __real__ retval = value * __cosl (__imag__ x);
-	      __imag__ retval = value * __sinl (__imag__ x);
+	      __real__ retval = __copysignl (value, __cosl (__imag__ x));
+	      __imag__ retval = __copysignl (value, __sinl (__imag__ x));
 	    }
 	}
       else if (signbit (__real__ x) == 0)
@@ -64,7 +75,10 @@ __cexpl (__complex__ long double x)
 	  __imag__ retval = __nanl ("");
 	}
       else
-	retval = 0.0;
+	{
+	  __real__ retval = 0.0;
+	  __imag__ retval = __copysignl (0.0, __imag__ x);
+	}
     }
   else
     {
diff --git a/sysdeps/libm-ieee754/s_csinh.c b/sysdeps/libm-ieee754/s_csinh.c
new file mode 100644
index 0000000000..aab041bdf9
--- /dev/null
+++ b/sysdeps/libm-ieee754/s_csinh.c
@@ -0,0 +1,102 @@
+/* Complex sine hyperbole function for double.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <complex.h>
+#include <math.h>
+
+
+__complex__ double
+__csinh (__complex__ double x)
+{
+  __complex__ double retval;
+  int negate = signbit (__real__ x);
+
+  __real__ x = fabs (__real__ x);
+
+  if (isfinite (__real__ x))
+    {
+      if (isfinite (__imag__ x))
+	{
+	  double exp_val = __exp (__real__ x);
+	  double rec_exp_val = 1.0 / exp_val;
+
+	  __real__ retval = 0.5 * (exp_val - rec_exp_val) * __cos (__imag__ x);
+	  __imag__ retval = 0.5 * (exp_val - rec_exp_val) * __sin (__imag__ x);
+
+	  if (negate)
+	    __real__ retval = -__real__ retval;
+	}
+      else
+	{
+	  if (__real__ x == 0)
+	    {
+	      __real__ retval = __copysign (0.0, negate ? -1.0 : 1.0);
+	      __imag__ retval = __nan ("") + __nan ("");
+	    }
+	  else
+	    {
+	      __real__ retval = __nan ("");
+	      __imag__ retval = __nan ("");
+	    }
+	}
+    }
+  else if (__isinf (__real__ x))
+    {
+      if (__imag__ x == 0.0)
+	{
+	  __real__ retval = negate ? -HUGE_VAL : HUGE_VAL;
+	  __imag__ retval = __imag__ x;
+	}
+      else if (isfinite (__imag__ x))
+	{
+	  __real__ retval = __copysign (HUGE_VAL, __cos (__imag__ x));
+	  __imag__ retval = __copysign (HUGE_VAL, __sin (__imag__ x));
+
+	  if (negate)
+	    __real__ retval = -__real__ retval;
+	}
+      else
+	{
+	  /* The addition raises the invalid exception.  */
+	  __real__ retval = HUGE_VAL;
+	  __imag__ retval = __nan ("") + __nan ("");
+	}
+    }
+  else
+    {
+      if (__imag__ x == 0.0)
+	{
+	  __real__ retval = __nan ("");
+	  __imag__ retval = __imag__ x;
+	}
+      else
+	{
+	  __real__ retval = __nan ("");
+	  __imag__ retval = __nan ("");
+	}
+    }
+
+  return retval;
+}
+weak_alias (__csinh, csinh)
+#ifdef NO_LONG_DOUBLE
+strong_alias (__csinh, __csinhl)
+weak_alias (__csinh, csinhl)
+#endif
diff --git a/sysdeps/libm-ieee754/s_csinhf.c b/sysdeps/libm-ieee754/s_csinhf.c
new file mode 100644
index 0000000000..204bbfebb9
--- /dev/null
+++ b/sysdeps/libm-ieee754/s_csinhf.c
@@ -0,0 +1,100 @@
+/* Complex sine hyperbole function for float.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <complex.h>
+#include <math.h>
+
+
+__complex__ float
+__csinhf (__complex__ float x)
+{
+  __complex__ float retval;
+  int negate = signbit (__real__ x);
+
+  __real__ x = fabsf (__real__ x);
+
+  if (isfinite (__real__ x))
+    {
+      if (isfinite (__imag__ x))
+	{
+	  float exp_val = __expf (__real__ x);
+	  float rec_exp_val = 1.0 / exp_val;
+
+	  __real__ retval = (0.5 * (exp_val - rec_exp_val)
+			     * __cosf (__imag__ x));
+	  __imag__ retval = (0.5 * (exp_val - rec_exp_val)
+			     * __sinf (__imag__ x));
+
+	  if (negate)
+	    __real__ retval = -__real__ retval;
+	}
+      else
+	{
+	  if (__real__ x == 0)
+	    {
+	      __real__ retval = __copysignf (0.0, negate ? -1.0 : 1.0);
+	      __imag__ retval = __nanf ("") + __nanf ("");
+	    }
+	  else
+	    {
+	      __real__ retval = __nanf ("");
+	      __imag__ retval = __nanf ("");
+	    }
+	}
+    }
+  else if (__isinff (__real__ x))
+    {
+      if (__imag__ x == 0.0)
+	{
+	  __real__ retval = negate ? -HUGE_VALF : HUGE_VALF;
+	  __imag__ retval = __imag__ x;
+	}
+      else if (isfinite (__imag__ x))
+	{
+	  __real__ retval = __copysignf (HUGE_VALF, __cosf (__imag__ x));
+	  __imag__ retval = __copysignf (HUGE_VALF, __sinf (__imag__ x));
+
+	  if (negate)
+	    __real__ retval = -__real__ retval;
+	}
+      else
+	{
+	  /* The addition raises the invalid exception.  */
+	  __real__ retval = HUGE_VALF;
+	  __imag__ retval = __nanf ("") + __nanf ("");
+	}
+    }
+  else
+    {
+      if (__imag__ x == 0.0)
+	{
+	  __real__ retval = __nanf ("");
+	  __imag__ retval = __imag__ x;
+	}
+      else
+	{
+	  __real__ retval = __nanf ("");
+	  __imag__ retval = __nanf ("");
+	}
+    }
+
+  return retval;
+}
+weak_alias (__csinhf, csinhf)
diff --git a/sysdeps/libm-ieee754/s_csinhl.c b/sysdeps/libm-ieee754/s_csinhl.c
new file mode 100644
index 0000000000..e403dd4796
--- /dev/null
+++ b/sysdeps/libm-ieee754/s_csinhl.c
@@ -0,0 +1,100 @@
+/* Complex sine hyperbole function for long double.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <complex.h>
+#include <math.h>
+
+
+__complex__ long double
+__csinhl (__complex__ long double x)
+{
+  __complex__ long double retval;
+  int negate = signbit (__real__ x);
+
+  __real__ x = fabs (__real__ x);
+
+  if (isfinite (__real__ x))
+    {
+      if (isfinite (__imag__ x))
+	{
+	  long double exp_val = __expl (__real__ x);
+	  long double rec_exp_val = 1.0 / exp_val;
+
+	  __real__ retval = (0.5 * (exp_val - rec_exp_val)
+			     * __cosl (__imag__ x));
+	  __imag__ retval = (0.5 * (exp_val - rec_exp_val)
+			     * __sinl (__imag__ x));
+
+	  if (negate)
+	    __real__ retval = -__real__ retval;
+	}
+      else
+	{
+	  if (__real__ x == 0)
+	    {
+	      __real__ retval = __copysignl (0.0, negate ? -1.0 : 1.0);
+	      __imag__ retval = __nanl ("") + __nanl ("");
+	    }
+	  else
+	    {
+	      __real__ retval = __nanl ("");
+	      __imag__ retval = __nanl ("");
+	    }
+	}
+    }
+  else if (__isinfl (__real__ x))
+    {
+      if (__imag__ x == 0.0)
+	{
+	  __real__ retval = negate ? -HUGE_VALL : HUGE_VALL;
+	  __imag__ retval = __imag__ x;
+	}
+      else if (isfinite (__imag__ x))
+	{
+	  __real__ retval = __copysignl (HUGE_VALL, __cosl (__imag__ x));
+	  __imag__ retval = __copysignl (HUGE_VALL, __sinl (__imag__ x));
+
+	  if (negate)
+	    __real__ retval = -__real__ retval;
+	}
+      else
+	{
+	  /* The addition raises the invalid exception.  */
+	  __real__ retval = HUGE_VALL;
+	  __imag__ retval = __nanl ("") + __nanl ("");
+	}
+    }
+  else
+    {
+      if (__imag__ x == 0.0)
+	{
+	  __real__ retval = __nanl ("");
+	  __imag__ retval = __imag__ x;
+	}
+      else
+	{
+	  __real__ retval = __nanl ("");
+	  __imag__ retval = __nanl ("");
+	}
+    }
+
+  return retval;
+}
+weak_alias (__csinhl, csinhl)
diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c
index 4d32ee02ac..f819bb4c0c 100644
--- a/sysdeps/posix/getaddrinfo.c
+++ b/sysdeps/posix/getaddrinfo.c
@@ -45,7 +45,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 /* getaddrinfo() v1.13 */
 
 /* To do what POSIX says, even when it's broken: */
-/* #define BROKEN_LIKE_POSIX 1 */
+#define BROKEN_LIKE_POSIX 1
 #define LOCAL 1
 #define INET6 1
 #define HOSTTABLE 0
@@ -168,21 +168,34 @@ static int gaih_local(const char *name, const struct gaih_service *service,
 };
 #endif /* LOCAL */
 
-static struct gaih_typeproto gaih_inet_typeproto[] = {
+static struct gaih_typeproto gaih_inet_typeproto[] =
+{
   { 0, 0, NULL },
-  { SOCK_STREAM, IPPROTO_TCP, (char *)"tcp" },
-  { SOCK_DGRAM, IPPROTO_UDP, (char *)"udp" },
+  { SOCK_STREAM, IPPROTO_TCP, (char *) "tcp" },
+  { SOCK_DGRAM, IPPROTO_UDP, (char *) "udp" },
   { 0, 0, NULL }
 };
 
 static int gaih_inet_serv(char *servicename, struct gaih_typeproto *tp, struct gaih_servtuple **st)
 {
   struct servent *s;
+  int tmpbuflen = 1024;
+  struct servent ts;
+  char *tmpbuf = __alloca (tmpbuflen);
+  while (__getservbyname_r (servicename, tp->name, &ts, tmpbuf, tmpbuflen, &s))
+    {
+      if (errno == ERANGE)
+	{
+	  tmpbuflen *= 2;
+	  tmpbuf = __alloca (tmpbuflen);
+	}
+      else
+	{
+	  return GAIH_OKIFUNSPEC | -EAI_SERVICE;
+	}
+    }
 
-  if (!(s = getservbyname(servicename, tp->name)))
-    return (GAIH_OKIFUNSPEC | -EAI_SERVICE);
-
-  if (!(*st = malloc(sizeof(struct gaih_servtuple))))
+  if (!(*st = malloc (sizeof (struct gaih_servtuple))))
     return -EAI_MEMORY;
 
   (*st)->next = NULL;
diff --git a/sysdeps/posix/system.c b/sysdeps/posix/system.c
index b1a685c29a..2b8f9cb590 100644
--- a/sysdeps/posix/system.c
+++ b/sysdeps/posix/system.c
@@ -1,20 +1,20 @@
-/* Copyright (C) 1991, 92, 94, 95, 96 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.  */
+/* Copyright (C) 1991, 92, 94, 95, 96, 97 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., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
 
 #include <stddef.h>
 #include <stdlib.h>
diff --git a/sysdeps/sparc/dl-machine.h b/sysdeps/sparc/dl-machine.h
index cadf353878..ceaf9eedce 100644
--- a/sysdeps/sparc/dl-machine.h
+++ b/sysdeps/sparc/dl-machine.h
@@ -105,7 +105,12 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
   Elf32_Addr loadbase;
 
   if (ELF32_R_TYPE (reloc->r_info) == R_SPARC_RELATIVE)
-    *reloc_addr += map->l_addr + reloc->r_addend;
+    {
+#ifndef RTLD_BOOTSTRAP
+      if (map != &_dl_rtld_map) /* Already done in rtld itself. */
+#endif
+	*reloc_addr += map->l_addr + reloc->r_addend;
+    }
   else
     {
       Elf32_Addr value;
diff --git a/sysdeps/sparc/udiv_qrnnd.S b/sysdeps/sparc/udiv_qrnnd.S
index 4cd4f051b3..e5d30679e1 100644
--- a/sysdeps/sparc/udiv_qrnnd.S
+++ b/sysdeps/sparc/udiv_qrnnd.S
@@ -1,6 +1,6 @@
 ! SPARC  __udiv_qrnnd division support, used from longlong.h.
 
-! Copyright (C) 1993, 1994 Free Software Foundation, Inc.
+! Copyright (C) 1993, 1994, 1997 Free Software Foundation, Inc.
 
 ! This file is part of the GNU MP Library.
 
@@ -18,6 +18,8 @@
 ! along with the GNU MP Library; see the file COPYING.LIB.  If not, write to
 ! the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
+!
+! Added PIC support - May/96, Miguel de Icaza
 
 ! INPUT PARAMETERS
 ! rem_ptr	i0
@@ -25,6 +27,7 @@
 ! n0		i2
 ! d		i3
 
+#include "DEFS.h"
 #include "sysdep.h"
 #undef ret	/* Kludge for glibc */
 
@@ -34,16 +37,25 @@ LC0:	.double	0r4294967296
 LC1:	.double	0r2147483648
 
 	.align	4
-	.global	C_SYMBOL_NAME(__udiv_qrnnd)
-C_SYMBOL_NAME(__udiv_qrnnd):
+	.global	__udiv_qrnnd
+FUNC(__udiv_qrnnd)
 	!#PROLOGUE# 0
 	save	%sp,-104,%sp
 	!#PROLOGUE# 1
 	st	%i1,[%fp-8]
 	ld	[%fp-8],%f10
+#ifdef __PIC__
+._XL11:
+	call	._XL1
+	fitod	%f10,%f4
+._XL1:
+	sub	%o7,(._XL11-LC0),%o7
+	ldd	[%o7],%f8
+#else
 	sethi	%hi(LC0),%o7
 	fitod	%f10,%f4
 	ldd	[%o7+%lo(LC0)],%f8
+#endif
 	cmp	%i1,0
 	bge	L248
 	mov	%i0,%i5
@@ -66,8 +78,17 @@ L249:
 	faddd	%f4,%f8,%f4
 L250:
 	fdivd	%f2,%f4,%f2
+#ifdef __PIC__
+._XL22:
+	call	._XL2
+	nop
+._XL2:
+	sub	%o7,(._XL22-LC1),%o7
+	ldd	[%o7],%f4
+#else
 	sethi	%hi(LC1),%o7
 	ldd	[%o7+%lo(LC1)],%f4
+#endif
 	fcmped	%f2,%f4
 	nop
 	fbge,a	L251
diff --git a/sysdeps/unix/sysv/linux/sparc/Dist b/sysdeps/unix/sysv/linux/sparc/Dist
index b50a46fb68..ab22392c04 100644
--- a/sysdeps/unix/sysv/linux/sparc/Dist
+++ b/sysdeps/unix/sysv/linux/sparc/Dist
@@ -3,3 +3,5 @@ clone.S
 start.c
 pipe.S
 fork.S
+kernel_stat.h
+kernel_sigaction.h
diff --git a/sysdeps/unix/sysv/linux/sparc/fcntlbits.h b/sysdeps/unix/sysv/linux/sparc/fcntlbits.h
new file mode 100644
index 0000000000..3fc7240a66
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/fcntlbits.h
@@ -0,0 +1,96 @@
+/* O_*, F_*, FD_* bit values for Linux/SPARC.
+   Copyright (C) 1995, 1996, 1997 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., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#ifndef _FCNTLBITS_H
+#define _FCNTLBITS_H	1
+
+#include <sys/types.h>
+
+/* In GNU, read and write are bits (unlike BSD). */
+#ifdef __USE_GNU
+#define O_READ          O_RDONLY /* Open for reading. */
+#define O_WRITE         O_WRONLY /* Open for writing. */
+#endif
+
+/* open/fcntl - O_SYNC is only implemented on blocks devices and on files
+   located on an ext2 file system */
+#define O_RDONLY	0x0000
+#define O_WRONLY	0x0001
+#define O_RDWR		0x0002
+#define O_ACCMODE	0x0003
+#define O_APPEND	0x0008
+#define O_CREAT		0x0200	/* not fcntl */
+#define O_TRUNC		0x0400	/* not fcntl */
+#define O_EXCL		0x0800	/* not fcntl */
+#define O_SYNC		0x2000
+#define O_NONBLOCK	0x4000
+#define O_NDELAY	(0x0004 | O_NONBLOCK)
+#define O_NOCTTY	0x8000	/* not fcntl */
+
+#define F_DUPFD		0	/* dup */
+#define F_GETFD		1	/* get f_flags */
+#define F_SETFD		2	/* set f_flags */
+#define F_GETFL		3	/* more flags (cloexec) */
+#define F_SETFL		4
+#define F_GETOWN	5	/*  for sockets. */
+#define F_SETOWN	6	/*  for sockets. */
+#define F_GETLK		7
+#define F_SETLK		8
+#define F_SETLKW	9
+
+/* for F_[GET|SET]FL */
+#define FD_CLOEXEC	1	/* actually anything with low bit set goes */
+
+/* for posix fcntl() and lockf() */
+#define F_RDLCK		1
+#define F_WRLCK		2
+#define F_UNLCK		3
+
+/* for old implementation of bsd flock () */
+#define F_EXLCK		4	/* or 3 */
+#define F_SHLCK		8	/* or 4 */
+
+/* operations for bsd flock(), also used by the kernel implementation */
+#define LOCK_SH		1	/* shared lock */
+#define LOCK_EX		2	/* exclusive lock */
+#define LOCK_NB		4	/* or'd with one of the above to prevent
+				   blocking */
+#define LOCK_UN		8	/* remove lock */
+
+struct flock
+  {
+    short int l_type;
+    short int l_whence;
+    __off_t l_start;
+    __off_t l_len;
+    __pid_t l_pid;
+    short int __unused;
+  };
+
+/* Define some more compatibility macros to be backward compatible with
+   BSD systems which did not managed to hide these kernel macros.  */
+#ifdef	__USE_BSD
+#define	FAPPEND		O_APPEND
+#define	FFSYNC		O_FSYNC
+#define	FASYNC		O_ASYNC
+#define	FNONBLOCK	O_NONBLOCK
+#define	FNDELAY		O_NDELAY
+#endif /* Use BSD.  */
+
+#endif
diff --git a/sysdeps/unix/sysv/linux/sparc/ioctls.h b/sysdeps/unix/sysv/linux/sparc/ioctls.h
new file mode 100644
index 0000000000..80b2e62e77
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/ioctls.h
@@ -0,0 +1,39 @@
+/* Copyright (C) 1996, 1997 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., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#ifndef _IOCTLS_H
+#define _IOCTLS_H 1
+
+/* Use the definitions from the kernel header files.  */
+#include <asm/ioctls.h>
+#include <sys/kernel_termios.h>
+
+/* Oh well, this is necessary since the kernel data structure is
+   different from the user-level version.  */
+#undef  TCGETS
+#undef  TCSETS
+#undef  TCSETSW
+#undef  TCSETSF
+#define TCGETS	_IOR ('t', 19, struct __kernel_termios)
+#define TCSETS	_IOW ('t', 20, struct __kernel_termios)
+#define TCSETSW	_IOW ('t', 21, struct __kernel_termios)
+#define TCSETSF	_IOW ('t', 22, struct __kernel_termios)
+
+#include <linux/sockios.h>
+
+#endif /* ioctls.h  */
diff --git a/sysdeps/unix/sysv/linux/sparc/kernel_sigaction.h b/sysdeps/unix/sysv/linux/sparc/kernel_sigaction.h
new file mode 100644
index 0000000000..f870d15082
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/kernel_sigaction.h
@@ -0,0 +1,12 @@
+/* Linux/SPARC version.  This is the sigaction struction from the Linux
+   2.1.20 kernel.  */
+
+struct sigaction
+  {
+    __sighandler_t sa_handler;
+    sigset_t sa_mask;
+    unsigned long int sa_flags;
+    void (*sa_restorer) (void);     /* not used by Linux/SPARC yet */
+  };
+
+#define HAVE_SA_RESTORER
diff --git a/sysdeps/unix/sysv/linux/sparc/kernel_stat.h b/sysdeps/unix/sysv/linux/sparc/kernel_stat.h
new file mode 100644
index 0000000000..993a8664dc
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/kernel_stat.h
@@ -0,0 +1,21 @@
+/* Definition of `struct stat' used in the kernel */
+struct kernel_stat
+  {
+    unsigned short int st_dev;
+    unsigned long int st_ino;
+    unsigned short int st_mode;
+    short int st_nlink;
+    unsigned short int st_uid;
+    unsigned short int st_gid;
+    unsigned short int st_rdev;
+    long int st_size;
+    long int st_atime;
+    unsigned long int __unused1;
+    long int st_mtime;
+    unsigned long int __unused2;
+    long int st_ctime;
+    unsigned long int __unused3;
+    long int st_blksize;
+    long int st_blocks;
+    unsigned long int __unused4[2];
+  };
diff --git a/sysdeps/unix/sysv/linux/sparc/sigaction.h b/sysdeps/unix/sysv/linux/sparc/sigaction.h
new file mode 100644
index 0000000000..19aa7e39cb
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/sigaction.h
@@ -0,0 +1,52 @@
+/* The proper definitions for Linux/SPARC sigaction.
+   Copyright (C) 1996, 1997 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., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+/* Structure describing the action to be taken when a signal arrives.  */
+struct sigaction
+  {
+    /* Signal handler.  */
+    __sighandler_t sa_handler;
+
+    /* Additional set of signals to be blocked.  */
+    __sigset_t sa_mask;
+
+    /* Special flags.  */
+    unsigned int sa_flags;
+  };
+
+
+/* Bits in `sa_flags'.  */
+#define	SA_NOCLDSTOP 0x00000008	/* Don't send SIGCHLD when children stop.  */
+#ifdef __USE_MISC
+#define SA_STACK     0x00000001	/* Use signal stack by using `sa_restorer'.  */
+#define SA_RESTART   0x00000002	/* Don't restart syscall on signal return.  */
+#define SA_INTERRUPT 0x00000010	/* Historical no-op.  */
+#define SA_NOMASK    0x00000020	/* Don't automatically block the signal when
+				   its handler is being executed.  */
+#define SA_ONESHOT   0x00000004	/* Reset to SIG_DFL on entry to handler.  */
+
+/* Some aliases for the SA_ constants.  */
+#define SA_NODEFER	SA_NOMASK
+#define SA_RESETHAND	SA_ONESHOT
+#endif
+
+/* Values for the HOW argument to `sigprocmask'.  */
+#define	SIG_BLOCK	1	/* Block signals.  */
+#define	SIG_UNBLOCK	2	/* Unblock signals.  */
+#define	SIG_SETMASK	4	/* Set the set of blocked signals.  */
diff --git a/sysdeps/unix/sysv/linux/sparc/signum.h b/sysdeps/unix/sysv/linux/sparc/signum.h
new file mode 100644
index 0000000000..d50a636bc3
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/signum.h
@@ -0,0 +1,72 @@
+/* Signal number definitions.  Linux/SPARC version.
+   Copyright (C) 1996, 1997 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., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#ifdef	_SIGNAL_H
+
+/* Fake signal functions.  */
+#define SIG_ERR ((__sighandler_t) -1) /* Error return.  */
+#define SIG_DFL ((__sighandler_t) 0) /* Default action.  */
+#define SIG_IGN ((__sighandler_t) 1) /* Ignore signal.  */
+
+/*
+ * Linux/SPARC has different signal numbers that Linux/i386: I'm trying
+ * to make it OSF/1 binary compatible, at least for normal binaries.
+ */
+#define	_NSIG		32	/* Biggest signal number + 1.  */
+#define NSIG		_NSIG
+
+#define SIGHUP		 1
+#define SIGINT		 2
+#define SIGQUIT		 3
+#define SIGILL		 4
+#define SIGTRAP		 5
+#define SIGABRT		 6
+#define SIGIOT		 6
+#define SIGEMT           7
+#define SIGFPE		 8
+#define SIGKILL		 9
+#define SIGBUS          10
+#define SIGSEGV		11
+#define SIGSYS		12
+#define SIGPIPE		13
+#define SIGALRM		14
+#define SIGTERM		15
+#define SIGURG          16
+
+/* SunOS values which deviate from the Linux/i386 ones */
+#define SIGSTOP		17
+#define SIGTSTP		18
+#define SIGCONT		19
+#define SIGCHLD		20
+#define SIGTTIN		21
+#define SIGTTOU		22
+#define SIGIO		23
+#define SIGPOLL		SIGIO   /* SysV name for SIGIO */
+#define SIGXCPU		24
+#define SIGXFSZ		25
+#define SIGVTALRM	26
+#define SIGPROF		27
+#define SIGWINCH	28
+#define SIGLOST		29
+#define SIGUSR1		30
+#define SIGUSR2		31
+
+/* Linux/SPARC does not have SIGPWR */
+#define SIGIOT          SIGABRT
+#endif	/* <signal.h> included.  */
diff --git a/sysdeps/unix/sysv/linux/sparc/termbits.h b/sysdeps/unix/sysv/linux/sparc/termbits.h
new file mode 100644
index 0000000000..bf7aa1480f
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/termbits.h
@@ -0,0 +1,217 @@
+/* termios type and macro definitions.  Linux/SPARC version.
+   Copyright (C) 1993, 1994, 1995, 1996, 1997 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., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#ifndef _SPARC_TERMBITS_H
+#define _SPARC_TERMBITS_H	1
+
+typedef unsigned char   cc_t;
+typedef unsigned int    speed_t;
+typedef unsigned long   tcflag_t;
+
+#define NCCS 17
+struct termios
+  {
+    tcflag_t c_iflag;		/* input mode flags */
+    tcflag_t c_oflag;		/* output mode flags */
+    tcflag_t c_cflag;		/* control mode flags */
+    tcflag_t c_lflag;		/* local mode flags */
+    cc_t c_line;			/* line discipline */
+    cc_t c_cc[NCCS];		/* control characters */
+#ifdef __KERNEL__
+#define SIZEOF_USER_TERMIOS sizeof (struct termios) - (2*sizeof (cc_t))
+    cc_t _x_cc[2];                  /* We need them to hold vmin/vtime */
+#endif
+  };
+
+/* c_cc characters */
+#define VINTR    0
+#define VQUIT    1
+#define VERASE   2
+#define VKILL    3
+#define VEOF     4
+#define VEOL     5
+#define VEOL2    6
+#define VSWTC    7
+#define VSTART   8
+#define VSTOP    9
+
+
+
+#define VSUSP    10
+#define VDSUSP   11  /* SunOS POSIX nicety I do believe... */
+#define VREPRINT 12
+#define VDISCARD 13
+#define VWERASE  14
+#define VLNEXT   15
+
+/* Kernel keeps vmin/vtime separated, user apps assume vmin/vtime is
+ * shared with eof/eol
+ */
+#ifdef __KERNEL__
+#define VMIN     16
+#define VTIME    17
+#else
+#define VMIN     VEOF
+#define VTIME    VEOL
+#endif
+
+/* c_iflag bits */
+#define IGNBRK	0x00000001
+#define BRKINT	0x00000002
+#define IGNPAR	0x00000004
+#define PARMRK	0x00000008
+#define INPCK	0x00000010
+#define ISTRIP	0x00000020
+#define INLCR	0x00000040
+#define IGNCR	0x00000080
+#define ICRNL	0x00000100
+#define IUCLC	0x00000200
+#define IXON	0x00000400
+#define IXANY	0x00000800
+#define IXOFF	0x00001000
+#define IMAXBEL	0x00002000
+
+/* c_oflag bits */
+#define OPOST	0x00000001
+#define OLCUC	0x00000002
+#define ONLCR	0x00000004
+#define OCRNL	0x00000008
+#define ONOCR	0x00000010
+#define ONLRET	0x00000020
+#define OFILL	0x00000040
+#define OFDEL	0x00000080
+#define NLDLY	0x00000100
+#define   NL0	0x00000000
+#define   NL1	0x00000100
+#define CRDLY	0x00000600
+#define   CR0	0x00000000
+#define   CR1	0x00000200
+#define   CR2	0x00000400
+#define   CR3	0x00000600
+#define TABDLY	0x00001800
+#define   TAB0	0x00000000
+#define   TAB1	0x00000800
+#define   TAB2	0x00001000
+#define   TAB3	0x00001800
+#define   XTABS	0x00001800
+#define BSDLY	0x00002000
+#define   BS0	0x00000000
+#define   BS1	0x00002000
+#define VTDLY	0x00004000
+#define   VT0	0x00000000
+#define   VT1	0x00004000
+#define FFDLY	0x00008000
+#define   FF0	0x00000000
+#define   FF1	0x00008000
+#define PAGEOUT 0x00010000  /* SUNOS specific */
+#define WRAP    0x00020000  /* SUNOS specific */
+
+/* c_cflag bit meaning */
+#define CBAUD	0x0000000f
+#define  B0	0x00000000   /* hang up */
+#define  B50	0x00000001
+#define  B75	0x00000002
+#define  B110	0x00000003
+#define  B134	0x00000004
+#define  B150	0x00000005
+#define  B200	0x00000006
+#define  B300	0x00000007
+#define  B600	0x00000008
+#define  B1200	0x00000009
+#define  B1800	0x0000000a
+#define  B2400	0x0000000b
+#define  B4800	0x0000000c
+#define  B9600	0x0000000d
+#define  B19200	0x0000000e
+#define  B38400	0x0000000f
+#define EXTA    B19200
+#define EXTB    B38400
+#define  CSIZE  0x00000030
+#define   CS5	0x00000000
+#define   CS6	0x00000010
+#define   CS7	0x00000020
+#define   CS8	0x00000030
+#define CSTOPB	0x00000040
+#define CREAD	0x00000080
+#define PARENB	0x00000100
+#define PARODD	0x00000200
+#define HUPCL	0x00000400
+#define CLOCAL	0x00000800
+/* We'll never see these speeds with the Zilogs' but for completeness... */
+#define CBAUDEX 0x00010000
+#define  B57600  0x00010001
+#define  B115200 0x00010002
+#define  B230400 0x00010003
+#define  B460800 0x00010004
+#define CIBAUD	  0x000f0000  /* input baud rate (not used) */
+#define CMSPAR	  010000000000		/* mark or space (stick) parity */
+#define CRTSCTS	  0x80000000  /* flow control */
+
+/* c_lflag bits */
+#define ISIG	0x00000001
+#define ICANON	0x00000002
+#define XCASE	0x00000004
+#define ECHO	0x00000008
+#define ECHOE	0x00000010
+#define ECHOK	0x00000020
+#define ECHONL	0x00000040
+#define NOFLSH	0x00000080
+#define TOSTOP	0x00000100
+#define ECHOCTL	0x00000200
+#define ECHOPRT	0x00000400
+#define ECHOKE	0x00000800
+#define DEFECHO 0x00001000  /* SUNOS thing, what is it? */
+#define FLUSHO	0x00002000
+#define PENDIN	0x00004000
+#define IEXTEN	0x00008000
+
+/* modem lines */
+#define TIOCM_LE	0x001
+#define TIOCM_DTR	0x002
+#define TIOCM_RTS	0x004
+#define TIOCM_ST	0x008
+#define TIOCM_SR	0x010
+#define TIOCM_CTS	0x020
+#define TIOCM_CAR	0x040
+#define TIOCM_RNG	0x080
+#define TIOCM_DSR	0x100
+#define TIOCM_CD	TIOCM_CAR
+#define TIOCM_RI	TIOCM_RNG
+
+/* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */
+#define TIOCSER_TEMT    0x01	/* Transmitter physically empty */
+
+
+/* tcflow() and TCXONC use these */
+#define	TCOOFF		0
+#define	TCOON		1
+#define	TCIOFF		2
+#define	TCION		3
+
+/* tcflush() and TCFLSH use these */
+#define	TCIFLUSH	0
+#define	TCOFLUSH	1
+#define	TCIOFLUSH	2
+
+/* tcsetattr uses these */
+#define	TCSANOW		0
+#define	TCSADRAIN	1
+#define	TCSAFLUSH	2
+
+#endif /* !(_SPARC_TERMBITS_H) */