summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog34
-rw-r--r--iconv/loop.c4
-rw-r--r--locale/C-ctype.c2
-rw-r--r--locale/setlocale.c3
-rw-r--r--sysdeps/arm/fpu/bits/fenv.h58
-rw-r--r--sysdeps/arm/fpu/fclrexcpt.c39
-rw-r--r--sysdeps/arm/fpu/fegetenv.c29
-rw-r--r--sysdeps/arm/fpu/fegetround.c26
-rw-r--r--sysdeps/arm/fpu/fesetenv.c33
-rw-r--r--sysdeps/arm/fpu/fesetround.c27
-rw-r--r--sysdeps/arm/fpu/fraiseexcpt.c32
-rw-r--r--sysdeps/arm/fpu/fsetexcptflag.c38
-rw-r--r--sysdeps/arm/fpu/ftestexcept.c32
-rw-r--r--sysdeps/arm/fpu_control.h61
-rw-r--r--wcsmbs/Makefile2
-rw-r--r--wcsmbs/wcsmbs-tst1.c57
-rw-r--r--wcsmbs/wcsnrtombs.c16
-rw-r--r--wcsmbs/wcsrtombs.c15
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. */