diff options
-rw-r--r-- | ChangeLog | 34 | ||||
-rw-r--r-- | iconv/loop.c | 4 | ||||
-rw-r--r-- | locale/C-ctype.c | 2 | ||||
-rw-r--r-- | locale/setlocale.c | 3 | ||||
-rw-r--r-- | sysdeps/arm/fpu/bits/fenv.h | 58 | ||||
-rw-r--r-- | sysdeps/arm/fpu/fclrexcpt.c | 39 | ||||
-rw-r--r-- | sysdeps/arm/fpu/fegetenv.c | 29 | ||||
-rw-r--r-- | sysdeps/arm/fpu/fegetround.c | 26 | ||||
-rw-r--r-- | sysdeps/arm/fpu/fesetenv.c | 33 | ||||
-rw-r--r-- | sysdeps/arm/fpu/fesetround.c | 27 | ||||
-rw-r--r-- | sysdeps/arm/fpu/fraiseexcpt.c | 32 | ||||
-rw-r--r-- | sysdeps/arm/fpu/fsetexcptflag.c | 38 | ||||
-rw-r--r-- | sysdeps/arm/fpu/ftestexcept.c | 32 | ||||
-rw-r--r-- | sysdeps/arm/fpu_control.h | 61 | ||||
-rw-r--r-- | wcsmbs/Makefile | 2 | ||||
-rw-r--r-- | wcsmbs/wcsmbs-tst1.c | 57 | ||||
-rw-r--r-- | wcsmbs/wcsnrtombs.c | 16 | ||||
-rw-r--r-- | wcsmbs/wcsrtombs.c | 15 |
18 files changed, 488 insertions, 20 deletions
diff --git a/ChangeLog b/ChangeLog index 0d7f64469b..f41bfafa2e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,37 @@ +1998-05-21 15:27 Ulrich Drepper <drepper@cygnus.com> + + * wcsmbs/wcsnrtombs.c: Correct computation of result. + * wcsmbs/wcsrtombs.c: Likewise. + + * wcsmbs/Makefile (tests): Add wcsmbs-tst1.c. + * wcsmbs/wcsmbs-tst1.c: New file. + + * iconv/loop.c (COUNT_CONVERTED): Correct computation. + + * locale/C-ctype.c (_nl_C_LC_CTYPE): Define MB_CUR_MAX for C locale + as 1. + + * locale/setlocale.c: Don't make _nl_current_* and _nl_C_* references + weak. + +1998-05-21 Philip Blundell <philb@gnu.org> + + * sysdeps/arm/fpu_control.h: Replace stub file with real + implementation. + * sysdeps/arm/fpu/bits/fenv.h: New file. + * sysdeps/arm/fpu/fesetround.c: Likewise. + * sysdeps/arm/fpu/fclrexcpt.c: Likewise. + * sysdeps/arm/fpu/fsetexcptflag.c: Likewise. + * sysdeps/arm/fpu/ftestexcpt.c: Likewise. + * sysdeps/arm/fpu/fraiseexcpt.c: Likewise. + * sysdeps/arm/fpu/fegetenv.c: Likewise. + * sysdeps/arm/fpu/fesetenv.c: Likewise. + +1998-05-21 16:34 Richard Henderson <rth@cygnus.com> + + * elf/dl-load.c (_dl_map_object_from_fd): Get file header with + read instead of mmap. + 1998-05-21 8:16 Richard Henderson <rth@cygnus.com> * sysdeps/unix/sysv/linux/alpha/glob.c: Include sysdeps/generic/glob.c diff --git a/iconv/loop.c b/iconv/loop.c index 596f8a6441..eac4c758e0 100644 --- a/iconv/loop.c +++ b/iconv/loop.c @@ -103,10 +103,10 @@ ? (inptr - *inptrp) : (outptr - *outptrp)) # endif # else -# define COUNT_CONVERTED (inptr - *inptrp) +# define COUNT_CONVERTED ((inptr - *inptrp) / MIN_NEEDED_INPUT) # endif # elif MIN_NEEDED_OUTPUT == MAX_NEEDED_OUTPUT -# define COUNT_CONVERTED (outptr - *outptrp) +# define COUNT_CONVERTED ((outptr - *outptrp) / MIN_NEEDED_OUTPUT) # endif #endif diff --git a/locale/C-ctype.c b/locale/C-ctype.c index 0ea0310093..92b96f21d2 100644 --- a/locale/C-ctype.c +++ b/locale/C-ctype.c @@ -367,7 +367,7 @@ const struct locale_data _nl_C_LC_CTYPE = "print\0" "graph\0" "blank\0" "cntrl\0" "punct\0" "alnum\0" }, { string: "tolower\0" "toupper\0" }, { string: _nl_C_LC_CTYPE_width }, - { word: 2 }, + { word: 1 }, { string: "ANSI_X3.4-1968" } } }; diff --git a/locale/setlocale.c b/locale/setlocale.c index 4b6a300481..54ca416887 100644 --- a/locale/setlocale.c +++ b/locale/setlocale.c @@ -36,8 +36,7 @@ then nothing is using the locale data. */ #define DEFINE_CATEGORY(category, category_name, items, a, b, c, d) \ extern struct locale_data *_nl_current_##category; \ -extern struct locale_data _nl_C_##category; \ -weak_extern (_nl_current_##category) weak_extern (_nl_C_##category) +extern struct locale_data _nl_C_##category; #include "categories.def" #undef DEFINE_CATEGORY diff --git a/sysdeps/arm/fpu/bits/fenv.h b/sysdeps/arm/fpu/bits/fenv.h new file mode 100644 index 0000000000..17b9702751 --- /dev/null +++ b/sysdeps/arm/fpu/bits/fenv.h @@ -0,0 +1,58 @@ +/* Copyright (C) 1997, 1998 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 _FENV_H +# error "Never use <bits/fenv.h> directly; include <fenv.h> instead." +#endif + +/* Define bits representing exceptions in the FPU status word. */ +enum + { + FE_INVALID = 1, +#define FE_INVALID FE_INVALID + FE_DIVBYZERO = 2, +#define FE_DIVBYZERO FE_DIVBYZERO + FE_OVERFLOW = 4, +#define FE_OVERFLOW FE_OVERFLOW + FE_UNDERFLOW = 8, +#define FE_UNDERFLOW FE_UNDERFLOW + }; + +/* Amount to shift by to convert an exception to a mask bit. */ +#define FE_EXCEPTION_SHIFT 16 + +/* All supported exceptions. */ +#define FE_ALL_EXCEPT \ + (FE_INVALID | FE_DIVBYZERO | FE_OVERFLOW | FE_UNDERFLOW) + +/* The ARM FPU basically only supports round-to-nearest. Other rounding + modes exist, but you have to encode them in the actual instruction. */ +#define FE_TONEAREST 0 + +/* Type representing exception flags. */ +typedef unsigned long fexcept_t; + +/* Type representing floating-point environment. */ +typedef struct + { + unsigned long cw; + } +fenv_t; + +/* If the default argument is used we use this value. */ +#define FE_DFL_ENV ((fenv_t *) -1l) diff --git a/sysdeps/arm/fpu/fclrexcpt.c b/sysdeps/arm/fpu/fclrexcpt.c new file mode 100644 index 0000000000..34ad36dfa8 --- /dev/null +++ b/sysdeps/arm/fpu/fclrexcpt.c @@ -0,0 +1,39 @@ +/* Clear given exceptions in current floating-point environment. + Copyright (C) 1997, 1998 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 <fenv.h> +#include <fpu_control.h> + +void +feclearexcept (int excepts) +{ + unsigned long int temp; + + /* Mask out unsupported bits/exceptions. */ + excepts &= FE_ALL_EXCEPT; + + /* Get the current floating point status. */ + _FPU_GETCW(temp); + + /* Clear the relevant bits. */ + temp &= excepts ^ FE_ALL_EXCEPT; + + /* Put the new data in effect. */ + _FPU_SETCW(temp); +} diff --git a/sysdeps/arm/fpu/fegetenv.c b/sysdeps/arm/fpu/fegetenv.c new file mode 100644 index 0000000000..5b31c5e644 --- /dev/null +++ b/sysdeps/arm/fpu/fegetenv.c @@ -0,0 +1,29 @@ +/* Store current floating-point environment. + Copyright (C) 1997, 1998 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 <fenv.h> +#include <fpu_control.h> + +void +fegetenv (fenv_t *envp) +{ + unsigned long int temp; + _FPU_GETCW(temp); + envp->cw = temp; +} diff --git a/sysdeps/arm/fpu/fegetround.c b/sysdeps/arm/fpu/fegetround.c new file mode 100644 index 0000000000..5f354bb4bb --- /dev/null +++ b/sysdeps/arm/fpu/fegetround.c @@ -0,0 +1,26 @@ +/* Return current rounding direction. + Copyright (C) 1997, 1998 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 <fenv.h> + +int +fegetround (void) +{ + return FE_TONEAREST; /* Easy. :-) */ +} diff --git a/sysdeps/arm/fpu/fesetenv.c b/sysdeps/arm/fpu/fesetenv.c new file mode 100644 index 0000000000..b2d3ec5e9f --- /dev/null +++ b/sysdeps/arm/fpu/fesetenv.c @@ -0,0 +1,33 @@ +/* Install given floating-point environment. + Copyright (C) 1997, 1998 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 <fenv.h> +#include <fpu_control.h> + +void +fesetenv (const fenv_t *envp) +{ + if (envp == FE_DFL_ENV) + _FPU_SETCW(_FPU_DEFAULT); + else + { + unsigned long temp = envp->cw; + _FPU_SETCW(temp); + } +} diff --git a/sysdeps/arm/fpu/fesetround.c b/sysdeps/arm/fpu/fesetround.c new file mode 100644 index 0000000000..7591b397e1 --- /dev/null +++ b/sysdeps/arm/fpu/fesetround.c @@ -0,0 +1,27 @@ +/* Set current rounding direction. + Copyright (C) 1997, 1998 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 <fenv.h> + +int +fesetround (int round) +{ + /* We only support FE_TONEAREST, so there is no need for any work. */ + return (round == FE_TONEAREST)?1:0; +} diff --git a/sysdeps/arm/fpu/fraiseexcpt.c b/sysdeps/arm/fpu/fraiseexcpt.c new file mode 100644 index 0000000000..0fbfb16c94 --- /dev/null +++ b/sysdeps/arm/fpu/fraiseexcpt.c @@ -0,0 +1,32 @@ +/* Raise given exceptions. + Copyright (C) 1997, 1998 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 <fenv.h> +#include <fpu_control.h> +#include <math.h> + +void +feraiseexcept (int excepts) +{ + /* Raise exceptions represented by EXPECTS. */ + fexcept_t temp; + _FPU_GETCW(temp); + temp |= (excepts & FE_ALL_EXCEPT); + _FPU_SETCW(temp); +} diff --git a/sysdeps/arm/fpu/fsetexcptflag.c b/sysdeps/arm/fpu/fsetexcptflag.c new file mode 100644 index 0000000000..f5c06a6f6c --- /dev/null +++ b/sysdeps/arm/fpu/fsetexcptflag.c @@ -0,0 +1,38 @@ +/* Set floating-point environment exception handling. + Copyright (C) 1997, 1998 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 <fenv.h> +#include <math.h> +#include <fpu_control.h> + +void +fesetexceptflag (const fexcept_t *flagp, int excepts) +{ + fexcept_t temp; + + /* Get the current environment. */ + _FPU_GETCW(temp); + + /* Set the desired exception mask. */ + temp &= ~((excepts & FE_ALL_EXCEPT) << FE_EXCEPT_SHIFT); + temp |= (*flagp & excepts & FE_ALL_EXCEPT) << FE_EXCEPT_SHIFT; + + /* Save state back to the FPU. */ + _FPU_SETCW(temp); +} diff --git a/sysdeps/arm/fpu/ftestexcept.c b/sysdeps/arm/fpu/ftestexcept.c new file mode 100644 index 0000000000..691d3e1c8e --- /dev/null +++ b/sysdeps/arm/fpu/ftestexcept.c @@ -0,0 +1,32 @@ +/* Test exception in current environment. + Copyright (C) 1997, 1998 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 <fenv.h> +#include <fpu_control.h> + +int +fetestexcept (int excepts) +{ + fexcept_t temp; + + /* Get current exceptions. */ + _FPU_GETCW(temp); + + return temp & excepts & FE_ALL_EXCEPT; +} diff --git a/sysdeps/arm/fpu_control.h b/sysdeps/arm/fpu_control.h index 054085d70a..8a2d338c49 100644 --- a/sysdeps/arm/fpu_control.h +++ b/sysdeps/arm/fpu_control.h @@ -1,5 +1,5 @@ -/* FPU control word definitions. Stub version. - Copyright (C) 1996, 1997 Free Software Foundation, Inc. +/* FPU control word definitions. ARM version. + Copyright (C) 1996, 1997, 1998 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 @@ -20,7 +20,54 @@ #ifndef _FPU_CONTROL_H #define _FPU_CONTROL_H -#define _FPU_RESERVED 0xffffffff /* These bits are reserved. */ +/* We have a slight terminology confusion here. On the ARM, the register + * we're interested in is actually the FPU status word - the FPU control + * word is something different (which is implementation-defined and only + * accessible from supervisor mode.) + * + * The FPSR looks like this: + * + * 31-24 23-16 15-8 7-0 + * | system ID | trap enable | system control | exception flags | + * + * We ignore the system ID bits; for interest's sake they are: + * + * 0000 "old" FPE + * 1000 FPPC hardware + * 0001 FPE 400 + * 1001 FPA hardware + * + * The trap enable and exception flags are both structured like this: + * + * 7 - 5 4 3 2 1 0 + * | reserved | INX | UFL | OFL | DVZ | IVO | + * + * where a `1' bit in the enable byte means that the trap can occur, and + * a `1' bit in the flags byte means the exception has occurred. + * + * The exceptions are: + * + * IVO - invalid operation + * DVZ - divide by zero + * OFL - overflow + * UFL - underflow + * INX - inexact (do not use; implementations differ) + * + * The system control byte looks like this: + * + * 7-5 4 3 2 1 0 + * | reserved | AC | EP | SO | NE | ND | + * + * where the bits mean + * + * ND - no denormalised numbers (force them all to zero) + * NE - enable NaN exceptions + * SO - synchronous operation + * EP - use expanded packed-decimal format + * AC - use alternate definition for C flag on compare operations + */ + +#define _FPU_RESERVED 0xfff0e0f0 /* These bits are reserved. */ /* The fdlibm code requires no interrupts for exceptions. Don't change the rounding mode, it would break long double I/O! */ @@ -29,11 +76,9 @@ /* Type of the control word. */ typedef unsigned int fpu_control_t; -/* Macros for accessing the hardware control word. - * On the ARM, we can't do this from user mode (it would trap). - */ -#define _FPU_GETCW(cw) __asm__ ("movnv r0,r0" : "=g" (cw)) -#define _FPU_SETCW(cw) __asm__ ("movnv r0,r0" : : "g" (cw)) +/* Macros for accessing the hardware control word. */ +#define _FPU_GETCW(cw) __asm__ ("rfs %0" : "=r" (cw)) +#define _FPU_SETCW(cw) __asm__ ("wfs %0" : : "r" (cw)) /* Default control word set at startup. */ extern fpu_control_t __fpu_control; diff --git a/wcsmbs/Makefile b/wcsmbs/Makefile index a601489652..fa5dbef0a6 100644 --- a/wcsmbs/Makefile +++ b/wcsmbs/Makefile @@ -39,7 +39,7 @@ routines := wcscat wcschr wcscmp wcscpy wcscspn wcsdup wcslen wcsncat \ wcscasecmp wcsncase wcscasecmp_l wcsncase_l \ wcsmbsload -tests := tst-wcstof +tests := tst-wcstof wcsmbs-tst1 include ../Rules diff --git a/wcsmbs/wcsmbs-tst1.c b/wcsmbs/wcsmbs-tst1.c new file mode 100644 index 0000000000..30a7faf33e --- /dev/null +++ b/wcsmbs/wcsmbs-tst1.c @@ -0,0 +1,57 @@ +/* Based on a test program by Won Kyu Park <wkpark@chem.skku.ac.kr>. */ + +#include <wchar.h> +#include <stdio.h> +#include <string.h> +#include <wctype.h> +#include <locale.h> + +int +main (void) +{ + int test=0, idx=0; + char buf[100], *pchar; + wchar_t tmp[10]; + wchar_t tmp1[]={L'W',L'o',L'r',L'l',L'd',L'\0'}; + char str[]="Hello"; + int result = 0; + + pchar= setlocale (LC_ALL, ""); + printf ("locale : %s\n",pchar); + printf ("MB_CUR_MAX %d\n", MB_CUR_MAX); + + puts("---- test 1 ------"); + test = mbstowcs (tmp, str, (strlen (str) + 1) * sizeof (char)); + printf ("size of string by mbstowcs %d\n", test); + if (test != strlen (str)) + result = 1; + idx += wctomb (&buf[0], tmp[0]); + idx += wctomb (&buf[idx], tmp[1]); + buf[idx] = 0; + printf ("orig string %s\n", str); + printf ("string by wctomb %s\n", buf); + printf ("string by %%C %C", tmp[0]); + if (tmp[0] != L'H') + result = 1; + printf ("%C\n", tmp[1]); + if (tmp[1] != L'e') + result = 1; + printf ("string by %%S %S\n", tmp); + if (wcscmp (tmp, L"Hello") != 0) + result = 1; + puts("---- test 2 ------"); + printf ("wchar string %S\n", tmp1); + printf ("wchar %C\n", tmp1[0]); + test = wcstombs (buf, tmp1, (wcslen (tmp1) + 1) * sizeof (wchar_t)); + printf ("size of string by wcstombs %d\n", test); + if (test != wcslen (tmp1)) + result = 1; + test = wcslen (tmp1); + printf ("size of string by wcslen %d\n", test); + printf ("char %s\n", buf); + if (strcmp (buf, "World") != 0) + result = 1; + puts("------------------"); + + return result; +} diff --git a/wcsmbs/wcsnrtombs.c b/wcsmbs/wcsnrtombs.c index ab74e30927..18537c2a24 100644 --- a/wcsmbs/wcsnrtombs.c +++ b/wcsmbs/wcsnrtombs.c @@ -46,7 +46,7 @@ __wcsnrtombs (dst, src, nwc, len, ps) struct gconv_step_data data; const wchar_t *srcend; int status; - size_t result = 0; + size_t result; /* Tell where we want the result. */ data.invocation_counter = 0; @@ -66,7 +66,9 @@ __wcsnrtombs (dst, src, nwc, len, ps) { char buf[256]; /* Just an arbitrary value. */ const wchar_t *inbuf = *src; + size_t dummy; + result = 0; data.outbufend = buf + sizeof (buf); do @@ -77,7 +79,10 @@ __wcsnrtombs (dst, src, nwc, len, ps) &data, (const char **) &inbuf, (const char *) srcend, - &result, 0); + &dummy, 0); + + /* Count the number of bytes. */ + result += data.outbuf - buf; } while (status == GCONV_FULL_OUTPUT); @@ -91,13 +96,18 @@ __wcsnrtombs (dst, src, nwc, len, ps) /* This code is based on the safe assumption that all internal multi-byte encodings use the NUL byte only to mark the end of the string. */ + size_t dummy; + data.outbuf = dst; data.outbufend = dst + len; status = (*__wcsmbs_gconv_fcts.tomb->fct) (__wcsmbs_gconv_fcts.tomb, &data, (const char **) src, (const char *) srcend, - &result, 0); + &dummy, 0); + + /* Count the number of bytes. */ + result = data.outbuf - dst; /* We have to determine whether the last character converted is the NUL character. */ diff --git a/wcsmbs/wcsrtombs.c b/wcsmbs/wcsrtombs.c index b40d14318a..fbcf0c7c5c 100644 --- a/wcsmbs/wcsrtombs.c +++ b/wcsmbs/wcsrtombs.c @@ -42,7 +42,7 @@ __wcsrtombs (dst, src, len, ps) { struct gconv_step_data data; int status; - size_t result = 0; + size_t result; /* Tell where we want the result. */ data.invocation_counter = 0; @@ -59,7 +59,9 @@ __wcsrtombs (dst, src, len, ps) char buf[256]; /* Just an arbitrary value. */ const wchar_t *srcend = *src + __wcslen (*src) + 1; const wchar_t *inbuf = *src; + size_t dummy; + result = 0; data.outbufend = buf + sizeof (buf); do @@ -70,7 +72,10 @@ __wcsrtombs (dst, src, len, ps) &data, (const char **) &inbuf, (const char *) srcend, - &result, 0); + &dummy, 0); + + /* Count the number of bytes. */ + result += data.outbuf - buf; } while (status == GCONV_FULL_OUTPUT); @@ -88,6 +93,7 @@ __wcsrtombs (dst, src, len, ps) multi-byte encodings use the NUL byte only to mark the end of the string. */ const wchar_t *srcend = *src + __wcsnlen (*src, len * MB_CUR_MAX) + 1; + size_t dummy; data.outbuf = dst; data.outbufend = dst + len; @@ -95,7 +101,10 @@ __wcsrtombs (dst, src, len, ps) status = (*__wcsmbs_gconv_fcts.tomb->fct) (__wcsmbs_gconv_fcts.tomb, &data, (const char **) src, (const char *) srcend, - &result, 0); + &dummy, 0); + + /* Count the number of bytes. */ + result = data.outbuf - dst; /* We have to determine whether the last character converted is the NUL character. */ |