From 3c0f910906e4d5ccb4c319b875f93cf69768f6d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADtor=20Santos=20Costa?= <vsc@dcc.fc.up.pt> Date: Wed, 28 May 2014 01:12:51 +0100 Subject: [PATCH] more random --- C/sysbits.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/C/sysbits.c b/C/sysbits.c index 917f5bd5f..2f50f1d5d 100755 --- a/C/sysbits.c +++ b/C/sysbits.c @@ -1110,6 +1110,47 @@ Yap_random (void) #endif } +#if HAVE_RANDOM +static Int +p_init_random_state ( USES_REGS1 ) +{ + register Term t0 = Deref (ARG1); + char *old, * new = (char *) malloc(256); + + if (IsVarTerm (t0)) { + return(Yap_unify(ARG1,MkIntegerTerm((Int)current_seed))); + } + if(!IsNumTerm (t0)) + return (FALSE); + if (IsIntTerm (t0)) + current_seed = (unsigned int) IntOfTerm (t0); + else if (IsFloatTerm (t0)) + current_seed = (unsigned int) FloatOfTerm (t0); + else + current_seed = (unsigned int) LongIntOfTerm (t0); + old = initstate(random(), new, 256); + return Yap_unify(ARG2, MkIntegerTerm((Int)old)) && + Yap_unify(ARG3, MkIntegerTerm((Int)new)); +} + +static Int +p_set_random_state ( USES_REGS1 ) +{ + register Term t0 = Deref (ARG1); + char *old, * new = (char *) malloc(256); + + if (IsVarTerm (t0)) { + return FALSE; + } + if (IsIntegerTerm (t0)) + new = (char *) IntegerOfTerm (t0); + else + return FALSE; + old = initstate(random(), new, 256); + return Yap_unify(ARG2, MkIntegerTerm((Int)old)); +} +#endif + static Int p_srandom ( USES_REGS1 ) { @@ -3010,6 +3051,10 @@ Yap_InitSysPreds(void) /* can only do after heap is initialised */ InitLastWtime(); Yap_InitCPred ("srandom", 1, p_srandom, SafePredFlag); +#if HAVE_RANDOM + Yap_InitCPred ("init_random_state", 3, p_init_random_state, SafePredFlag); + Yap_InitCPred ("set_random_state", 1, p_set_random_state, SafePredFlag); +#endif Yap_InitCPred ("sh", 0, p_sh, SafePredFlag|SyncPredFlag); Yap_InitCPred ("$shell", 1, p_shell, SafePredFlag|SyncPredFlag|UserCPredFlag); Yap_InitCPred ("system", 1, p_system, SafePredFlag|SyncPredFlag|UserCPredFlag);