diff options
-rw-r--r-- | ChangeLog | 12 | ||||
-rw-r--r-- | stdlib/mblen.c | 13 | ||||
-rw-r--r-- | stdlib/mbstowcs.c | 16 | ||||
-rw-r--r-- | stdlib/mbtowc.c | 4 | ||||
-rw-r--r-- | stdlib/wctomb.c | 4 |
5 files changed, 34 insertions, 15 deletions
@@ -1,3 +1,15 @@ +1999-07-28 Ulrich Drepper <drepper@cygnus.com> + + * stdlib/mblen.c: Use static state. + Reported by Bruno Haible <haible@ilog.fr>. + + * stdlib/mbtowc.c: Reset state for s == NULL. + * stdlib/wctomb.c: Likewise. + Reported by Bruno Haible <haible@ilog.fr>. + + * stdlib/mbstowcs.c: Do not use global state. + Reported by Bruno Haible <haible@ilog.fr>. + 1999-07-28 Andeas Schwab <schwab@suse.de> * iconvdata/Makefile: Don't try to run iconv tests when cross diff --git a/stdlib/mblen.c b/stdlib/mblen.c index 3a9755b..760da60 100644 --- a/stdlib/mblen.c +++ b/stdlib/mblen.c @@ -17,19 +17,22 @@ Boston, MA 02111-1307, USA. */ #include <stdlib.h> +#include <string.h> #include <wchar.h> #include <gconv.h> #include <wcsmbs/wcsmbsload.h> +/* Internal state. */ +static mbstate_t state; + /* Return the length of the multibyte character (if there is one) at S which is no longer than N characters. The ISO C standard says that the `mblen' function must not change - the global state. */ + the state of the `mbtowc' function. */ int mblen (const char *s, size_t n) { - mbstate_t state; int result; /* If S is NULL the function has to return null or not null @@ -40,11 +43,13 @@ mblen (const char *s, size_t n) /* Make sure we use the correct value. */ update_conversion_ptrs (); + /* Reset the state. */ + memset (&state, '\0', sizeof state); + result = __wcsmbs_gconv_fcts.towc->__stateful; } else if (*s == '\0') - /* According to the ISO C 89 standard this is the expected behaviour. - Idiotic, but true. */ + /* According to the ISO C 89 standard this is the expected behaviour. */ result = 0; else { diff --git a/stdlib/mbstowcs.c b/stdlib/mbstowcs.c index 7b9d84c..b7e6123 100644 --- a/stdlib/mbstowcs.c +++ b/stdlib/mbstowcs.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991, 1992, 1996, 1997 Free Software Foundation, Inc. +/* Copyright (C) 1991, 1992, 1996, 1997, 1999 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 @@ -17,11 +17,10 @@ Boston, MA 02111-1307, USA. */ #include <stdlib.h> +#include <string.h> #include <wchar.h> -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. @@ -33,14 +32,9 @@ extern mbstate_t __no_r_state; /* Defined in mbtowc.c. */ size_t mbstowcs (wchar_t *pwcs, const char *s, size_t n) { - mbstate_t save_shift = __no_r_state; - size_t written; - - written = __mbsrtowcs (pwcs, &s, n, &__no_r_state); - - /* Restore the old shift state. */ - __no_r_state = save_shift; + mbstate_t state; + memset (&state, '\0', sizeof state); /* Return how many we wrote (or maybe an error). */ - return written; + return __mbsrtowcs (pwcs, &s, n, &state); } diff --git a/stdlib/mbtowc.c b/stdlib/mbtowc.c index a8df154..aeac2ce 100644 --- a/stdlib/mbtowc.c +++ b/stdlib/mbtowc.c @@ -46,6 +46,10 @@ mbtowc (wchar_t *pwc, const char *s, size_t n) /* Make sure we use the correct value. */ update_conversion_ptrs (); + /* This is an extension in the Unix standard which does not directly + violate ISO C. */ + memset (&__no_r_state, '\0', siyeof __no_r_state); + result = __wcsmbs_gconv_fcts.towc->__stateful; } else if (*s == '\0') diff --git a/stdlib/wctomb.c b/stdlib/wctomb.c index 2df8b99..757e6ad 100644 --- a/stdlib/wctomb.c +++ b/stdlib/wctomb.c @@ -42,6 +42,10 @@ wctomb (char *s, wchar_t wchar) /* Make sure we use the correct value. */ update_conversion_ptrs (); + /* This is an extension in the Unix standard which does not directly + violate ISO C. */ + memset (&__no_r_state, '\0', siyeof __no_r_state); + return __wcsmbs_gconv_fcts.tomb->__stateful; } |