about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--localedata/ChangeLog5
-rw-r--r--localedata/Makefile4
-rwxr-xr-xlocaledata/tst-langinfo.sh47
-rw-r--r--stdlib/Makefile5
-rw-r--r--stdlib/jrand48_r.c9
-rw-r--r--stdlib/tst-rand48.c390
7 files changed, 454 insertions, 11 deletions
diff --git a/ChangeLog b/ChangeLog
index 7089a2b02a..ae16f97217 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2001-01-19  Ulrich Drepper  <drepper@redhat.com>
 
+	* stdlib/jrand48_r.c (__jrand48_r): Correct constructing of
+	results.  Reported by Jeff Higham <jhigham@algorithmics.com>.
+	* stdlib/tst-rand48.c: New file.
+	* stdlib/Makefile (tests): Add tst-rand48.
+
 	* locale/newlocale.c (__newlocale): Fix test for setting all
 	categories.
 
diff --git a/localedata/ChangeLog b/localedata/ChangeLog
index a643772b8e..b42520b272 100644
--- a/localedata/ChangeLog
+++ b/localedata/ChangeLog
@@ -1,3 +1,8 @@
+2001-01-19  Ulrich Drepper  <drepper@redhat.com>
+
+	* Makefile (LOCALES): Add fr_FR.ISO-8859-1.
+	* tst-langinfo.sh: Add French tests.
+
 2001-01-08  Jakub Jelinek  <jakub@redhat.com>
 
 	* locales/cs_CZ: Fix grammar of comment above abmon.
diff --git a/localedata/Makefile b/localedata/Makefile
index dc8b323b8a..235c7b962a 100644
--- a/localedata/Makefile
+++ b/localedata/Makefile
@@ -1,4 +1,4 @@
-# Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
+# Copyright (C) 1996,1997,1998,1999,2000,2001 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
@@ -123,7 +123,7 @@ ifeq (no,$(cross-compiling))
 # We have to generate locales
 LOCALES := de_DE.ISO-8859-1 de_DE.UTF-8 en_US.ANSI_X3.4-1968 \
 	   en_US.ISO-8859-1 ja_JP.EUC-JP da_DK.ISO-8859-1 \
-	   hr_HR.ISO-8859-2 sv_SE.ISO-8859-1 ja_JP.SJIS
+	   hr_HR.ISO-8859-2 sv_SE.ISO-8859-1 ja_JP.SJIS fr_FR.ISO-8859-1
 LOCALE_SRCS := $(shell echo "$(LOCALES)"|sed 's/\([^ .]*\)[^ ]*/\1/g')
 CHARMAPS := $(shell echo "$(LOCALES)"|sed 's/[^ .]*[.]\([^ ]*\)/\1/g')
 CTYPE_FILES = $(addsuffix /LC_CTYPE,$(LOCALES))
diff --git a/localedata/tst-langinfo.sh b/localedata/tst-langinfo.sh
index 3a46201284..86d514e000 100755
--- a/localedata/tst-langinfo.sh
+++ b/localedata/tst-langinfo.sh
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Test nl_langinfo.
-# Copyright (C) 2000 Free Software Foundation, Inc.
+# Copyright (C) 2000, 2001 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
@@ -244,6 +244,51 @@ de_DE.UTF-8          RADIXCHAR   ,
 de_DE.UTF-8          THOUSEP     .
 de_DE.UTF-8          YESEXPR     ^[jJyY].*
 de_DE.UTF-8          NOEXPR      ^[nN].*
+fr_FR.ISO-8859-1     ABDAY_1     dim
+fr_FR.ISO-8859-1     ABDAY_2     lun
+fr_FR.ISO-8859-1     ABDAY_3     mar
+fr_FR.ISO-8859-1     ABDAY_4     mer
+fr_FR.ISO-8859-1     ABDAY_5     jeu
+fr_FR.ISO-8859-1     ABDAY_6     ven
+fr_FR.ISO-8859-1     ABDAY_7     sam
+fr_FR.ISO-8859-1     DAY_1       dimanche
+fr_FR.ISO-8859-1     DAY_2       lundi
+fr_FR.ISO-8859-1     DAY_3       mardi
+fr_FR.ISO-8859-1     DAY_4       mercredi
+fr_FR.ISO-8859-1     DAY_5       jeudi
+fr_FR.ISO-8859-1     DAY_6       vendredi
+fr_FR.ISO-8859-1     DAY_7       samedi
+fr_FR.ISO-8859-1     ABMON_1     jan
+fr_FR.ISO-8859-1     ABMON_2     fév
+fr_FR.ISO-8859-1     ABMON_3     mar
+fr_FR.ISO-8859-1     ABMON_4     avr
+fr_FR.ISO-8859-1     ABMON_5     mai
+fr_FR.ISO-8859-1     ABMON_6     jun
+fr_FR.ISO-8859-1     ABMON_7     jui
+fr_FR.ISO-8859-1     ABMON_8     aoû
+fr_FR.ISO-8859-1     ABMON_9     sep
+fr_FR.ISO-8859-1     ABMON_10    oct
+fr_FR.ISO-8859-1     ABMON_11    nov
+fr_FR.ISO-8859-1     ABMON_12    déc
+fr_FR.ISO-8859-1     MON_1       janvier
+fr_FR.ISO-8859-1     MON_2       février
+fr_FR.ISO-8859-1     MON_3       mars
+fr_FR.ISO-8859-1     MON_4       avril
+fr_FR.ISO-8859-1     MON_5       mai
+fr_FR.ISO-8859-1     MON_6       juin
+fr_FR.ISO-8859-1     MON_7       juillet
+fr_FR.ISO-8859-1     MON_8       août
+fr_FR.ISO-8859-1     MON_9       septembre
+fr_FR.ISO-8859-1     MON_10      octobre
+fr_FR.ISO-8859-1     MON_11      novembre
+fr_FR.ISO-8859-1     MON_12      décembre
+fr_FR.ISO-8859-1     D_T_FMT     "%a %d %b %Y %T %Z"
+fr_FR.ISO-8859-1     D_FMT       "%d.%m.%Y"
+fr_FR.ISO-8859-1     T_FMT       "%T"
+fr_FR.ISO-8859-1     RADIXCHAR   ,
+fr_FR.ISO-8859-1     THOUSEP     ""
+fr_FR.ISO-8859-1     YESEXPR     ^[oOyY].*
+fr_FR.ISO-8859-1     NOEXPR      ^[nN].*
 ja_JP.EUC-JP         ABDAY_1     Æü
 ja_JP.EUC-JP         ABDAY_2     ·î
 ja_JP.EUC-JP         ABDAY_3     ²Ð
diff --git a/stdlib/Makefile b/stdlib/Makefile
index a20a30768f..f93dc221b0 100644
--- a/stdlib/Makefile
+++ b/stdlib/Makefile
@@ -1,4 +1,4 @@
-# Copyright (C) 1991-1999, 2000 Free Software Foundation, Inc.
+# Copyright (C) 1991-1999, 2000, 2001 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
@@ -53,7 +53,8 @@ distribute	:= exit.h grouping.h abort-instr.h isomac.c tst-fmtmsg.sh
 test-srcs	:= tst-fmtmsg
 tests		:= tst-strtol tst-strtod testmb testrand testsort testdiv \
 		   test-canon test-canon2 tst-strtoll tst-environ	  \
-		   tst-xpg-basename tst-random tst-bsearch tst-limits
+		   tst-xpg-basename tst-random tst-bsearch tst-limits	  \
+		   tst-rand48
 
 
 # Several mpn functions from GNU MP are used by the strtod function.
diff --git a/stdlib/jrand48_r.c b/stdlib/jrand48_r.c
index 95f3ec62b2..48def5ef35 100644
--- a/stdlib/jrand48_r.c
+++ b/stdlib/jrand48_r.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995, 1997, 1998 Free Software Foundation, Inc.
+/* Copyright (C) 1995, 1997, 1998, 2001 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
 
@@ -31,12 +31,9 @@ __jrand48_r (xsubi, buffer, result)
 
   /* Store the result.  */
   if (sizeof (unsigned short int) == 2)
-    *result = ((xsubi[2] & 0x7fff) << 16) | xsubi[1];
+    *result = (xsubi[2] << 16) | xsubi[1];
   else
-    *result = xsubi[2] & 0x7fffffffl;
-
-  if (xsubi[2] & (1 << (sizeof (xsubi[2]) * 8 - 1)))
-    *result *= -1;
+    *result = xsubi[2] & 0xffffffffl;
 
   return 0;
 }
diff --git a/stdlib/tst-rand48.c b/stdlib/tst-rand48.c
new file mode 100644
index 0000000000..fd2c4c1955
--- /dev/null
+++ b/stdlib/tst-rand48.c
@@ -0,0 +1,390 @@
+#include <float.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifndef DECIMAL_DIG
+# define DECIMAL_DIG	21
+#endif
+
+
+int
+main (void)
+{
+  unsigned short int xs[3] = { 0x0001, 0x0012, 0x0123 };
+  unsigned short int lxs[7];
+  unsigned short int *xsp;
+  int result = 0;
+  long int l;
+  double d;
+  double e;
+
+  /* Test srand48.  */
+  srand48 (0x98765432);
+  /* Get the values of the internal Xi array.  */
+  xsp = seed48 (xs);
+  if (xsp[0] != 0x330e || xsp[1] != 0x5432 || xsp[2] != 0x9876)
+    {
+      puts ("srand48(0x98765432) didn't set correct value");
+      printf ("  expected: { %04hx, %04hx, %04hx }\n", 0x330e, 0x5432, 0x9876);
+      printf ("  seen:     { %04hx, %04hx, %04hx }\n", xsp[0], xsp[1], xsp[2]);
+      result = 1;
+    }
+  /* Put the values back.  */
+  memcpy (xs, xsp, sizeof (xs));
+  (void) seed48 (xs);
+
+  /* See whether the correct values are installed.  */
+  l = lrand48 ();
+  if (l != 0x2fed1413l)
+    {
+      printf ("lrand48() in line %d failed: expected %lx, seen %lx\n",
+	      __LINE__ - 4, 0x2fed1413l, l);
+      result = 1;
+    }
+
+  l = mrand48 ();
+  if (l != 0xa28c1003l)
+    {
+      printf ("mrand48() in line %d failed: expected %lx, seen %lx\n",
+	      __LINE__ - 4, 0xa28c1003l, l);
+      result = 1;
+    }
+
+  l = lrand48 ();
+  if (l != 0x585fcfb7l)
+    {
+      printf ("lrand48() in line %d failed: expected %lx, seen %lx\n",
+	      __LINE__ - 4, 0x585fcfb7l, l);
+      result = 1;
+    }
+
+  l = mrand48 ();
+  if (l != 0x9e88f474l)
+    {
+      printf ("mrand48() in line %d failed: expected %lx, seen %lx\n",
+	      __LINE__ - 4, 0x9e88f474l, l);
+      result = 1;
+    }
+
+  /* Test seed48.  The previous call should have install the values in
+     the initialization of `xs' above.  */
+  xs[0] = 0x1234;
+  xs[1] = 0x5678;
+  xs[2] = 0x9012;
+  xsp = seed48 (xs);
+  if (xsp[0] != 0x62f2 || xsp[1] != 0xf474 || xsp[2] != 0x9e88)
+    {
+      puts ("seed48() did not install the values correctly");
+      printf ("  expected: { %04hx, %04hx, %04hx }\n", 0x62f2, 0xf474, 0x9e88);
+      printf ("  seen:     { %04hx, %04hx, %04hx }\n", xsp[0], xsp[1], xsp[2]);
+      result = 1;
+    }
+
+  /* Test lrand48 and mrand48.  We continue from the seed established
+     above.  */
+  l = lrand48 ();
+  if (l != 0x017e48b5l)
+    {
+      printf ("lrand48() in line %d failed: expected %lx, seen %lx\n",
+	      __LINE__ - 4, 0x017e48b5l, l);
+      result = 1;
+    }
+
+  l = mrand48 ();
+  if (l != 0xeb7a1fa3l)
+    {
+      printf ("mrand48() in line %d failed: expected %lx, seen %lx\n",
+	      __LINE__ - 4, 0xeb7a1fa3l, l);
+      result = 1;
+    }
+
+  l = lrand48 ();
+  if (l != 0x6b6a3f95l)
+    {
+      printf ("lrand48() in line %d failed: expected %lx, seen %lx\n",
+	      __LINE__ - 4, 0x6b6a3f95l, l);
+      result = 1;
+    }
+
+  l = mrand48 ();
+  if (l != 0x175c0d6fl)
+    {
+      printf ("mrand48() in line %d failed: expected %lx, seen %lx\n",
+	      __LINE__ - 4, 0x175c0d6fl, l);
+      result = 1;
+    }
+
+  /* Test lcong48.  */
+  lxs[0] = 0x4567;
+  lxs[1] = 0x6789;
+  lxs[2] = 0x8901;
+  lxs[3] = 0x0123;
+  lxs[4] = 0x2345;
+  lxs[5] = 0x1111;
+  lxs[6] = 0x2222;
+  lcong48 (lxs);
+
+  /* See whether the correct values are installed.  */
+  l = lrand48 ();
+  if (l != 0x6df63d66l)
+    {
+      printf ("lrand48() in line %d failed: expected %lx, seen %lx\n",
+	      __LINE__ - 4, 0x6df63d66l, l);
+      result = 1;
+    }
+
+  l = mrand48 ();
+  if (l != 0x2f92c8e1l)
+    {
+      printf ("mrand48() in line %d failed: expected %lx, seen %lx\n",
+	      __LINE__ - 4, 0x2f92c8e1l, l);
+      result = 1;
+    }
+
+  l = lrand48 ();
+  if (l != 0x3b4869ffl)
+    {
+      printf ("lrand48() in line %d failed: expected %lx, seen %lx\n",
+	      __LINE__ - 4, 0x3b4869ffl, l);
+      result = 1;
+    }
+
+  l = mrand48 ();
+  if (l != 0x5cd4cc3el)
+    {
+      printf ("mrand48() in line %d failed: expected %lx, seen %lx\n",
+	      __LINE__ - 4, 0x5cd4cc3el, l);
+      result = 1;
+    }
+
+  /* Check whether srand48() restores the A and C parameters.  */
+  srand48 (0x98765432);
+
+  /* See whether the correct values are installed.  */
+  l = lrand48 ();
+  if (l != 0x2fed1413l)
+    {
+      printf ("lrand48() in line %d failed: expected %lx, seen %lx\n",
+	      __LINE__ - 4, 0x2fed1413l, l);
+      result = 1;
+    }
+
+  l = mrand48 ();
+  if (l != 0xa28c1003l)
+    {
+      printf ("mrand48() in line %d failed: expected %lx, seen %lx\n",
+	      __LINE__ - 4, 0xa28c1003l, l);
+      result = 1;
+    }
+
+  l = lrand48 ();
+  if (l != 0x585fcfb7l)
+    {
+      printf ("lrand48() in line %d failed: expected %lx, seen %lx\n",
+	      __LINE__ - 4, 0x585fcfb7l, l);
+      result = 1;
+    }
+
+  l = mrand48 ();
+  if (l != 0x9e88f474l)
+    {
+      printf ("mrand48() in line %d failed: expected %lx, seen %lx\n",
+	      __LINE__ - 4, 0x9e88f474l, l);
+      result = 1;
+    }
+
+  /* And again to see whether seed48() does the same.  */
+  lcong48 (lxs);
+
+  /* See whether lxs wasn't modified.  */
+  l = lrand48 ();
+  if (l != 0x6df63d66l)
+    {
+      printf ("lrand48() in line %d failed: expected %lx, seen %lx\n",
+	      __LINE__ - 4, 0x6df63d66l, l);
+      result = 1;
+    }
+
+  /* Test seed48.  The previous call should have install the values in
+     the initialization of `xs' above.  */
+  xs[0] = 0x1234;
+  xs[1] = 0x5678;
+  xs[2] = 0x9012;
+  xsp = seed48 (xs);
+  if (xsp[0] != 0x0637 || xsp[1] != 0x7acd || xsp[2] != 0xdbec)
+    {
+      puts ("seed48() did not install the values correctly");
+      printf ("  expected: { %04hx, %04hx, %04hx }\n", 0x0637, 0x7acd, 0xdbec);
+      printf ("  seen:     { %04hx, %04hx, %04hx }\n", xsp[0], xsp[1], xsp[2]);
+      result = 1;
+    }
+
+  /* Test lrand48 and mrand48.  We continue from the seed established
+     above.  */
+  l = lrand48 ();
+  if (l != 0x017e48b5l)
+    {
+      printf ("lrand48() in line %d failed: expected %lx, seen %lx\n",
+	      __LINE__ - 4, 0x017e48b5l, l);
+      result = 1;
+    }
+
+  l = mrand48 ();
+  if (l != 0xeb7a1fa3l)
+    {
+      printf ("mrand48() in line %d failed: expected %lx, seen %lx\n",
+	      __LINE__ - 4, 0xeb7a1fa3l, l);
+      result = 1;
+    }
+
+  l = lrand48 ();
+  if (l != 0x6b6a3f95l)
+    {
+      printf ("lrand48() in line %d failed: expected %lx, seen %lx\n",
+	      __LINE__ - 4, 0x6b6a3f95l, l);
+      result = 1;
+    }
+
+  l = mrand48 ();
+  if (l != 0x175c0d6fl)
+    {
+      printf ("mrand48() in line %d failed: expected %lx, seen %lx\n",
+	      __LINE__ - 4, 0x175c0d6fl, l);
+      result = 1;
+    }
+
+  /* Test drand48.  */
+  d = drand48 ();
+  if (d != 0.0908832261858485424)
+    {
+      printf ("drand48() in line %d failed: expected %.*g, seen %.*g\n",
+	      __LINE__ - 4, DECIMAL_DIG, 0.0908832261858485424,
+	      DECIMAL_DIG, d);
+      result = 1;
+    }
+
+  d = drand48 ();
+  if (d != 0.943149381730059133133)
+    {
+      printf ("drand48() in line %d failed: expected %.*g, seen %.*g\n",
+	      __LINE__ - 4, DECIMAL_DIG, 0.943149381730059133133,
+	      DECIMAL_DIG, d);
+      result = 1;
+    }
+
+  /* Now the functions which get the Xis passed.  */
+  xs[0] = 0x3849;
+  xs[1] = 0x5061;
+  xs[2] = 0x7283;
+
+  l = nrand48 (xs);
+  if (l != 0x1efe61a1l)
+    {
+      printf ("nrand48() in line %d failed: expected %lx, seen %lx\n",
+	      __LINE__ - 4, 0x1efe61a1l, l);
+      result = 1;
+    }
+
+  l = jrand48 (xs);
+  if (l != 0xf568c7a0l)
+    {
+      printf ("jrand48() in line %d failed: expected %lx, seen %lx\n",
+	      __LINE__ - 4, 0xf568c7a0l, l);
+      result = 1;
+    }
+
+  l = nrand48 (xs);
+  if (l != 0x2a5e57fel)
+    {
+      printf ("nrand48() in line %d failed: expected %lx, seen %lx\n",
+	      __LINE__ - 4, 0x2a5e57fel, l);
+      result = 1;
+    }
+
+  l = jrand48 (xs);
+  if (l != 0x71a779a8l)
+    {
+      printf ("jrand48() in line %d failed: expected %lx, seen %lx\n",
+	      __LINE__ - 4, 0x71a779a8l, l);
+      result = 1;
+    }
+
+  /* Test whether the global A and C are used.  */
+  lcong48 (lxs);
+
+  l = nrand48 (xs);
+  if (l != 0x32beee9fl)
+    {
+      printf ("nrand48() in line %d failed: expected %lx, seen %lx\n",
+	      __LINE__ - 4, 0x32beee9fl, l);
+      result = 1;
+    }
+
+  l = jrand48 (xs);
+  if (l != 0x7bddf3bal)
+    {
+      printf ("jrand48() in line %d failed: expected %lx, seen %lx\n",
+	      __LINE__ - 4, 0x7bddf3bal, l);
+      result = 1;
+    }
+
+  l = nrand48 (xs);
+  if (l != 0x85bdf28l)
+    {
+      printf ("nrand48() in line %d failed: expected %lx, seen %lx\n",
+	      __LINE__ - 4, 0x85bdf28l, l);
+      result = 1;
+    }
+
+  l = jrand48 (xs);
+  if (l != 0x7b433e47l)
+    {
+      printf ("jrand48() in line %d failed: expected %lx, seen %lx\n",
+	      __LINE__ - 4, 0x7b433e47l, l);
+      result = 1;
+    }
+
+  /* Test erand48.  Also compare with the drand48 results.  */
+  (void) seed48 (xs);
+
+  d = drand48 ();
+  e = erand48 (xs);
+  if (d != e)
+    {
+      printf ("\
+drand48() and erand48 in lines %d and %d produce different results\n",
+	      __LINE__ - 6, __LINE__ - 5);
+      printf ("  drand48() = %g, erand48() = %g\n", d, e);
+      result = 1;
+    }
+  else if (e != 0.640650904452755298735)
+    {
+      printf ("erand48() in line %d failed: expected %.*g, seen %.*g\n",
+	      __LINE__ - 4, DECIMAL_DIG, 0.640650904452755298735,
+	      DECIMAL_DIG, e);
+      result = 1;
+
+    }
+
+  d = drand48 ();
+  e = erand48 (xs);
+  if (d != e)
+    {
+      printf ("\
+drand48() and erand48 in lines %d and %d produce different results\n",
+	      __LINE__ - 6, __LINE__ - 5);
+      printf ("  drand48() = %g, erand48() = %g\n", d, e);
+      result = 1;
+    }
+  else if (e != 0.115372323508150742555)
+    {
+      printf ("erand48() in line %d failed: expected %.*g, seen %.*g\n",
+	      __LINE__ - 4, DECIMAL_DIG, 0.0115372323508150742555,
+	      DECIMAL_DIG, e);
+      result = 1;
+
+    }
+
+  return result;
+}