]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Update.
authorUlrich Drepper <drepper@redhat.com>
Thu, 21 May 1998 15:40:14 +0000 (15:40 +0000)
committerUlrich Drepper <drepper@redhat.com>
Thu, 21 May 1998 15:40:14 +0000 (15:40 +0000)
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.

18 files changed:
ChangeLog
iconv/loop.c
locale/C-ctype.c
locale/setlocale.c
sysdeps/arm/fpu/bits/fenv.h [new file with mode: 0644]
sysdeps/arm/fpu/fclrexcpt.c [new file with mode: 0644]
sysdeps/arm/fpu/fegetenv.c [new file with mode: 0644]
sysdeps/arm/fpu/fegetround.c [new file with mode: 0644]
sysdeps/arm/fpu/fesetenv.c [new file with mode: 0644]
sysdeps/arm/fpu/fesetround.c [new file with mode: 0644]
sysdeps/arm/fpu/fraiseexcpt.c [new file with mode: 0644]
sysdeps/arm/fpu/fsetexcptflag.c [new file with mode: 0644]
sysdeps/arm/fpu/ftestexcept.c [new file with mode: 0644]
sysdeps/arm/fpu_control.h
wcsmbs/Makefile
wcsmbs/wcsmbs-tst1.c [new file with mode: 0644]
wcsmbs/wcsnrtombs.c
wcsmbs/wcsrtombs.c

index 0d7f64469bf1cf2f54dfa7365fc4fbe3de868157..f41bfafa2ea91e2cf254f3abdd28732bcdc8f523 100644 (file)
--- 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
index 596f8a644143e6355db4b01a741d7b3df63ad489..eac4c758e0a5efab585fc7ee858aba6aa9ba53a1 100644 (file)
    ? (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
 
index 0ea0310093eaedb646dc55c851b0c7518797096f..92b96f21d2f8c898976bbea672bc38d54b3f03d7 100644 (file)
@@ -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" }
   }
 };
index 4b6a300481dab66586e54db5a2e07e9da8ff3b6b..54ca4168878d8f0f5896e61e8ecb2bbb4ed5ce27 100644 (file)
@@ -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 (file)
index 0000000..17b9702
--- /dev/null
@@ -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 (file)
index 0000000..34ad36d
--- /dev/null
@@ -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 (file)
index 0000000..5b31c5e
--- /dev/null
@@ -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 (file)
index 0000000..5f354bb
--- /dev/null
@@ -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 (file)
index 0000000..b2d3ec5
--- /dev/null
@@ -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 (file)
index 0000000..7591b39
--- /dev/null
@@ -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 (file)
index 0000000..0fbfb16
--- /dev/null
@@ -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 (file)
index 0000000..f5c06a6
--- /dev/null
@@ -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 (file)
index 0000000..691d3e1
--- /dev/null
@@ -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;
+}
index 054085d70a3db7896367af0b0ab9eecc6920133a..8a2d338c49e8ab30c7bcd1d8a21286ea883fd17c 100644 (file)
@@ -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
 #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!  */
 /* 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;
index a6014896529a0d5314fe672cbd2789c740599582..fa5dbef0a612cf581557fd01ceb28be4527a8155 100644 (file)
@@ -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 (file)
index 0000000..30a7faf
--- /dev/null
@@ -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;
+}
index ab74e30927cff05b3ba208285dcc38ec696f6701..18537c2a2413b60f636cdbd9a8c2fb90f91c75f2 100644 (file)
@@ -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.  */
index b40d14318a3fdcd70d525cfb3af0fbdc4038c964..fbcf0c7c5c6cc9fefeb31fbfdec6a9dc286acad0 100644 (file)
@@ -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.  */