From df152cc80e60dc8bf7167a62ee26cb19a9a675d3 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Sat, 20 Jan 2001 04:33:16 +0000 Subject: [PATCH] Update. * stdlib/jrand48_r.c (__jrand48_r): Correct constructing of results. Reported by Jeff Higham . * stdlib/tst-rand48.c: New file. * stdlib/Makefile (tests): Add tst-rand48. --- ChangeLog | 5 + localedata/ChangeLog | 5 + localedata/Makefile | 4 +- localedata/tst-langinfo.sh | 47 +++++- stdlib/Makefile | 5 +- stdlib/jrand48_r.c | 9 +- stdlib/tst-rand48.c | 390 +++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 454 insertions(+), 11 deletions(-) create mode 100644 stdlib/tst-rand48.c diff --git a/ChangeLog b/ChangeLog index 7089a2b..ae16f97 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 2001-01-19 Ulrich Drepper + * stdlib/jrand48_r.c (__jrand48_r): Correct constructing of + results. Reported by Jeff Higham . + * 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 a643772..b42520b 100644 --- a/localedata/ChangeLog +++ b/localedata/ChangeLog @@ -1,3 +1,8 @@ +2001-01-19 Ulrich Drepper + + * Makefile (LOCALES): Add fr_FR.ISO-8859-1. + * tst-langinfo.sh: Add French tests. + 2001-01-08 Jakub Jelinek * locales/cs_CZ: Fix grammar of comment above abmon. diff --git a/localedata/Makefile b/localedata/Makefile index dc8b323..235c7b9 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 3a46201..86d514e 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 a20a307..f93dc22 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 95f3ec6..48def5e 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 , 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 0000000..fd2c4c1 --- /dev/null +++ b/stdlib/tst-rand48.c @@ -0,0 +1,390 @@ +#include +#include +#include +#include + +#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; +} -- 2.7.4