aboutsummaryrefslogtreecommitdiff
path: root/stdlib
diff options
context:
space:
mode:
Diffstat (limited to 'stdlib')
-rw-r--r--stdlib/Makefile10
-rw-r--r--stdlib/a64l.c54
-rw-r--r--stdlib/drand48-iter.c102
-rw-r--r--stdlib/drand48.c33
-rw-r--r--stdlib/drand48_r.c37
-rw-r--r--stdlib/erand48.c34
-rw-r--r--stdlib/erand48_r.c52
-rw-r--r--stdlib/jrand48.c34
-rw-r--r--stdlib/jrand48_r.c49
-rw-r--r--stdlib/l64a.c51
-rw-r--r--stdlib/lcong48.c30
-rw-r--r--stdlib/lcong48_r.c41
-rw-r--r--stdlib/lrand48.c33
-rw-r--r--stdlib/lrand48_r.c32
-rw-r--r--stdlib/mrand48.c33
-rw-r--r--stdlib/mrand48_r.c32
-rw-r--r--stdlib/nrand48.c34
-rw-r--r--stdlib/nrand48_r.c46
-rw-r--r--stdlib/random.c187
-rw-r--r--stdlib/random_r.c337
-rw-r--r--stdlib/seed48.c32
-rw-r--r--stdlib/seed48_r.c41
-rw-r--r--stdlib/srand48.c30
-rw-r--r--stdlib/srand48_r.c52
-rw-r--r--stdlib/stdlib.h109
25 files changed, 1371 insertions, 154 deletions
diff --git a/stdlib/Makefile b/stdlib/Makefile
index 3ea206f623..a28d2a8127 100644
--- a/stdlib/Makefile
+++ b/stdlib/Makefile
@@ -32,10 +32,16 @@ routines := \
abs labs \
div ldiv \
mblen mbstowcs mbtowc wcstombs wctomb \
- random rand \
+ random random_r rand \
+ drand48 erand48 lrand48 nrand48 mrand48 jrand48 \
+ srand48 seed48 lcong48 \
+ drand48_r erand48_r lrand48_r nrand48_r mrand48_r jrand48_r \
+ srand48_r seed48_r lcong48_r \
+ drand48-iter \
strtol strtoul strtoq strtouq \
strtof strtod strtold \
- system
+ system \
+ a64l l64a
distribute := exit.h grouping.h
tests := tst-strtol tst-strtod testmb testrand testsort testdiv
diff --git a/stdlib/a64l.c b/stdlib/a64l.c
new file mode 100644
index 0000000000..3fdaab513b
--- /dev/null
+++ b/stdlib/a64l.c
@@ -0,0 +1,54 @@
+/* Copyright (C) 1995 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
+
+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 <stdlib.h>
+
+long
+a64l (string)
+ const char *string;
+{
+ int cnt;
+ long result = 0l;
+
+ for (cnt = 0; cnt < 6; ++cnt)
+ {
+ result <<= 6;
+ switch (string[cnt])
+ {
+ case '.':
+ break;
+ case '/':
+ result |= 1;
+ break;
+ case '0' ... '9':
+ result |= 2 + string[cnt] - '0';
+ break;
+ case 'A' ... 'Z':
+ result |= 12 + string[cnt] - 'A';
+ break;
+ case 'a' ... 'z':
+ result |= 38 + string[cnt] - 'a';
+ break;
+ default:
+ return result >> 6;
+ }
+ }
+
+ return result;
+}
diff --git a/stdlib/drand48-iter.c b/stdlib/drand48-iter.c
new file mode 100644
index 0000000000..013dbe792f
--- /dev/null
+++ b/stdlib/drand48-iter.c
@@ -0,0 +1,102 @@
+/* Copyright (C) 1995 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
+
+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 <errno.h>
+#include <stdlib.h>
+
+
+/* Global state for non-reentrent functions. */
+struct drand48_data __libc_drand48_data;
+
+
+int
+__drand48_iterate (xsubi, buffer)
+ unsigned short int xsubi[3];
+ struct drand48_data *buffer;
+{
+ /* Be generous for the arguments, detect some errors. */
+ if (xsubi == NULL || buffer == NULL)
+ {
+ errno = EFAULT;
+ return -1;
+ }
+
+ /* Initialize buffer, if not yet done. */
+ if (!buffer->init)
+ {
+ if (sizeof (unsigned short int) == 2)
+ {
+ buffer->a[2] = 0x5;
+ buffer->a[1] = 0xdeec;
+ buffer->a[0] = 0xe66d;
+ }
+ else
+ {
+ buffer->a[2] = 0x5deec;
+ buffer->a[1] = 0xe66d0000;
+ buffer->a[0] = 0;
+ }
+ buffer->c = 0xb;
+ buffer->init = 1;
+ }
+
+ /* Do the real work. We choose a data type which contains at least
+ 48 bits. Because we compute the modulus it does not care how
+ many bits really are computed. */
+
+ if (sizeof (long int) >= 6)
+ {
+ /* The `long' data type is sufficent. */
+ unsigned long int X, a, result;
+
+#define ONE_STEP \
+ if (sizeof (unsigned short int) == 2) \
+ { \
+ X = (xsubi[2] << 16 | xsubi[1]) << 16 | xsubi[0]; \
+ a = (buffer->a[2] << 16 | buffer->a[1]) << 16 | buffer->a[0]; \
+ \
+ result = X * a + buffer->c; \
+ \
+ xsubi[0] = result & 0xffff; \
+ result >>= 16; \
+ xsubi[1] = result & 0xffff; \
+ result >>= 16; \
+ xsubi[2] = result & 0xffff; \
+ } \
+ else \
+ { \
+ X = xsubi[2] << 16 | xsubi[1] >> 16; \
+ a = buffer->a[2] << 16 | buffer->a[1] >> 16; \
+ \
+ result = X * a + buffer->c; \
+ \
+ xsubi[0] = result >> 16 & 0xffffffffl; \
+ xsubi[1] = result << 16 & 0xffff0000l; \
+ }
+ ONE_STEP;
+ }
+ else
+ {
+ /* We have to use the `long long' data type. */
+ unsigned long long int X, a, result;
+ ONE_STEP;
+ }
+
+ return 0;
+}
diff --git a/stdlib/drand48.c b/stdlib/drand48.c
new file mode 100644
index 0000000000..e2d8450044
--- /dev/null
+++ b/stdlib/drand48.c
@@ -0,0 +1,33 @@
+/* Copyright (C) 1995 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
+
+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 <stdlib.h>
+
+/* Global state for non-reentrent functions. Defined in drand48-iter.c. */
+extern struct drand48_data __libc_drand48_data;
+
+double
+drand48 ()
+{
+ double result;
+
+ (void) erand48_r (__libc_drand48_data.X, &__libc_drand48_data, &result);
+
+ return result;
+}
diff --git a/stdlib/drand48_r.c b/stdlib/drand48_r.c
new file mode 100644
index 0000000000..eaba057fa1
--- /dev/null
+++ b/stdlib/drand48_r.c
@@ -0,0 +1,37 @@
+/* Copyright (C) 1995 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
+
+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 <errno.h>
+#include <math.h>
+#include <stdlib.h>
+
+int
+drand48_r (buffer, result)
+ struct drand48_data *buffer;
+ double *result;
+{
+ /* be generous for the arguments, detect some errors. */
+ if (buffer == NULL)
+ {
+ errno = EFAULT;
+ return -1;
+ }
+
+ return erand48_r (buffer->X, buffer, result);
+}
diff --git a/stdlib/erand48.c b/stdlib/erand48.c
new file mode 100644
index 0000000000..b63c3bddea
--- /dev/null
+++ b/stdlib/erand48.c
@@ -0,0 +1,34 @@
+/* Copyright (C) 1995 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
+
+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 <stdlib.h>
+
+/* Global state for non-reentrent functions. Defined in drand48-iter.c. */
+extern struct drand48_data __libc_drand48_data;
+
+double
+erand48 (xsubi)
+ unsigned short int xsubi[3];
+{
+ double result;
+
+ (void) erand48_r (xsubi, &__libc_drand48_data, &result);
+
+ return result;
+}
diff --git a/stdlib/erand48_r.c b/stdlib/erand48_r.c
new file mode 100644
index 0000000000..86d2f734d9
--- /dev/null
+++ b/stdlib/erand48_r.c
@@ -0,0 +1,52 @@
+/* Copyright (C) 1995 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
+
+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 <errno.h>
+#include <math.h>
+#include <stdlib.h>
+
+int
+erand48_r (xsubi, buffer, result)
+ unsigned short int xsubi[3];
+ struct drand48_data *buffer;
+ double *result;
+{
+ int i;
+
+ /* Be generous for the arguments, detect some errors. */
+ if (result == NULL)
+ {
+ errno = EFAULT;
+ return -1;
+ }
+
+ /* Compute next state. */
+ if (__drand48_iterate (xsubi, buffer) < 0)
+ return -1;
+
+ *result = 0.0;
+ for (i = 4 / sizeof (unsigned short int); i >= 0; --i)
+ {
+ double factor = ldexp (1.0, (i - 6) * sizeof (unsigned short int));
+
+ *result += factor * (double) xsubi[i];
+ }
+
+ return 0;
+}
diff --git a/stdlib/jrand48.c b/stdlib/jrand48.c
new file mode 100644
index 0000000000..bdd62fb241
--- /dev/null
+++ b/stdlib/jrand48.c
@@ -0,0 +1,34 @@
+/* Copyright (C) 1995 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
+
+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 <stdlib.h>
+
+/* Global state for non-reentrent functions. Defined in drand48-iter.c. */
+extern struct drand48_data __libc_drand48_data;
+
+long
+jrand48 (xsubi)
+ unsigned short int xsubi[3];
+{
+ long result;
+
+ (void) jrand48_r (xsubi, &__libc_drand48_data, &result);
+
+ return result;
+}
diff --git a/stdlib/jrand48_r.c b/stdlib/jrand48_r.c
new file mode 100644
index 0000000000..b1a4378028
--- /dev/null
+++ b/stdlib/jrand48_r.c
@@ -0,0 +1,49 @@
+/* Copyright (C) 1995 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
+
+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 <stdlib.h>
+
+int
+jrand48_r (xsubi, buffer, result)
+ unsigned short int xsubi[3];
+ struct drand48_data *buffer;
+ long *result;
+{
+ /* Be generous for the arguments, detect some errors. */
+ if (result == NULL)
+ {
+ errno = EFAULT;
+ return -1;
+ }
+
+ /* Compute next state. */
+ if (__drand48_iterate (xsubi, buffer) < 0)
+ return -1;
+
+ /* Store the result. */
+ if (sizeof (unsigned short int) == 2)
+ *result = (xsubi[2] & 0x7fff) | xsubi[1];
+ else
+ *result = xsubi[2] & 0x7fffffffl;
+
+ if (xsubi[2] & (1 << (sizeof (xsubi[2]) * 8 - 1)))
+ *result *= -1;
+
+ return 0;
+}
diff --git a/stdlib/l64a.c b/stdlib/l64a.c
new file mode 100644
index 0000000000..ad19a3b6eb
--- /dev/null
+++ b/stdlib/l64a.c
@@ -0,0 +1,51 @@
+/* Copyright (C) 1995 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
+
+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 <stdlib.h>
+
+/* Conversion table. */
+static const char conv_tab[64] =
+{
+ '.', '/', '0', '1', '2', '3', '4', '5',
+ '6', '7', '8', '9', 'A', 'B', 'C', 'D',
+ 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L',
+ 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
+ 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b',
+ 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
+ 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r',
+ 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'
+};
+
+const char *
+l64a (n)
+ long n;
+{
+ static char result[7];
+ int cnt;
+
+ result[6] = '\0';
+
+ for (cnt = 5; cnt >= 0; --cnt)
+ {
+ result[cnt] = n & 0x3f;
+ n >>= 6;
+ }
+
+ return result;
+}
diff --git a/stdlib/lcong48.c b/stdlib/lcong48.c
new file mode 100644
index 0000000000..7e4d18806f
--- /dev/null
+++ b/stdlib/lcong48.c
@@ -0,0 +1,30 @@
+/* Copyright (C) 1995 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
+
+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 <stdlib.h>
+
+/* Global state for non-reentrent functions. Defined in drand48-iter.c. */
+extern struct drand48_data __libc_drand48_data;
+
+void
+lcong48 (param)
+ unsigned short int param[7];
+{
+ (void) lcong48_r (param, &__libc_drand48_data);
+}
diff --git a/stdlib/lcong48_r.c b/stdlib/lcong48_r.c
new file mode 100644
index 0000000000..cc38b4dc7c
--- /dev/null
+++ b/stdlib/lcong48_r.c
@@ -0,0 +1,41 @@
+/* Copyright (C) 1995 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+Contri