0718 nwnss: provide stdlib random wrappers
All checks were successful
Source release / source-package (push) Successful in 1m41s

This commit is contained in:
Mario Fetka
2026-06-17 13:48:05 +00:00
parent 9ef80e8667
commit 91dc415675
3 changed files with 102 additions and 2 deletions

View File

@@ -116,7 +116,7 @@ still stay original and remain listed, because later imports may rely on them.
| AUDITED | `src/nwnss/library/bit.c` | PORT | nwnss.bit, nwnss.bitmap | No original provider found beyond bit.h/libNSS.imp; native-NINT semantics fixed/tested in 0698. |
| AUDITED | `src/nwnss/library/que.c` + `src/nwnss/sharedsrc/que.c.h` + `include/nwnss/library/que.h` | ORIG wrapper + ORIG+FIX sharedsrc/header | nwnss.que | Wrapper matches Novell sharedsrc pattern; header and sharedsrc compared with original. Abweichungen sind Include-Pfad-Fixes, legacy callback casts and whitespace/diff-check cleanup only; STK/SQ/CIR/DQ/SET semantics tested in 0706. |
| AUDITED | `src/nwnss/library/qdiv.c` | ORIG+FIX | nwnss.qdiv | Compared with original `public_core/library/qdiv.c`; Knuth/Berkeley quad division implementation kept, with signed helper prototypes adjusted from `QUAD` to `SQUAD` because Mars `QUAD` is unsigned. Unsigned, signed, null-remainder and fuzz cases tested in 0707. |
| AUDITED | `src/nwnss/library/misc/rand.c` | PORT | nwnss.rand, nwnss.namespace | No original provider found beyond rand.h/libNSS.imp/callers; seed-deterministic PRNG port checked in 0700/0701; libsodium only initializes default state before explicit seeding. |
| AUDITED | `src/nwnss/library/misc/rand.c` | PORT | nwnss.rand, nwnss.namespace | No original provider found beyond rand.h/libNSS.imp/callers; seed-deterministic PRNG port checked in 0700/0701/0718; also provides xStdlib.h rand/random/srand/srandom/initstate/setstate wrappers; libsodium only initializes default state before explicit seeding. |
| AUDITED | `src/nwnss/library/misc/rbpTree.c` | PORT | nwnss.rbpTree | No original provider found beyond rbpTree.h/libNSS.imp/callers; CLRS-style algorithmic port checked against header contract in 0703 and strengthened in 0705 with explicit red/black, parent-link, binary-search-order, black-height, and Coin3D-style insertion/deletion stress coverage. Coin3D rbptree.cpp was checked only as an external BSD-licensed CLRS comparison and was not imported. |
| TODO | `src/nwnss/library/os/currentTime.c` | PORT | nwnss.utc | Userspace time port; full audit open. |
| AUDITED | `src/nwnss/library/os/delay.c` | ORIG+FIX/PORT | nwnss.schedule, nwnss.snooze | Scheduler functions kept as functions, not macros; checked in 0688-0690. |
@@ -616,7 +616,7 @@ even if it already compiles or has indirect test coverage.
| TODO | ORIG+FIX? | not yet classified | `src/nwnss/library/misc/histogram.c` | Must be compared against original source and classified. |
| TODO | ORIG+FIX? | not yet classified | `src/nwnss/library/misc/lbVolume.c` | Must be compared against original source and classified. |
| TODO | ORIG+FIX? | not yet classified | `src/nwnss/library/misc/nssErrorTable.c` | Must be compared against original source and classified. |
| AUDITED | PORT | nwnss.rand, nwnss.namespace | `src/nwnss/library/misc/rand.c` | No original provider found beyond rand.h/libNSS.imp/callers; seed-deterministic PRNG port checked in 0700/0701; libsodium only initializes default state before explicit seeding. |
| AUDITED | PORT | nwnss.rand, nwnss.namespace | `src/nwnss/library/misc/rand.c` | No original provider found beyond rand.h/libNSS.imp/callers; seed-deterministic PRNG port checked in 0700/0701/0718; also provides xStdlib.h rand/random/srand/srandom/initstate/setstate wrappers; libsodium only initializes default state before explicit seeding. |
| AUDITED | PORT | nwnss.rbpTree | `src/nwnss/library/misc/rbpTree.c` | No original provider found beyond rbpTree.h/libNSS.imp/callers; CLRS-style algorithmic port checked against header contract in 0703 and strengthened in 0705 with explicit red/black, parent-link, binary-search-order, black-height, and Coin3D-style insertion/deletion stress coverage. Coin3D rbptree.cpp was checked only as an external BSD-licensed CLRS comparison and was not imported. |
| TODO | ORIG+FIX? | not yet classified | `src/nwnss/library/misc/register.c` | Must be compared against original source and classified. |
| TODO | ORIG+FIX? | not yet classified | `src/nwnss/library/misc/sysimp.c` | Must be compared against original source and classified. |

View File

@@ -90,6 +90,54 @@ QUAD rndLong(void)
return (QUAD)randQuad();
}
int LB_rand(void)
{
return (int)(randQuad() & 0x7fffU);
}
void LB_srand(unsigned int seed)
{
srandQuad((QUAD)seed);
}
long LB_random(void)
{
return (long)(randQuad() & 0x7fffffffUL);
}
void LB_srandom(unsigned int seed)
{
srandQuad((QUAD)seed);
}
char *LB_setstate(char *arg_state)
{
QUAD seed = 0;
unsigned i;
if (arg_state == 0)
return 0;
for (i = 0; i < sizeof(seed); ++i)
seed |= ((QUAD)(unsigned char)arg_state[i]) << (i * 8);
srandQuad(seed);
return arg_state;
}
char *LB_initstate(unsigned int seed, char *arg_state, int n)
{
unsigned i;
if (arg_state == 0 || n < (int)sizeof(QUAD))
return 0;
for (i = 0; i < sizeof(QUAD); ++i)
arg_state[i] = (char)(((QUAD)seed >> (i * 8)) & 0xffU);
LB_srandom(seed);
return arg_state;
}
double chiSquareQuad(
unsigned numTests,

View File

@@ -1,4 +1,5 @@
#include <rand.h>
#include <library/xStdlib.h>
#include <stdio.h>
@@ -116,12 +117,63 @@ static int check_chi_square(void)
return 0;
}
static int check_stdlib_rand_wrappers(void)
{
int rand_a[3];
int rand_b[3];
long random_a[3];
long random_b[3];
char state[8];
int i;
LB_srand(1234U);
for (i = 0; i < 3; ++i) {
rand_a[i] = LB_rand();
CHECK(rand_a[i] >= 0);
CHECK(rand_a[i] <= 0x7fff);
}
LB_srand(1234U);
for (i = 0; i < 3; ++i)
rand_b[i] = LB_rand();
for (i = 0; i < 3; ++i)
CHECK(rand_a[i] == rand_b[i]);
CHECK(rand_a[0] != rand_a[1]);
LB_srandom(0x9876U);
for (i = 0; i < 3; ++i) {
random_a[i] = LB_random();
CHECK(random_a[i] >= 0);
CHECK(random_a[i] <= 0x7fffffffL);
}
LB_srandom(0x9876U);
for (i = 0; i < 3; ++i)
random_b[i] = LB_random();
for (i = 0; i < 3; ++i)
CHECK(random_a[i] == random_b[i]);
CHECK(LB_initstate(0x55aaU, state, (int)sizeof(state)) == state);
rand_a[0] = LB_rand();
CHECK(LB_setstate(state) == state);
CHECK(LB_rand() == rand_a[0]);
CHECK(LB_initstate(1U, 0, (int)sizeof(state)) == 0);
CHECK(LB_initstate(1U, state, 0) == 0);
CHECK(LB_setstate(0) == 0);
return 0;
}
int main(void)
{
CHECK(check_repeatable_quad_seed() == 0);
CHECK(check_repeatable_rnd_quad_seed() == 0);
CHECK(check_repeatable_long_seed() == 0);
CHECK(check_chi_square() == 0);
CHECK(check_stdlib_rand_wrappers() == 0);
return 0;
}