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);