File: random.c

package info (click to toggle)
yap 5.1.1-3
  • links: PTS
  • area: main
  • in suites: lenny
  • size: 16,124 kB
  • ctags: 14,650
  • sloc: ansic: 122,796; perl: 22,545; sh: 3,768; java: 1,277; makefile: 1,191; xml: 739; tcl: 624; lisp: 142; awk: 9
file content (89 lines) | stat: -rw-r--r-- 1,947 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/*************************************************************************
*									 *
*	 YAP Prolog 							 *
*									 *
*	Yap Prolog was developed at NCCUP - Universidade do Porto	 *
*									 *
* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997	 *
*									 *
**************************************************************************
*									 *
* File:		random.c						 *
* Last rev:								 *
* mods:									 *
* comments:	regular expression interpreter                           *
*									 *
*************************************************************************/

#include "config.h"
#include "YapInterface.h"
#include <math.h>
#if defined(__MINGW32__) || _MSC_VER
#include <windows.h>
#endif

void PROTO(init_random, (void));

static short a1 = 27314, b1 = 9213, c1 = 17773;

static int
p_random(void)
{
  double fli;
  long int t1, t2, t3;

  t1 = (a1 * 171) % 30269;
  t2 = (b1 * 172) % 30307;
  t3 = (c1 * 170) % 30323;
  fli = (t1/30269.0) + (t2/30307.0) + (t3/30323.0);
  a1 = t1;
  b1 = t2;
  c1 = t3;
  return(YAP_Unify(YAP_ARG1, YAP_MkFloatTerm(fli-(int)(fli))));
}

static int
p_setrand(void)
{
  a1 = YAP_IntOfTerm(YAP_ARG1);
  b1 = YAP_IntOfTerm(YAP_ARG2);
  c1 = YAP_IntOfTerm(YAP_ARG3);
  return(TRUE);
}

static int
p_getrand(void)
{
  return(YAP_Unify(YAP_ARG1,YAP_MkIntTerm(a1)) &&
	 YAP_Unify(YAP_ARG2,YAP_MkIntTerm(b1)) &&
	 YAP_Unify(YAP_ARG3,YAP_MkIntTerm(c1)));
}

void
init_random(void)
{
  YAP_UserCPredicate("random", p_random, 1);
  YAP_UserCPredicate("setrand", p_setrand, 3);
  YAP_UserCPredicate("getrand", p_getrand, 3);
}

#ifdef _WIN32

int WINAPI PROTO(win_random, (HANDLE, DWORD, LPVOID));

int WINAPI win_random(HANDLE hinst, DWORD reason, LPVOID reserved)
{
  switch (reason) 
    {
    case DLL_PROCESS_ATTACH:
      break;
    case DLL_PROCESS_DETACH:
      break;
    case DLL_THREAD_ATTACH:
      break;
    case DLL_THREAD_DETACH:
      break;
    }
  return 1;
}
#endif