From 9f097308c7465443765d1e25699a4cf33eff5455 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Wed, 28 Jul 1999 19:37:40 +0000 Subject: [PATCH] Update. 1999-07-28 Ulrich Drepper * stdlib/mblen.c: Use static state. Reported by Bruno Haible . * stdlib/mbtowc.c: Reset state for s == NULL. * stdlib/wctomb.c: Likewise. Reported by Bruno Haible . * stdlib/mbstowcs.c: Do not use global state. Reported by Bruno Haible . --- ChangeLog | 12 ++++++++++++ stdlib/mblen.c | 13 +++++++++---- stdlib/mbstowcs.c | 16 +++++----------- stdlib/mbtowc.c | 4 ++++ stdlib/wctomb.c | 4 ++++ 5 files changed, 34 insertions(+), 15 deletions(-) diff --git a/ChangeLog b/ChangeLog index c18c837a81..5c6a58b603 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +1999-07-28 Ulrich Drepper + + * stdlib/mblen.c: Use static state. + Reported by Bruno Haible . + + * stdlib/mbtowc.c: Reset state for s == NULL. + * stdlib/wctomb.c: Likewise. + Reported by Bruno Haible . + + * stdlib/mbstowcs.c: Do not use global state. + Reported by Bruno Haible . + 1999-07-28 Andeas Schwab * iconvdata/Makefile: Don't try to run iconv tests when cross diff --git a/stdlib/mblen.c b/stdlib/mblen.c index 3a9755bcea..760da60d73 100644 --- a/stdlib/mblen.c +++ b/stdlib/mblen.c @@ -17,19 +17,22 @@ Boston, MA 02111-1307, USA. */ #include +#include #include #include #include +/* 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 7b9d84c259..b7e6123517 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 +#include #include -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 a8df154b75..aeac2ce0b8 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 2df8b998d5..757e6adaad 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; }