summary refs log tree commit diff
path: root/stdlib/wcstombs.c
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>1996-06-28 08:56:59 +0000
committerRoland McGrath <roland@gnu.org>1996-06-28 08:56:59 +0000
commit6dbe2837567f528faa015fd0cf1536201dde5ffd (patch)
treed57cdf3a36d554391ae971f2f356569e85c3a1c1 /stdlib/wcstombs.c
parent47ce6a308c73d2f2bd367d4609d1bea30c9eb596 (diff)
downloadglibc-6dbe2837567f528faa015fd0cf1536201dde5ffd.tar.gz
glibc-6dbe2837567f528faa015fd0cf1536201dde5ffd.tar.xz
glibc-6dbe2837567f528faa015fd0cf1536201dde5ffd.zip
Fri Jun 28 02:41:08 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu> cvs/libc-960628
	* nss/Makefile (databases): New variable.
	(routines, libnss_files-routines): Use it.
	(subdir-dirs): Compute from $(services).

	* sysdeps/unix/sysv/linux/syscalls.list (create_module, delete_module,
	init_module, klogctl): Use EXTRA in the "caller" column so these get
	added to unix-extra-syscalls and thus compiled in misc.

	* string/Makefile (routines): Add strndup.
	* string/strndup.c: New file.
	* string/string.h: Declare strndup.
	(strndupa): New macro.

	* string/string.h: Declare __strdup.
	* string/strdup.c: Deansideclized.  Define __ name and weak alias.

	* string/string.h: Don't define memccpy as macro for [__OPTIMIZE__].

Thu Jun 27 23:43:22 1996  Richard Henderson  <rth@tamu.edu>

	* sysdeps/alpha/dl-machine.h (elf_machine_rela):  The Alpha's
	address-of operation and plt format conspire to require all
	dynamic relocs to be resolved to actual symbols not plt entries.

Thu Jun 27 02:49:28 1996  Ulrich Drepper  <drepper@cygnus.com>

	* catgets/gencat.c: Add casts to avoid signed<->unsigned warnings.

	* grp/initgroups.c (initgroups): De-ansi-fy.
	Move declaration of NGROUPS and GROUPS outside #if so that
	the code compiles for NGROUPS_MAX != 0.

	* inet/Makefile (headers): Add netinet/ether.h and netinet/if_ether.h.
	(routines): Add ether_aton, ether_aton_r, ether_hton, ether_line,
	ether_ntoa, ether_ntoa_r, and ether_ntoh.
	* inet/ether_aton.c, inet/ether_aton_r.c, inet/ether_hton.c,
	inet/ether_line.c, inet/ether_ntoa.c, inet/ether_ntoa_r.c,
	inet/ether_ntoh.c: New files.  Implementation of functions to
	handle Ethernet address to host mapping.
	* inet/netinet/ether.h: New file.  Declare ether_* functions.
	* netinet/ether.h: Wrapper around inet/netinet/ether.h for glibc
	compilation.
	* nss/ethers-lookup.c: New file.  Lookup function for ethers database.
	* nss/Makefile (routines): Add ethers-lookup.
	(libnss_files-routines): Add files-ethers.

	* nss/getXXent_r.c: Don't define set*ent and end*ent function
	with _r suffix.

	* nss/nss_files/files-XXX.c (internal_endent): Don't reset
	KEEP_STREAM every time called.
	(_nss_files_end): Reset KEEP_STREAM here instead.
	(internal_getent): If STREAM == NULL try to open instead of
	signalling error.
	Use cast to prevent warning.
	Terminate read line in case the buffer is too small.

	* nss/nss_files/files-ethers.c: New file.  Implementation of
	Ethernet adress<->hostname lookup through files interface.

	* stdlib/mbstowcs.c: Define based on mbsrtowcs().
	* stdlib/mbtowc.c: Define based on mbrtowc().
	* stdlib/wcstombs.c: Define based on wcsrtombs().
	* stdlib/wctomb.c: Define based on wcrtomb().

	* sunrpc/xdr.c (xdr_u_int): Avoid bogus call to
	unexpected_sizes_in_xdr_u_int.

	* sysdeps/generic/netinet/if_ether.h: New file.  Generic declaration
	of `struct ether_addr'.
	* sysdeps/unix/sysv/linux/netinet/if_ether.h: New file.  Linux specific
	declaration of `struct ether_addr'.

	* wcsmbs/mbrtowc.c: Handle case where argument PS is NULL.
	* wcsmbs/mbsrtowcs.c: Ditto.
	* wcsmbs/wcrtomb.c: Ditto.
	* wcsmbs/wcsrtombs.c: Ditto.

	* wcsmbs/mbsinit.c: Prepare for PS being NULL.
Diffstat (limited to 'stdlib/wcstombs.c')
-rw-r--r--stdlib/wcstombs.c72
1 files changed, 17 insertions, 55 deletions
diff --git a/stdlib/wcstombs.c b/stdlib/wcstombs.c
index 6ddbfb1725..6518308181 100644
--- a/stdlib/wcstombs.c
+++ b/stdlib/wcstombs.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1992, 1995 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 1992, 1995, 1996 Free Software Foundation, Inc.
 This file is part of the GNU C Library.
 
 The GNU C Library is free software; you can redistribute it and/or
@@ -16,69 +16,31 @@ License along with the GNU C Library; see the file COPYING.LIB.  If
 not, write to the Free Software Foundation, Inc., 675 Mass Ave,
 Cambridge, MA 02139, USA.  */
 
-#include <ansidecl.h>
-#include "../locale/localeinfo.h"
-#include <ctype.h>
-#include <stddef.h>
-#include <stdio.h>
 #include <stdlib.h>
-#include <string.h>
+#include <wchar.h>
 
 
+extern mbstate_t __no_r_state;	/* Defined in mbtowc.c.  */
+
 /* Convert the `wchar_t' string in PWCS to a multibyte character string
    in S, writing no more than N characters.  Return the number of bytes
-   written, or (size_t) -1 if an invalid `wchar_t' was found.  */
+   written, or (size_t) -1 if an invalid `wchar_t' was found.
+
+   Attention: this function should NEVER be intentionally used.
+   The interface is completely stupid.  The state is shared between
+   all conversion functions.  You should use instead the restartable
+   version `wcsrtombs'.  */
 size_t
-DEFUN(wcstombs, (s, pwcs, n),
-      register char *s AND register CONST wchar_t *pwcs AND register size_t n)
+wcstombs (char *s, const wchar_t *pwcs, size_t n)
 {
-#if 0
-  register CONST mb_char *mb;
-  register int shift = 0;
-#endif
-
-  register size_t written = 0;
-  register wchar_t w;
+  mbstate_t save_shift = __no_r_state;
+  size_t written;
 
-  while ((w = *pwcs++) != (wchar_t) '\0')
-    {
-      if (isascii (w))
-	{
-	  /* A normal character.  */
-	  *s++ = (unsigned char) w;
-	  --n;
-	  ++written;
-	}
-      else
-	{
-#if 1
-	  written = (size_t) -1;
-	  break;
-#else
-	  mb = &_ctype_info->mbchar->mb_chars[w + shift];
-	  if (mb->string == NULL || mb->len == 0)
-	    {
-	      written = (size_t) -1;
-	      break;
-	    }
-	  else if (mb->len > n)
-	    break;
-	  else
-	    {
-	      memcpy ((PTR) s, (CONST PTR) mb->string, mb->len);
-	      s += mb->len;
-	      n -= mb->len;
-	      written += mb->len;
-	      shift += mb->shift;
-	    }
-#endif
-	}
-    }
+  written = mbsrtowcs (pwcs, s, n, &__no_r_state);
 
-  /* Terminate the string if it has space.  */
-  if (n > 0)
-    *s = '\0';
+  /* Restore the old shift state.  */
+  __no_r_state = save_shift;
 
-  /* Return the number of characters written (or maybe an error).  */
+  /* Return how many we wrote (or maybe an error).  */
   return written;
 }