Переглянути джерело

LibC: Add `drand48`, `srand48`

These functions are required for the `perl5` port's random function to
operate correctly. As a bonus, this allows us to remove a nasty patch
that replaces `drand48` with `random`.
Beckett Normington 1 рік тому
батько
коміт
8bc1f1b63e
2 змінених файлів з 20 додано та 0 видалено
  1. 18 0
      Userland/Libraries/LibC/stdlib.cpp
  2. 2 0
      Userland/Libraries/LibC/stdlib.h

+ 18 - 0
Userland/Libraries/LibC/stdlib.cpp

@@ -657,6 +657,7 @@ int ptsname_r(int fd, char* buffer, size_t size)
 }
 
 static unsigned long s_next_rand = 1;
+static long s_next_rand48 = 0;
 
 // https://pubs.opengroup.org/onlinepubs/9699919799/functions/rand.html
 int rand()
@@ -671,6 +672,23 @@ void srand(unsigned seed)
     s_next_rand = seed;
 }
 
+// https://pubs.opengroup.org/onlinepubs/9699919799/functions/drand48.html
+double drand48()
+{
+    constexpr u64 a = 0x5DEECE66DULL;
+    constexpr u64 c = 0xBULL;
+    constexpr u64 m = 1ULL << 48;
+
+    s_next_rand48 = (a * s_next_rand48 + c) & (m - 1);
+    return static_cast<double>(s_next_rand48) / m;
+}
+
+// https://pubs.opengroup.org/onlinepubs/9699919799/functions/srand48.html
+void srand48(long seed)
+{
+    s_next_rand48 = (seed & 0xFFFFFFFF) << 16 | 0x330E;
+}
+
 // https://pubs.opengroup.org/onlinepubs/9699919799/functions/abs.html
 int abs(int i)
 {

+ 2 - 0
Userland/Libraries/LibC/stdlib.h

@@ -78,6 +78,8 @@ __attribute__((noreturn)) void _Exit(int status);
 #define RAND_MAX 32767
 int rand(void);
 void srand(unsigned seed);
+double drand48(void);
+void srand48(long seed);
 
 long int random(void);
 void srandom(unsigned seed);