YAP 7.1.0
yap_random.c
1/*************************************************************************
2 * *
3 * YAP Prolog *
4 * *
5 * Yap Prolog was developed at NCCUP - Universidade do Porto *
6 * *
7 * Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 *
8 * *
9 **************************************************************************
10 * *
11 * File: random.c * Last rev:
12 ** mods: * comments: regular expression interpreter *
13 * *
14 *************************************************************************/
15
16#include "YapInterface.h"
17#include <math.h>
18#if defined(__MINGW32__) || _MSC_VER
19#include <windows.h>
20#endif
21
22X_API void init_random(void);
23
24static short a1 = 27314, b1 = 9213, c1 = 17773;
25
26static YAP_Bool p_random(void) {
27 double fli;
28 long int t1, t2, t3;
29
30 t1 = (a1 * 171) % 30269;
31 t2 = (b1 * 172) % 30307;
32 t3 = (c1 * 170) % 30323;
33 fli = (t1 / 30269.0) + (t2 / 30307.0) + (t3 / 30323.0);
34 a1 = t1;
35 b1 = t2;
36 c1 = t3;
37 return (YAP_Unify(YAP_ARG1, YAP_MkFloatTerm(fli - (int)(fli))));
38}
39
40static YAP_Bool p_setrand(void) {
41 a1 = YAP_IntOfTerm(YAP_ARG1);
42 b1 = YAP_IntOfTerm(YAP_ARG2);
43 c1 = YAP_IntOfTerm(YAP_ARG3);
44 return (TRUE);
45}
46
47static YAP_Bool p_getrand(void) {
48 return (YAP_Unify(YAP_ARG1, YAP_MkIntTerm(a1)) &&
49 YAP_Unify(YAP_ARG2, YAP_MkIntTerm(b1)) &&
50 YAP_Unify(YAP_ARG3, YAP_MkIntTerm(c1)));
51}
52
53X_API void init_random(void) {
54 YAP_UserCPredicate("random", p_random, 1);
55 YAP_UserCPredicate("setrand", p_setrand, 3);
56 YAP_UserCPredicate("getrand", p_getrand, 3);
57}
58
59#ifdef _WIN32
60
61int WINAPI win_random(HANDLE, DWORD, LPVOID);
62
63int WINAPI win_random(HANDLE hinst, DWORD reason, LPVOID reserved) {
64 switch (reason) {
65 case DLL_PROCESS_ATTACH:
66 break;
67 case DLL_PROCESS_DETACH:
68 break;
69 case DLL_THREAD_ATTACH:
70 break;
71 case DLL_THREAD_DETACH:
72 break;
73 }
74 return 1;
75}
76#endif