YAP 7.1.0
random.c
1#include "Yap.h"
2#include "Yatom.h"
3#include "YapHeap.h"
4#include "yapio.h"
5#include <stdlib.h>
6#if HAVE_UNISTD_H
7#include <unistd.h>
8#endif
9#if HAVE_STDARG_H
10#include <stdarg.h>
11#endif
12#ifdef _WIN32
13#if HAVE_IO_H
14/* Windows */
15#include <io.h>
16#endif
17#if HAVE_SOCKET
18#include <winsock2.h>
19#endif
20#include <windows.h>
21#ifndef S_ISDIR
22#define S_ISDIR(x) (((x)&_S_IFDIR)==_S_IFDIR)
23#endif
24#endif
25#if HAVE_ERRNO_H
26#include <errno.h>
27#endif
28#if HAVE_FCNTL_H
29#include <fcntl.h>
30#endif
31#include "iopreds.h"
32
33#if HAVE_TIME_H
34#include <time.h>
35#endif
36
37unsigned int current_seed;
38
39extern int rand(void);
40
41
42double
43Yap_random (void)
44{
45#if HAVE_DRAND48
46 return drand48();
47#elif HAVE_RANDOM
48 /* extern long random (); */
49 return (((double) random ()) / 0x7fffffffL /* 2**31-1 */);
50#elif HAVE_RAND
51 return (((double) (rand ()) / RAND_MAX));
52#else
53 Yap_Error(SYSTEM_ERROR_INTERNAL, TermNil,
54 "random not available in this configuration");
55 return (0.0);
56#endif
57}
58
59#if HAVE_RANDOM
60static Int
61p_init_random_state ( USES_REGS1 )
62{
63 register Term t0 = Deref (ARG1);
64 char *old, *new;
65
66 if (IsVarTerm (t0)) {
67 return(Yap_unify(ARG1,MkIntegerTerm((Int)current_seed)));
68 }
69 if(!IsNumTerm (t0))
70 return (FALSE);
71 if (IsIntTerm (t0))
72 current_seed = (unsigned int) IntOfTerm (t0);
73 else if (IsFloatTerm (t0))
74 current_seed = (unsigned int) FloatOfTerm (t0);
75 else
76 current_seed = (unsigned int) LongIntOfTerm (t0);
77
78 new = (char *) malloc(256);
79 old = initstate(random(), new, 256);
80 return Yap_unify(ARG2, MkIntegerTerm((Int)old)) &&
81 Yap_unify(ARG3, MkIntegerTerm((Int)new));
82}
83
84static Int
85p_set_random_state ( USES_REGS1 )
86{
87 register Term t0 = Deref (ARG1);
88 char *old, * new;
89
90 if (IsVarTerm (t0)) {
91 return FALSE;
92 }
93 if (IsIntegerTerm (t0))
94 new = (char *) IntegerOfTerm (t0);
95 else
96 return FALSE;
97 old = setstate( new );
98 return Yap_unify(ARG2, MkIntegerTerm((Int)old));
99}
100
101static Int
102p_release_random_state ( USES_REGS1 )
103{
104 register Term t0 = Deref (ARG1);
105 char *old;
106
107 if (IsVarTerm (t0)) {
108 return FALSE;
109 }
110 if (IsIntegerTerm (t0))
111 old = (char *) IntegerOfTerm (t0);
112 else
113 return FALSE;
114 free( old );
115 return TRUE;
116}
117#endif
118
119static Int
120Srandom ( USES_REGS1 )
121{
122 register Term t0 = Deref (ARG1);
123 if (IsVarTerm (t0)) {
124 return(Yap_unify(ARG1,MkIntegerTerm((Int)current_seed)));
125 }
126 if(!IsNumTerm (t0))
127 return (FALSE);
128 if (IsIntTerm (t0))
129 current_seed = (unsigned int) IntOfTerm (t0);
130 else if (IsFloatTerm (t0))
131 current_seed = (unsigned int) FloatOfTerm (t0);
132 else
133 current_seed = (unsigned int) LongIntOfTerm (t0);
134#if HAVE_SRAND48
135 srand48(current_seed);
136#elif HAVE_SRANDOM
137 srandom(current_seed);
138#elif HAVE_SRAND
139 srand(current_seed);
140
141#endif
142 return (TRUE);
143}
144
151void
152Yap_InitRandom (void)
153{
154 current_seed = (unsigned int) time (NULL);
155#if HAVE_SRAND48
156 srand48 (current_seed);
157#elif HAVE_SRANDOM
158 srandom (current_seed);
159#elif HAVE_SRAND
160 srand (current_seed);
161#endif
162}
163
164void
165Yap_InitRandomPreds (void)
166{
167 Yap_InitCPred ("srandom", 1, Srandom, SafePredFlag);
168#if HAVE_RANDOM
169 Yap_InitCPred ("init_random_state", 3, p_init_random_state, SafePredFlag);
170 Yap_InitCPred ("set_random_state", 2, p_set_random_state, SafePredFlag);
171 Yap_InitCPred ("release_random_state", 1, p_release_random_state, SafePredFlag);
172#endif
173}
Main definitions.