summary refs log tree commit diff
path: root/stdlib/mbstowcs.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/mbstowcs.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/mbstowcs.c')
-rw-r--r--stdlib/mbstowcs.c60
1 files changed, 14 insertions, 46 deletions
diff --git a/stdlib/mbstowcs.c b/stdlib/mbstowcs.c
index 38c710279a..8eda3ba41d 100644
--- a/stdlib/mbstowcs.c
+++ b/stdlib/mbstowcs.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1992 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 1992, 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,62 +16,30 @@ 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 <ctype.h>
-#include <stddef.h>
 #include <stdlib.h>
+#include <wchar.h>
 
 
-extern int _mb_shift;	/* Defined in mbtowc.c.  */
+extern mbstate_t __no_r_state;	/* Defined in mbtowc.c.  */
 
 /* Convert the string of multibyte characters in S to `wchar_t's in
    PWCS, writing no more than N.  Return the number written,
-   or (size_t) -1 if an invalid multibyte character is encountered.  */
+   or (size_t) -1 if an invalid multibyte character is encountered.
+
+   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 `mbsrtowcs'.  */
 size_t
-DEFUN(mbstowcs, (pwcs, s, n),
-      register wchar_t *pwcs AND register CONST char *s AND register size_t n)
+mbstowcs (wchar_t *pwcs, const char *s, size_t n)
 {
-  int save_shift;
-  register size_t written = 0;
-
-  /* Save the shift state.  */
-  save_shift = _mb_shift;
-  /* Reset the shift state.  */
-  _mb_shift = 0;
-
-  while (*s != '\0')
-    {
-      int len;
-      if (isascii (*s))
-	{
-	  *pwcs = (wchar_t) *s;
-	  len = 1;
-	}
-      else
-	len = mbtowc (pwcs, s, n);
-
-      if (len < 1)
-	{
-	  /* Return an error.  */
-	  written = (size_t) -1;
-	  break;
-	}
-      else
-	{
-	  /* Multibyte character converted.  */
-	  ++pwcs;
-	  ++written;
-	  s += len;
-	  n -= len;
-	}
-    }
+  mbstate_t save_shift = __no_r_state;
+  size_t written;
 
-  /* Terminate the string if it has space.  */
-  if (n > 0)
-    *pwcs = (wchar_t) 0;
+  written = mbsrtowcs (pwcs, s, n, &__no_r_state);
 
   /* Restore the old shift state.  */
-  _mb_shift = save_shift;
+  __no_r_state = save_shift;
 
   /* Return how many we wrote (or maybe an error).  */
   return written;