/************************************************************************* * * * 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 #if defined(__MINGW32__) || _MSC_VER #include #endif void 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