Smaller updates:

constant use of longjmp
conflict with python headers
win32 support
dll support
This commit is contained in:
Vitor Santos Costa 2017-02-20 15:28:46 +00:00
parent 55879dbd6c
commit 65ff3ed471
131 changed files with 8125 additions and 5154 deletions

203
#.gitignore# Normal file
View File

@ -0,0 +1,203 @@
*~
*.itf
*.po
*.qlf
*.xwam
*.wam
*.ma
*.s
*.o
*.so
*.dylib
*.dll
docs/yap.info*
.build
tags
TGSautom4te.cache
cscope.*
GPATH
m32
GRTAGS
GTAGS
tmtags*
.autotools
.Rhistory
.zedstate
config.h
Yap.h
YapConfig.h
YapTermConfig.h
.graffiti
.#*#
*/#*#
*bak
*rej
*.db
groups
*.ede
.??*
*ggtags*
.atom-build.josn
.autotools
.cproject
.dir-locals.el
.DS_store
.kateproject
.project
.pydevproject
.Rhistory
.zedstate
.graffiti
.kateproject
autom4te.cache
*rej
#*
#*#
config.h
*.html
packages/gecode/dev
JIT/HPP/bkp
cmake_install.cmake
cmake_clean.cmake
*.build
C/myabsmi.c
*.ctags#
*.hs
CMakeFiles
*.make
C/new_iop.c
*.pdf
*.log
*.orig
JIT/HPP/#JIT_In#
*.text
yap
*startup.yss
*cmake_files
C/pl-yap.c
GitSHA1.c
.vscode
CMakeLists.txt.*
FindPackageLog.txt
GitSHA1.c
clang
cmake-build-debug
os/YapIOConfig.h
CodeBlocks
os/readterm.c.cpp
os/readterm.c.cpp
packages/ProbLog/problog_examples/output/,_query_1_cluster_1.dot
packages/ProbLog/#problog_lbdd.yap#
packages/ProbLog/problog_examples/output/,_query_1_cluster_1.dot
packages/ProbLog/problog_examples/output/out.dat
packages/ProbLog/problog_examples/outputvalues.pl
packages/ProbLog/problogbdd
packages/raptor/raptor_config.h
packages/real/rconfig.h
packages/ProbLog/problog/#completion.yap#
packages/ProbLog/problog_examples/output
packages/ProbLog/problog_examples/queries
packages/swig/java/*.java
packages/swig/java/*.class
packages/swig/java/*.jar
packages/swig/java/*wrap*
*jnilib
*.jar
*LOG
packages/cplint/approx/simplecuddLPADs/LPADBDD
packages/swi-minisat2/˜:ilp
packages/swig/android/app
packages/cplint/L
packages/CLPBN/horus/hcli
tmp
Eclipse
packages/bdd/simplecudd/problogbdd
trace
packages/bdd/cudd_config.h
Makefile
build
Debug
debug
Release
Build
xcode
Threads
droid
mxe
mxe32
msys2
caret
codelite
configure
Qt
cmake/cmake-android
sublime
yap-6.3.workspace
yap-6.3.geany
YAP.project
CBlocks
yPQ
*.tmp
YAP.sublime*
yap32
Eclipse
codeblocks
yap-6.3.tags
android
yap.prj
yap.VITORs-MBP.vsc.pui
vc
packages/myddas/pl/myddas_odbc.yap
packages/myddas/pl/myddas_postgres.yap
packages/myddas/pl/myddas_sqlite3.ypp
packages/myddas/pl/#myddas_postgres.ypp#
packages/myddas/hh
packages/myddas/DaysInHospital_Y3.csv
packages/myddas/agile.csv
*.pyc
*.cmake#
*.tex
*.c#
packages/swig/yap_wrap.cxx
packages/swig/yap_wrap.h
packages/swig/yap_wrap.cpp
packages/swig/yap.py
*.ipynb
yap
packages/python/yap_kernel/x/__init__.py
x
packages/python/yap_kernel/x/__main__.py
*.gch
mxe
build

2
#GitSHA1.c.in# Normal file
View File

@ -0,0 +1,2 @@
eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee#define GIT_SHA1 "@GIT_SHA1@"
const char g_GIT_SHA1[] = GIT_SHA1;

6
.ctags
View File

@ -6,6 +6,7 @@
--regex-Prolog=/^([a-z][A-Za-z0-9_]*:)?\'(.*)\'\(.*\)\.[ \t]*.*/\2/p,predicate,predicate definition/
--regex-Prolog=/^:-[ \t]+(discontiguous|dynamic|multifile|table|thread_local)[ \t]+([a-z][_a-zA-Z0-9]*:)?([a-z0-9_][_a-zA-Z0-9]*)/\1/p,predicate,predicate metadata/
--regex-Prolog=/^[ \t]*Yap_InitCPred[ \t]*\"(\$?[A-Za-z0-9_]*)\"([ \t]*).*/\1/p,predicate,predicate definition/
--langmap=C:+.(h.cmake).(h.config)
--exclude=\._*
--exclude=*\.bak
--exclude=\.svn
@ -22,3 +23,8 @@
--exclude=\#.*
--exclude=(.)\#*
--exclude=*.dylib
--exclude=docs
--exclude=build
--exclude=cmake-build-debug
--exclude=clang

2
.gitignore vendored
View File

@ -84,7 +84,7 @@ clang
cmake-build-debug
os/YapIOConfig.h
CodeBlocks
x
os/readterm.c.cpp
os/readterm.c.cpp

View File

@ -12,7 +12,7 @@
#ifdef BEAM
#include "Yap.h"
#include "compile.h"
#include "YapCompile.h"
#include "clause.h"
#include "eam.h"
#include "eamamasm.h"

View File

@ -12,7 +12,7 @@
#ifdef BEAM
#include "Yap.h"
#include "compile.h"
#include "YapCompile.h"
#include "clause.h"
#include "eam.h"
#include <stdio.h>

View File

@ -188,7 +188,7 @@ static char SccsId[] = "@(#)amasm.c 1.3 3/15/90";
#include "Yap.h"
#include "clause.h"
#include "compile.h"
#include "YapCompile.h"
#include "yapio.h"
#ifdef BEAM

View File

@ -127,8 +127,7 @@ X_API yhandle_t YAP_CurrentSlot(void);
/// @brief allocate n empty new slots
///
/// Return a handle to the system's default slot.
X_API yhandle_t YAP_NewSlots(int NumberOfSlots);
/// Return a handle to the system's default slo t. iX_API yhandle_t YAP_NewSlots(int NumberOfSlots);
/// @brief allocate n empty new slots
///
@ -246,6 +245,8 @@ X_API YAP_Bool YAP_IsRationalTerm(YAP_Term t) {
#endif
}
X_API YAP_Bool YAP_IsStringTerm(YAP_Term t) { return (IsStringTerm(t)); }
X_API YAP_Bool YAP_IsVarTerm(YAP_Term t) { return (IsVarTerm(t)); }
X_API YAP_Bool YAP_IsNonVarTerm(YAP_Term t) { return (IsNonVarTerm(t)); }
@ -277,6 +278,32 @@ X_API Term YAP_MkIntTerm(Int n) {
return I;
}
X_API Term YAP_MkStringTerm(const char *n) {
CACHE_REGS
Term I;
BACKUP_H();
I = MkStringTerm(n);
RECOVER_H();
return I;
}
X_API Term YAP_MkUnsignedStringTerm(const unsigned char *n) {
CACHE_REGS
Term I;
BACKUP_H();
I = MkUStringTerm(n);
RECOVER_H();
return I;
}
X_API const char *YAP_StringOfTerm(Term t) { return StringOfTerm(t); }
X_API const unsigned char *YAP_UnsignedStringOfTerm(Term t) {
return UStringOfTerm(t);
}
X_API Int YAP_IntOfTerm(Term t) {
if (!IsApplTerm(t))
return IntOfTerm(t);
@ -1380,8 +1407,8 @@ X_API Term YAP_ReadBuffer(const char *s, Term *tp) {
tv = 0;
LOCAL_ErrorMessage = NULL;
const unsigned char *us = (const unsigned char *)s;
while (!(t = Yap_BufferToTermWithPrioBindings(
us, strlen(s) + 1, TermNil, GLOBAL_MaxPriority, tv))) {
while (!(t = Yap_BufferToTermWithPrioBindings(us, strlen(s) + 1, TermNil,
GLOBAL_MaxPriority, tv))) {
if (LOCAL_ErrorMessage) {
if (!strcmp(LOCAL_ErrorMessage, "Stack Overflow")) {
if (!Yap_dogc(0, NULL PASS_REGS)) {
@ -1638,7 +1665,6 @@ X_API PredEntry *YAP_AtomToPredInModule(Atom at, Term mod) {
static int run_emulator(USES_REGS1) {
int out;
LOCAL_PrologMode &= ~(UserCCallMode | CCallMode);
out = Yap_absmi(0);
LOCAL_PrologMode |= UserCCallMode;
return out;
@ -1661,7 +1687,7 @@ X_API bool YAP_EnterGoal(PredEntry *pe, CELL *ptr, YAP_dogoalinfo *dgi) {
// slot=%d", pe, pe->CodeOfPred->opc, FAILCODE, Deref(ARG1), Deref(ARG2),
// LOCAL_CurSlot);
dgi->b = LCL0 - (CELL *)B;
out = run_emulator(PASS_REGS1);
out = Yap_exec_absmi(true, false);
RECOVER_MACHINE_REGS();
if (out) {
dgi->EndSlot = LOCAL_CurSlot;
@ -2122,16 +2148,20 @@ X_API YAP_Term YAP_CopyTerm(Term t) {
X_API char *YAP_WriteBuffer(Term t, char *buf, size_t sze, int flags) {
CACHE_REGS
size_t length;
seq_tv_t inp, out;
size_t length = sze;
char *b;
BACKUP_MACHINE_REGS();
if ((b = Yap_TermToString(t, &length, LOCAL_encoding, flags)) != buf) {
inp.val.t = t;
inp.type = YAP_STRING_TERM;
out.type = YAP_STRING_CHARS;
out.val.c = buf;
out.enc = LOCAL_encoding;
if (!Yap_CVT_Text(&inp, &out PASS_REGS))
return NULL;
RECOVER_MACHINE_REGS();
return b;
}
RECOVER_MACHINE_REGS();
return buf;
return out.val.c;
}
/// write a a term to n user-provided buffer: make sure not tp
@ -2253,13 +2283,11 @@ static void do_bootfile(const char *bootfilename USES_REGS) {
the module.
*/
static bool initialized = false;
X_API bool YAP_initialized = false;
static int n_mdelays = 0;
static YAP_delaymodule_t *m_delays;
X_API bool YAP_DelayInit(YAP_ModInit_t f, const char s[]) {
if (initialized)
return false;
if (m_delays) {
m_delays = realloc(m_delays, (n_mdelays + 1) * sizeof(YAP_delaymodule_t));
} else {
@ -2271,6 +2299,17 @@ X_API bool YAP_DelayInit(YAP_ModInit_t f, const char s[]) {
return true;
}
bool Yap_LateInit(const char s[]) {
int i;
for (i = 0; i < n_mdelays; i++) {
if (!strcmp(m_delays[i].s, s)) {
m_delays[i].f();
return true;
}
}
return false;
}
static void start_modules(void) {
Term cm = CurrentModule;
size_t i;
@ -2296,9 +2335,8 @@ YAP_file_type_t YAP_Init(YAP_init_args *yap_init) {
const char *yroot;
/* ignore repeated calls to YAP_Init */
if (initialized)
if (YAP_initialized)
return YAP_FOUND_BOOT_ERROR;
initialized = true;
Yap_embedded = yap_init->Embedded;
Yap_page_size = Yap_InitPageSize(); /* init memory page size, required by
@ -2306,8 +2344,9 @@ YAP_file_type_t YAP_Init(YAP_init_args *yap_init) {
#if defined(YAPOR_COPY) || defined(YAPOR_COW) || defined(YAPOR_SBA)
Yap_init_yapor_global_local_memory();
#endif /* YAPOR_COPY || YAPOR_COW || YAPOR_SBA */
GLOBAL_PrologShouldHandleInterrupts = yap_init->PrologShouldHandleInterrupts &&
!yap_init->Embedded;
// GLOBAL_PrologShouldHandleInterrupts =
// yap_init->PrologShouldHandleInterrupts &&
if (!yap_init->Embedded)
Yap_InitSysbits(0); /* init signal handling and time, required by later
functions */
GLOBAL_argv = yap_init->Argv;
@ -2492,6 +2531,7 @@ YAP_file_type_t YAP_Init(YAP_init_args *yap_init) {
setBooleanGlobalPrologFlag(SAVED_PROGRAM_FLAG, false);
}
start_modules();
YAP_initialized = true;
return rc;
}

View File

@ -20,7 +20,7 @@ static char SccsId[] = "@(#)cdmgr.c 1.1 05/02/98";
#include "Yap.h"
#include "clause.h"
#include "eval.h"
#include "YapEval.h"
#include "tracer.h"
#include "yapio.h"
#ifdef YAPOR

View File

@ -207,7 +207,7 @@ void Yap_RestartYap(int flag) {
#if PUSH_REGS
restore_absmi_regs(&Yap_standard_regs);
#endif
siglongjmp(LOCAL_RestartEnv, 1);
siglongjmp(*LOCAL_RestartEnv, 1);
}
static void error_exit_yap(int value) {
@ -328,7 +328,7 @@ void Yap_ThrowError__(const char *file, const char *function, int lineno,
} else {
Yap_Error__(file, function, lineno, type, where);
}
siglongjmp(LOCAL_RestartEnv, 4);
siglongjmp(*LOCAL_RestartEnv, 4);
}
/**

View File

@ -1421,7 +1421,10 @@ static bool exec_absmi(bool top, yap_reset_t reset_mode USES_REGS) {
int lval, out;
Int OldBorder = LOCAL_CBorder;
LOCAL_CBorder = LCL0 - (CELL *)B;
if (top && (lval = sigsetjmp(LOCAL_RestartEnv, 1)) != 0) {
sigjmp_buf signew, *sighold = LOCAL_RestartEnv;
LOCAL_RestartEnv = &signew;
if (top && (lval = sigsetjmp(signew, 1)) != 0) {
switch (lval) {
case 1: { /* restart */
/* otherwise, SetDBForThrow will fail entering critical mode */
@ -1455,12 +1458,14 @@ static bool exec_absmi(bool top, yap_reset_t reset_mode USES_REGS) {
} break;
case 3: { /* saved state */
LOCAL_CBorder = OldBorder;
LOCAL_RestartEnv = sighold;
return false;
}
case 4: {
/* abort */
/* can be called from anywgerre, must reset registers,
*/
LOCAL_RestartEnv = sighold;
Yap_JumpToEnv(TermDAbort);
P = (yamop *)FAILCODE;
LOCAL_PrologMode = UserMode;
@ -1480,6 +1485,7 @@ static bool exec_absmi(bool top, yap_reset_t reset_mode USES_REGS) {
if (!Yap_has_a_signal())
CalculateStackGap(PASS_REGS1);
LOCAL_CBorder = OldBorder;
LOCAL_RestartEnv = sighold;
return out;
}
@ -2018,14 +2024,17 @@ static Int JumpToEnv() {
/* find the first choicepoint that may be a catch */
// DBTerm *dbt = Yap_RefToException();
while (handler && Yap_PredForChoicePt(handler, NULL) != PredDollarCatch) {
//printf("--handler=%p, max=%p\n", handler, LCL0-LOCAL_CBorder);
while (POP_CHOICE_POINT(handler)) {
POP_FAIL_EXECUTE(handler);
}
if (handler == (choiceptr)(LCL0-LOCAL_CBorder)) {
break;
}
/* we are already doing a catch */
/* make sure we prune C-choicepoints */
if (handler->cp_ap == NOCODE &&
(handler >= (choiceptr)(LCL0 - LOCAL_CBorder) ||
handler->cp_b == NULL)) {
if ((handler->cp_ap == NOCODE && handler->cp_b == NULL) ||
(handler->cp_b >= (choiceptr)(LCL0 - LOCAL_CBorder))) {
break;
}
handler = handler->cp_b;
@ -2080,17 +2089,17 @@ static Int jump_env(USES_REGS1) {
Yap_Error(INSTANTIATION_ERROR, t, "throw ball must be bound");
return false;
} else if (IsApplTerm(t) && FunctorOfTerm(t) == FunctorError) {
Term t2, te;
Term t2;
Yap_find_prolog_culprit(PASS_REGS1);
// LOCAL_Error_TYPE = ERROR_EVENT;
t = ArgOfTerm(1, t);
if (IsApplTerm(t) && IsAtomTerm((t2 = ArgOfTerm(1, t)))) {
LOCAL_ActiveError.errorAsText = AtomOfTerm(t2);
LOCAL_ActiveError.classAsText = NameOfFunctor(FunctorOfTerm(t));
LOCAL_ActiveError->errorAsText = AtomOfTerm(t2);
LOCAL_ActiveError->classAsText = NameOfFunctor(FunctorOfTerm(t));
} else if (IsAtomTerm(t)) {
LOCAL_ActiveError.errorAsText = AtomOfTerm(t);
LOCAL_ActiveError.classAsText = NULL;
LOCAL_ActiveError->errorAsText = AtomOfTerm(t);
LOCAL_ActiveError->classAsText = NULL;
}
} else {
// LOCAL_Error_TYPE = THROW_EVENT;
@ -2235,7 +2244,6 @@ bool Yap_ResetException(int wid) {
Yap_PopTermFromDB(REMOTE_ActiveError(wid)->errorTerm);
}
REMOTE_ActiveError(wid)->errorTerm = NULL;
REMOTE_ActiveError(wid)->errorTerm = NULL;
return true;
}

View File

@ -666,12 +666,19 @@ static bool setYapFlagInModule(Term tflag, Term t2, Term mod) {
flag_term *tarr = GLOBAL_Flags;
if (!(fv->type(t2)))
return false;
if (fv->helper && !(fv->helper(t2)))
return false;
Term tout = tarr[fv->FlagOfVE].at;
if (IsVarTerm(tout))
Yap_PopTermFromDB(tarr[fv->FlagOfVE].DBT);
if (IsAtomOrIntTerm(t2))
if (IsVarTerm(tout)) {
Term t;
while ((t = Yap_PopTermFromDB(tarr[fv->FlagOfVE].DBT)) == 0) {
if (!Yap_gc(2, ENV, gc_P(P, CP))) {
Yap_Error(RESOURCE_ERROR_STACK, TermNil, LOCAL_ErrorMessage);
return false;
}
}
} else if (IsAtomOrIntTerm(t2))
tarr[fv->FlagOfVE].at = t2;
else {
tarr[fv->FlagOfVE].DBT = Yap_StoreTermInDB(t2, 2);

View File

@ -115,7 +115,7 @@ threads that are created <em>after</em> the registration.
#include "YapHeap.h"
#include "yapio.h"
#include "iopreds.h"
#include "eval.h"
#include "YapEval.h"
#include "attvar.h"
#include <math.h>

View File

@ -134,7 +134,7 @@ gc_growtrail(int committed, tr_fr_ptr begsTR, cont *old_cont_top0 USES_REGS)
#endif
/* could not find more trail */
save_machine_regs();
siglongjmp(LOCAL_gc_restore, 2);
siglongjmp(*LOCAL_gc_restore, 2);
}
}
@ -397,7 +397,7 @@ check_pr_trail( tr_fr_ptr rc USES_REGS)
if (!Yap_locked_growtrail(0, TRUE) || TRUE) {
/* could not find more trail */
save_machine_regs();
siglongjmp(LOCAL_gc_restore, 2);
siglongjmp(*LOCAL_gc_restore, 2);
}
rc = TR-n;
}
@ -525,7 +525,7 @@ pop_registers(Int num_regs, yamop *nextop USES_REGS)
/* error: we don't have enough room */
/* could not find more trail */
save_machine_regs();
siglongjmp(LOCAL_gc_restore, 4);
siglongjmp(*LOCAL_gc_restore, 4);
}
}
}
@ -1450,7 +1450,7 @@ mark_variable(CELL_PTR current USES_REGS)
/* error: we don't have enough room */
/* could not find more trail */
save_machine_regs();
siglongjmp(LOCAL_gc_restore, 3);
siglongjmp(*LOCAL_gc_restore, 3);
} else if (n > 0) {
CELL *ptr = LOCAL_extra_gc_cells;
@ -3934,6 +3934,9 @@ do_gc(Int predarity, CELL *current_env, yamop *nextop USES_REGS)
UInt gc_phase;
UInt alloc_sz;
int jmp_res;
sigjmp_buf jmp;
LOCAL_gc_restore = &jmp;
heap_cells = HR-H0;
gc_verbose = is_gc_verbose();
@ -3989,7 +3992,7 @@ do_gc(Int predarity, CELL *current_env, yamop *nextop USES_REGS)
}
#endif
time_start = Yap_cputime();
jmp_res = sigsetjmp(LOCAL_gc_restore, 0);
jmp_res = sigsetjmp(jmp, 0);
if (jmp_res == 2) {
UInt sz;

View File

@ -42,13 +42,13 @@ Yap_FindExecutable(void)
void *
Yap_LoadForeignFile(char *file, int flags)
{
char *buf = malloc(1024);
printf("file=%s\n" , file );
void *ptr= (void *)LoadLibrary(file);
if (!ptr) {
CACHE_REGS
LOCAL_ErrorMessage = NULL;
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), LOCAL_ErrorMessage, 256,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), buf, 1023,
NULL);
}
return ptr;
@ -83,16 +83,17 @@ LoadForeign(StringList ofiles, StringList libs,
HINSTANCE handle;
const char *file = AtomName(ofiles->name);
if (!Yap_findFile(file, NULL, NULL, LOCAL_FileNameBuf, true, YAP_OBJ, true, true) &&
if (Yap_findFile(file, NULL, NULL, LOCAL_FileNameBuf, true, YAP_OBJ, true, true) &&
(handle=LoadLibrary(LOCAL_FileNameBuf)) != 0)
{
LOCAL_ErrorMessage = NULL;
if (*init_proc == NULL)
*init_proc = (YapInitProc)GetProcAddress((HMODULE)handle, proc_name);
} else {
char *buf = malloc(1024);
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), LOCAL_ErrorMessage, 256,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), buf, 1023,
NULL);
//fprintf(stderr,"WinError: %s\n", LOCAL_ErrorSay);
}

View File

@ -46,7 +46,7 @@ p_load_foreign( USES_REGS1 )
YapInitProc InitProc = NULL;
Term t, t1;
StringList new;
Int returncode = FALSE;
bool returncode = FALSE;
yhandle_t CurSlot = Yap_StartSlots();
// Yap_DebugPlWrite(ARG1); printf("%s\n", " \n");
@ -81,12 +81,16 @@ p_load_foreign( USES_REGS1 )
t1 = Deref(ARG3);
InitProcName = (char *)RepAtom(AtomOfTerm(t1))->StrOfAE;
// verify if it was waiting for initialization
if (Yap_LateInit( InitProcName ) ){
returncode = true;
} else
/* call the OS specific function for dynamic loading */
if(Yap_LoadForeign(ofiles,libs,InitProcName,&InitProc)==LOAD_SUCCEEDED) {
Yap_StartSlots( );
(*InitProc)();
Yap_CloseSlots(CurSlot);
returncode = TRUE;
returncode = true;
}
/* I should recover space if load foreign fails */

View File

@ -302,7 +302,7 @@ static Term VarNames(VarEntry *p, Term l USES_REGS) {
VarNames(p->VarLeft, l PASS_REGS) PASS_REGS));
if (HR > ASP - 4096) {
save_machine_regs();
siglongjmp(LOCAL_IOBotch, 1);
longjmp(*LOCAL_IOBotch, 1);
}
return (o);
} else {
@ -332,7 +332,7 @@ static Term Singletons(VarEntry *p, Term l USES_REGS) {
Singletons(p->VarLeft, l PASS_REGS) PASS_REGS));
if (HR > ASP - 4096) {
save_machine_regs();
siglongjmp(LOCAL_IOBotch, 1);
longjmp(*LOCAL_IOBotch, 1);
}
return (o);
} else {
@ -357,7 +357,7 @@ static Term Variables(VarEntry *p, Term l USES_REGS) {
Variables(p->VarRight, Variables(p->VarLeft, l PASS_REGS) PASS_REGS));
if (HR > ASP - 4096) {
save_machine_regs();
siglongjmp(LOCAL_IOBotch, 1);
siglongjmp(*LOCAL_IOBotch, 1);
}
return (o);
} else {

View File

@ -67,7 +67,7 @@ static yap_signals InteractSIGINT(int ch) {
#if PUSH_REGS
// restore_absmi_regs(&Yap_standard_regs);
#endif
siglongjmp(LOCAL_RestartEnv, 4);
siglongjmp(&LOCAL_RestartEnv, 4);
return YAP_ABORT_SIGNAL;
case 'b':
/* continue */

View File

@ -58,6 +58,9 @@ static char SccsId[] = "%W% %G%";
#include <fcntl.h>
#include <wchar.h>
extern int init_tries(void);
static Int p_setval(USES_REGS1);
static Int p_value(USES_REGS1);
static Int p_values(USES_REGS1);
@ -74,7 +77,7 @@ static Int p_halt(USES_REGS1);
#endif
static Int current_predicate(USES_REGS1);
static Int cont_current_predicate(USES_REGS1);
static OpEntry *NextOp(OpEntry *CACHE_TYPE);
static OpEntry *NextOp(Prop CACHE_TYPE);
static Int init_current_op(USES_REGS1);
static Int cont_current_op(USES_REGS1);
static Int init_current_atom_op(USES_REGS1);
@ -943,22 +946,24 @@ static Int current_predicate(USES_REGS1) {
return cont_current_predicate(PASS_REGS1);
}
static OpEntry *NextOp(OpEntry *pp USES_REGS) {
static OpEntry *NextOp(Prop pp USES_REGS) {
while (!EndOfPAEntr(pp) && pp->KindOfPE != OpProperty &&
(pp->OpModule != PROLOG_MODULE || pp->OpModule != CurrentModule))
pp = RepOpProp(pp->NextOfPE);
return (pp);
(RepOpProp(pp)->OpModule != PROLOG_MODULE
|| RepOpProp(pp)->OpModule != CurrentModule) )
pp = pp->NextOfPE;
return RepOpProp(pp);
}
int Yap_IsOp(Atom at) {
CACHE_REGS
OpEntry *op = NextOp(RepOpProp((Prop)(RepAtom(at)->PropsOfAE)) PASS_REGS);
OpEntry *op = NextOp(RepAtom(at)->PropsOfAE PASS_REGS);
return (!EndOfPAEntr(op));
}
int Yap_IsOpMaxPrio(Atom at) {
CACHE_REGS
OpEntry *op = NextOp(RepOpProp((Prop)(RepAtom(at)->PropsOfAE)) PASS_REGS);
OpEntry *op = NextOp(RepAtom(at)->PropsOfAE PASS_REGS);
int max;
if (EndOfPAEntr(op))
@ -1020,7 +1025,7 @@ static Int cont_current_atom_op(USES_REGS1) {
OpEntry *op = (OpEntry *)IntegerOfTerm(EXTRA_CBACK_ARG(5, 1)), *next;
READ_LOCK(op->OpRWLock);
next = NextOp(RepOpProp(op->NextOfPE) PASS_REGS);
next = NextOp(op->NextOfPE PASS_REGS);
if (unify_op(op PASS_REGS)) {
READ_UNLOCK(op->OpRWLock);
if (next) {
@ -1053,7 +1058,7 @@ static Int init_current_atom_op(
cut_fail();
}
ae = RepAtom(AtomOfTerm(t));
if (EndOfPAEntr((ope = NextOp(RepOpProp(ae->PropsOfAE) PASS_REGS)))) {
if (EndOfPAEntr((ope = NextOp(ae->PropsOfAE PASS_REGS)))) {
cut_fail();
}
EXTRA_CBACK_ARG(5, 1) = (CELL)MkIntegerTerm((Int)ope);
@ -1074,7 +1079,7 @@ static Int
cut_fail();
}
ae = RepAtom(AtomOfTerm(t));
if (EndOfPAEntr((ope = NextOp(RepOpProp(ae->PropsOfAE) PASS_REGS)))) {
if (EndOfPAEntr((ope = NextOp(ae->PropsOfAE PASS_REGS)))) {
cut_fail();
}
EXTRA_CBACK_ARG(5, 1) = (CELL)MkIntegerTerm((Int)ope);
@ -1629,7 +1634,6 @@ void Yap_InitCPreds(void) {
#if SUPPORT_CONDOR
init_sys();
init_random();
// init_tries();
init_regexp();
#endif
}

View File

@ -1,7 +1,7 @@
# value of 3.4.0 or lower.
# Sets the minimum version of CMake required to build the native
# library. You should either keep the default value or only pass a
# Sets the version of CMake required to build the native
# library. You should either keep the default value or pass a
# value of 3.4.0 or lower.
project( YAP )
@ -33,13 +33,13 @@ include(FindPackageHandleStandardArgs)
include (GNUInstallDirs)
# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds it for you.
# or SHARED, and provides the relative paths to its source code.z
# You can define libraries, and CMake builds it for you.
# Gradle automatically packages shared libraries with your APK.
#cross-compilation support
# Search packages for host system instead of packages for target system
# in case of cross compilation these macro should be defined by toolchain file
# in case of cross compilation define these macro by toolchain file
if(NOT COMMAND find_host_package)
macro(find_host_package)
find_package(${ARGN})
@ -53,6 +53,7 @@ endif()
option(BUILD_SHARED_LIBS "Build shared library" ON)
set (CMAKE_POSITION_INDEPENDENT_CODE TRUE)
set (CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS TRUE)
include(Prelims NO_POLICY_SCOPE)
@ -69,6 +70,8 @@ if (ANDROID)
)
endif (ANDROID)
set_property( SOURCE ${LIBYAP_SOURCES} APPEND PROPERTY COMPILE_DEFINITIONS YAP_KERNEL=1)
add_definitions(-DUSE_MYDDAS=1 -DMYDDAS_SQLITE3=1)
if (MYSQL_FOUND)
@ -82,6 +85,9 @@ if (ODBC_FOUND)
if (MYSQL_POSTGRES)
add_definitions(= -DMYDDAS_POSTGRES=1)
endif()
if (MYSQL_POSTGRES)
set(SWIG_SOURCES packages/swig/python/yap_PYTHONwrapper.cxx )
endif()
if (ANDROID)
@ -93,53 +99,44 @@ if (MYSQL_POSTGRES)
ADD_SUBDIRECTORY(CXX)
set (SWIG_FILES ${CMAKE_SOURCE_DIR}/../generated/jni/yap_wrap.cpp )
else()
set(YLIBS
$<TARGET_OBJECTS:core>
$<TARGET_OBJECTS:libYAPOs>
$<TARGET_OBJECTS:libOPTYap>
$<TARGET_OBJECTS:myddas>
$<TARGET_OBJECTS:Yapsqlite3>
$<TARGET_OBJECTS:libswi>
$<TARGET_OBJECTS:utf8proc>
)
endif ()
List (APPEND YLIBS $<TARGET_OBJECTS:libOPTYap> )
List (APPEND YLIBS $<TARGET_OBJECTS:libYAPOs> )
List (APPEND YLIBS $<TARGET_OBJECTS:utf8proc> )
List (APPEND YLIBS $<TARGET_OBJECTS:myddas> )
List (APPEND YLIBS $<TARGET_OBJECTS:Yapsqlite3> )
List (APPEND YLIBS $<TARGET_OBJECTS:libswi> )
if (WIN32)
list (APPEND YLIBS $<TARGET_OBJECTS:YapC++>)
List (APPEND YLIBS $<TARGET_OBJECTS:YAP++> )
endif()
add_component (core
${ENGINE_SOURCES}
${SWIG_FILES}
${C_INTERFACE_SOURCES}
${STATIC_SOURCES}
${ALL_SOURCES}
)
add_library( # Sets the name of the library.
libYap
# Sets the library as a shared library.
SHARED
${ENGINE_SOURCES}
${C_INTERFACE_SOURCES}
//${STATIC_SOURCES}
# cmake object libraries
${YLIBS}
${WINDLLS}
)
if (WIN32)
target_link_libraries(libYap ${WINDLLS})
endif (WIN32)
include(libYap NO_POLICY_SCOPE)
endif()
if (USE_READLINE)
target_link_libraries(libYap ${READLINE_LIBRARIES})
endif (USE_READLINE)
if (ANDROID)
add_dependencies(libYap plmyddas )
@ -151,6 +148,5 @@ set_target_properties(libYap
PROPERTIES OUTPUT_NAME Yap
)
MY_include(Packages NO_POLICY_SCOPE)
include(Config NO_POLICY_SCOPE)

View File

@ -145,7 +145,7 @@ ADDR db_vec0 =NULL
struct RB_red_blk_node* db_root =NULL
struct RB_red_blk_node* db_nil =NULL
sigjmp_buf gc_restore void
sigjmp_buf* gc_restore void
CELL* extra_gc_cells void
CELL* extra_gc_cells_base void
CELL* extra_gc_cells_top void
@ -160,8 +160,8 @@ struct mem_blk* CMemFirstBlock =NULL
UInt CMemFirstBlockSz =0L
// Variable used by the compiler to store number of permanent vars in a clause
int nperm =0L
int nperm =0
int jMP =0
// Thread Local Area for Labels
Int* LabelFirstArray =NULL
UInt LabelFirstArraySz =0L
@ -198,7 +198,7 @@ ADDR TrailTop void
yap_error_descriptor_t* ActiveError =calloc(sizeof(yap_error_descriptor_t),1)
/// pointer to an exception term, from throw
jmp_buf IOBotch void
jmp_buf* IOBotch void
TokEntry* tokptr void
TokEntry* toktide void
VarEntry* VarTable void
@ -209,7 +209,7 @@ CELL* CommentsNextChar void
wchar_t* CommentsBuff void
size_t CommentsBuffPos void
size_t CommentsBuffLim void
sigjmp_buf RestartEnv void
sigjmp_buf* RestartEnv void
char FileNameBuf[YAP_FILENAME_MAX+1] void
char FileNameBuf2[YAP_FILENAME_MAX+1] void

View File

@ -302,6 +302,8 @@ INLINE_ONLY inline EXTERN Term __MkStringTerm(const char *s USES_REGS) {
return t;
}
#define MkUStringTerm(i) __MkUStringTerm((i)PASS_REGS)
INLINE_ONLY inline EXTERN Term
__MkUStringTerm(const unsigned char *s USES_REGS);

39
H/Yap.h
View File

@ -129,37 +129,6 @@
#endif
#endif /* defined(HAVE_NULLPTR) */
/* Microsoft's Visual C++ Compiler */
#ifdef _MSC_VER /* adjust a config.h from mingw32 to work with vc++ */
#ifdef HAVE_GCC
#undef HAVE_GCC
#endif /* HAVE_GCC */
#ifdef USE_THREADED_CODE
#undef USE_THREADED_CODE
#endif /* USE_THREADED_CODE */
#define inline __inline
#define YAP_VERSION "YAP-6.3.4"
#define BIN_DIR "c:\\Yap\\bin"
#define LIB_DIR "c:\\Yap\\lib\\Yap"
#define SHARE_DIR "c:\\Yap\\share\\Yap"
#ifdef HOST_ALIAS
#undef HOST_ALIAS
#endif /* HOST_ALIAS */
#define HOST_ALIAS "i386-pc-win32"
#ifdef HAVE_IEEEFP_H
#undef HAVE_IEEEFP_H
#endif /* HAVE_IEEEFP_H */
#ifdef HAVE_UNISTD_H
#undef HAVE_UNISTD_H
#endif /* HAVE_UNISTD_H */
#ifdef HAVE_SYS_TIME_H
#undef HAVE_SYS_TIME_H
#endif /* HAVE_SYS_TIME_H */
#endif /* _MSC_VER */
#if HAVE_TIME_H
#include <time.h>
#endif
#ifdef __MINGW32__
#ifndef _WIN32
@ -727,10 +696,10 @@ typedef struct thandle {
struct timeval *start_of_times_sysp;
struct timeval *last_time_sysp;
#elif _WIN32
struct _FILETIME *start_of_timesp;
struct _FILETIME *last_timep;
struct _FILETIME *start_of_times_sysp;
struct _FILETIME *last_time_sysp;
win64_time_t *start_of_timesp;
win64_time_t *last_timep;
win64_time_t *start_of_times_sysp;
win64_time_t *last_time_sysp;
#endif
} yap_thandle;
#endif /* THREADS */

View File

@ -8,7 +8,7 @@
* *
**************************************************************************
* *
* File: compile.h *
* File: YapCompile.h *
* Last rev: *
* mods: *
* comments: compiler data structures and routines *

View File

@ -1,6 +1,6 @@
/*************************************************************************
* *
* YAP Prolog @(#)eval.h 1.2
* YAP Prolog @(#)YapEval.h 1.2
* *
* Yap Prolog was developed at NCCUP - Universidade do Porto *
* *
@ -8,7 +8,7 @@
* *
**************************************************************************
* *
* File: eval.h *
* File: YapEval.h *
* Last rev: *
* mods: *
* comments: arithmetical functions info *
@ -17,7 +17,7 @@
/**
@file eval.h
@file YapEval.h
@defgroup arithmetic Arithmetic in YAP

View File

@ -154,7 +154,7 @@ typedef struct thandle {
/*******************
this is the data base: everything here should be possible to restore
********************/
#if __INIT_C__
#if __INIT_C__ || defined(MSC_VER)
#define EXTERNAL
#else
#define EXTERNAL extern

View File

@ -166,13 +166,15 @@ INLINE_ONLY inline EXTERN Term *VarOfTerm(Term t) { return (Term *)(t); }
INLINE_ONLY inline EXTERN Term MkVarTerm__(USES_REGS1);
INLINE_ONLY inline EXTERN Term MkVarTerm__(USES_REGS1) {
INLINE_ONLY
inline EXTERN Term MkVarTerm__(USES_REGS1) {
return (Term)((*HR = 0, HR++));
}
INLINE_ONLY inline EXTERN bool IsUnboundVar(Term *);
INLINE_ONLY inline EXTERN bool IsUnboundVar(Term *t) { return (int)(*(t) ==
INLINE_ONLY
inline EXTERN bool IsUnboundVar(Term *t) { return (int)(*(t) ==
0); }
#else
@ -181,13 +183,15 @@ INLINE_ONLY inline EXTERN bool IsUnboundVar(Term *t) { return (int)(*(t) ==
INLINE_ONLY inline EXTERN Term MkVarTerm__(USES_REGS1);
INLINE_ONLY inline EXTERN Term MkVarTerm__(USES_REGS1) {
INLINE_ONLY
inline EXTERN Term MkVarTerm__(USES_REGS1) {
return (Term)((*HR = (CELL)HR, HR++));
}
INLINE_ONLY inline EXTERN bool IsUnboundVar(Term *);
INLINE_ONLY inline EXTERN bool IsUnboundVar(Term *t) {
INLINE_ONLY
inline EXTERN bool IsUnboundVar(Term *t) {
return *(t) == (Term)(t);
}
@ -195,13 +199,15 @@ INLINE_ONLY inline EXTERN bool IsUnboundVar(Term *t) {
INLINE_ONLY inline EXTERN CELL *PtrOfTerm(Term);
INLINE_ONLY inline EXTERN CELL *PtrOfTerm(Term t) {
INLINE_ONLY
inline EXTERN CELL *PtrOfTerm(Term t) {
return (CELL *)(*(CELL *)(t));
}
INLINE_ONLY inline EXTERN Functor FunctorOfTerm(Term);
INLINE_ONLY inline EXTERN Functor FunctorOfTerm(Term t) {
INLINE_ONLY
inline EXTERN Functor FunctorOfTerm(Term t) {
return (Functor)(*RepAppl(t));
}
@ -209,13 +215,15 @@ INLINE_ONLY inline EXTERN Functor FunctorOfTerm(Term t) {
INLINE_ONLY inline EXTERN Term MkAtomTerm(Atom);
INLINE_ONLY inline EXTERN Term MkAtomTerm(Atom a) {
INLINE_ONLY
inline EXTERN Term MkAtomTerm(Atom a) {
return (Term)(AtomTag | (CELL)(a));
}
INLINE_ONLY inline EXTERN Atom AtomOfTerm(Term t);
INLINE_ONLY inline EXTERN Atom AtomOfTerm(Term t) {
INLINE_ONLY
inline EXTERN Atom AtomOfTerm(Term t) {
return (Atom)((~AtomTag & (CELL)(t)));
}
@ -223,13 +231,15 @@ INLINE_ONLY inline EXTERN Atom AtomOfTerm(Term t) {
INLINE_ONLY inline EXTERN Term MkAtomTerm(Atom);
INLINE_ONLY inline EXTERN Term MkAtomTerm(Atom at) {
INLINE_ONLY
inline EXTERN Term MkAtomTerm(Atom at) {
return (Term)(TAGGEDA((CELL)AtomTag, (CELL)(at)));
}
INLINE_ONLY inline EXTERN Atom AtomOfTerm(Term t);
INLINE_ONLY inline EXTERN Atom AtomOfTerm(Term t) {
INLINE_ONLY
inline EXTERN Atom AtomOfTerm(Term t) {
return (Atom)(NonTagPart(t));
}
@ -237,13 +247,15 @@ INLINE_ONLY inline EXTERN Atom AtomOfTerm(Term t) {
INLINE_ONLY inline EXTERN bool IsAtomTerm(Term);
INLINE_ONLY inline EXTERN bool IsAtomTerm(Term t) {
INLINE_ONLY
inline EXTERN bool IsAtomTerm(Term t) {
return CHKTAG((t), AtomTag);
}
INLINE_ONLY inline EXTERN Term MkIntTerm(Int);
INLINE_ONLY inline EXTERN Term MkIntTerm(Int n) {
INLINE_ONLY
inline EXTERN Term MkIntTerm(Int n) {
return (Term)(TAGGED(NumberTag, (n)));
}
@ -254,19 +266,22 @@ INLINE_ONLY inline EXTERN Term MkIntTerm(Int n) {
INLINE_ONLY inline EXTERN Term MkIntConstant(Int);
INLINE_ONLY inline EXTERN Term MkIntConstant(Int n) {
INLINE_ONLY
inline EXTERN Term MkIntConstant(Int n) {
return (Term)(NONTAGGED(NumberTag, (n)));
}
INLINE_ONLY inline EXTERN bool IsIntTerm(Term);
INLINE_ONLY inline EXTERN bool IsIntTerm(Term t) {
INLINE_ONLY
inline EXTERN bool IsIntTerm(Term t) {
return CHKTAG((t), NumberTag);
}
INLINE_ONLY EXTERN inline Term MkPairTerm__(Term head, Term tail USES_REGS);
INLINE_ONLY EXTERN inline Term MkPairTerm__(Term head, Term tail USES_REGS) {
INLINE_ONLY
EXTERN inline Term MkPairTerm__(Term head, Term tail USES_REGS) {
CELL *p = HR;
HR[0] = head;
@ -308,20 +323,23 @@ INLINE_ONLY EXTERN inline Term MkPairTerm__(Term head, Term tail USES_REGS) {
INLINE_ONLY inline EXTERN Term __MkIntegerTerm(Int USES_REGS);
INLINE_ONLY inline EXTERN Term __MkIntegerTerm(Int n USES_REGS) {
INLINE_ONLY
inline EXTERN Term __MkIntegerTerm(Int n USES_REGS) {
return (Term)(IntInBnd(n) ? MkIntTerm(n) : MkLongIntTerm(n));
}
#endif
INLINE_ONLY inline EXTERN bool IsIntegerTerm(Term);
INLINE_ONLY inline EXTERN bool IsIntegerTerm(Term t) {
INLINE_ONLY
inline EXTERN bool IsIntegerTerm(Term t) {
return (int)(IsIntTerm(t) || IsLongIntTerm(t));
}
INLINE_ONLY inline EXTERN Int IntegerOfTerm(Term);
INLINE_ONLY inline EXTERN Int IntegerOfTerm(Term t) {
INLINE_ONLY
inline EXTERN Int IntegerOfTerm(Term t) {
return (Int)(IsIntTerm(t) ? IntOfTerm(t) : LongIntOfTerm(t));
}
@ -332,7 +350,8 @@ INLINE_ONLY inline EXTERN Int IntegerOfTerm(Term t) {
INLINE_ONLY inline EXTERN Term __MkAddressTerm(void *USES_REGS);
INLINE_ONLY inline EXTERN Term __MkAddressTerm(void *n USES_REGS) {
INLINE_ONLY
inline EXTERN Term __MkAddressTerm(void *n USES_REGS) {
return __MkIntegerTerm((Int)n PASS_REGS);
}
@ -340,20 +359,23 @@ INLINE_ONLY inline EXTERN Term __MkAddressTerm(void *n USES_REGS) {
INLINE_ONLY inline EXTERN bool IsAddressTerm(Term);
INLINE_ONLY inline EXTERN bool IsAddressTerm(Term t) {
INLINE_ONLY
inline EXTERN bool IsAddressTerm(Term t) {
return (bool)IsIntegerTerm(t);
}
INLINE_ONLY inline EXTERN void *AddressOfTerm(Term);
INLINE_ONLY inline EXTERN void *AddressOfTerm(Term t) {
INLINE_ONLY
inline EXTERN void *AddressOfTerm(Term t) {
return (void *)(IsIntTerm(t) ? IntOfTerm(t) : LongIntOfTerm(t));
}
INLINE_ONLY inline EXTERN Int IsPairTermOrNil (Term);
INLINE_ONLY inline EXTERN Int
INLINE_ONLY
inline EXTERN Int
IsPairOrNilTerm (Term t)
{
return IsPairTerm(t) || t == TermNil;

View File

@ -33,7 +33,7 @@ typedef void *Atom;
(((CELL)(X) + (sizeof(TYPE) - 1)) & ~(sizeof(TYPE) - 1))
#ifndef EXTERN
#ifdef _MSC_VER
#ifdef MSC_VER
#define EXTERN
#else
#define EXTERN extern
@ -44,51 +44,30 @@ typedef void *Atom;
** and integer types Short and UShort with half the size of a ptr */
#if defined(PRIdPTR)
#define Int_FORMAT "%" PRIdPTR
#define Int_ANYFORMAT "%" PRIuPTR
#define UInt_FORMAT "%" PRIuPTR
#define Int_F PRIdPTR
#define Int_ANYF PRIuPTR
#define UInt_F PRIuPTR
typedef intptr_t Int;
typedef uintptr_t UInt;
#elif defined(_WIN64)
typedef int64_t Int;
typedef uint64_t UInt;
#define Int_FORMAT "%I64d"
#define UInt_FORMAT "%I64u"
#define Int_F "I64d"
#define UInt_F "I64u"
#elif defined(_WIN32)
typedef int32_t Int;
typedef uint32_t UInt;
#define Int_FORMAT "%I32d"
#define UInt_FORMAT "%I32u"
#define Int_F "I32d"
#define UInt_F "I32u"
#elif SIZEOF_LONG_INT == SIZEOF_INT_P
typedef long int Int;
typedef unsigned long int UInt;
#define Int_FORMAT "%ld"
#define UInt_FORMAT "%uld"
#define Int_F "ld"
#define UInt_F "uld"
#elif SIZEOF_INT == SIZEOF_INT_P
typedef int Int;
typedef unsigned int UInt;
#define Int_FORMAT "%l"
#define UInt_FORMAT "%ul"
#define Int_F "l"
#define UInt_F "ul"
#else
#error Yap require integer types of the same size as a pointer
@ -107,6 +86,8 @@ typedef uint32_t BITS32;
#define CellSize sizeof(CELL)
#define SmallSize sizeof(SMALLUNSGN)
#include "YapFormat.h"
/*************************************************************************************************
type casting macros
*************************************************************************************************/

View File

@ -31,6 +31,23 @@
#include "../utf8proc/utf8proc.h"
#include "Yap.h"
#define ReleaseAndReturn(r) \
{ \
pop_text_stack(l); \
return r; \
}
#define release_cut_fail() \
{ \
pop_text_stack(l); \
cut_fail(); \
}
#define release_cut_succeed() \
{ \
pop_text_stack(l); \
cut_succeed(); \
}
/// allocate a temporary text block
///
extern void *Malloc(size_t sz USES_REGS);

View File

@ -13,12 +13,6 @@
* version: $Id: Yapproto.h,v 1.90 2008-08-07 20:51:23 vsc Exp $ *
*************************************************************************/
#if defined(_WIN32)
#define X_API __declspec(dllexport)
#else
#define X_API
#endif
/* prototype file for Yap */
/* absmi.c */
@ -309,6 +303,7 @@ extern struct vfs *Yap_InitAssetManager(void);
/* load_foreign.c */
extern void Yap_InitLoadForeign(void);
extern bool Yap_LateInit(const char s[]);
/* mavar.c */
extern void Yap_InitMaVarCPreds(void);

View File

@ -139,7 +139,7 @@ register struct yami *P1REG asm("bp"); /* can't use yamop before Yap.h */
#include "Yap.h"
#include "clause.h"
#include "eval.h"
#include "YapEval.h"
#ifdef HAVE_STRING_H
#include <string.h>
#endif
@ -2327,6 +2327,8 @@ static inline void prune(choiceptr cp USES_REGS) {
if (POP_CHOICE_POINT(B->cp_b)) {
POP_EXECUTE();
}
if (B->cp_b == NULL)
break;
B = B->cp_b;
}
if (POP_CHOICE_POINT(B->cp_b)) {

View File

@ -11,7 +11,7 @@
#ifndef BLOBS_H
#define BLOBS_H
#ifndef X_API
#if !defined(X_API) && !defined(SWIGYAP)
#if (defined(_MSC_VER) || defined(__MINGW32__)) && defined(PL_KERNEL)
#define X_API __declspec(dllexport)
#else

View File

@ -250,6 +250,8 @@
#define LOCAL_nperm LOCAL->nperm_
#define REMOTE_nperm(wid) REMOTE(wid)->nperm_
#define LOCAL_jMP LOCAL->jMP_
#define REMOTE_jMP(wid) REMOTE(wid)->jMP_
#define LOCAL_LabelFirstArray LOCAL->LabelFirstArray_
#define REMOTE_LabelFirstArray(wid) REMOTE(wid)->LabelFirstArray_

View File

@ -126,7 +126,7 @@ typedef struct worker_local {
ADDR db_vec0_;
struct RB_red_blk_node* db_root_;
struct RB_red_blk_node* db_nil_;
sigjmp_buf gc_restore_;
sigjmp_buf* gc_restore_;
CELL* extra_gc_cells_;
CELL* extra_gc_cells_base_;
CELL* extra_gc_cells_top_;
@ -140,6 +140,7 @@ typedef struct worker_local {
UInt CMemFirstBlockSz_;
// Variable used by the compiler to store number of permanent vars in a clause
int nperm_;
int jMP_;
// Thread Local Area for Labels
Int* LabelFirstArray_;
UInt LabelFirstArraySz_;
@ -166,7 +167,7 @@ typedef struct worker_local {
/* error handling info, designed to be easy to pass to the foreign world */
yap_error_descriptor_t* ActiveError_;
/// pointer to an exception term, from throw
jmp_buf IOBotch_;
jmp_buf* IOBotch_;
TokEntry* tokptr_;
TokEntry* toktide_;
VarEntry* VarTable_;
@ -177,7 +178,7 @@ typedef struct worker_local {
wchar_t* CommentsBuff_;
size_t CommentsBuffPos_;
size_t CommentsBuffLim_;
sigjmp_buf RestartEnv_;
sigjmp_buf* RestartEnv_;
char FileNameBuf_[YAP_FILENAME_MAX+1];
char FileNameBuf2_[YAP_FILENAME_MAX+1];
struct TextBuffer_manager* TextBuffer_;

View File

@ -139,7 +139,8 @@ static void InitWorker(int wid) {
REMOTE_CMemFirstBlock(wid) = NULL;
REMOTE_CMemFirstBlockSz(wid) = 0L;
REMOTE_nperm(wid) = 0L;
REMOTE_nperm(wid) = 0;
REMOTE_jMP(wid) = 0;
REMOTE_LabelFirstArray(wid) = NULL;
REMOTE_LabelFirstArraySz(wid) = 0L;

View File

@ -145,6 +145,7 @@ static void RestoreWorker(int wid USES_REGS) {
#ifdef THREADS
#endif /* THREADS */

File diff suppressed because it is too large Load Diff

View File

@ -38,8 +38,8 @@ typedef enum {
#define low_level_trace(Port, pred, args) low_level_trace__(Port, pred, args)
#endif
void low_level_trace__(yap_low_level_port, PredEntry *, CELL *);
void Yap_InitLowLevelTrace(void);
void toggle_low_level_trace(void);
extern bool low_level_trace__(yap_low_level_port, PredEntry *, CELL *);
extern void Yap_InitLowLevelTrace(void);
extern void toggle_low_level_trace(void);
#endif

View File

@ -1,7 +1,7 @@
#include "Yap.h"
#include "amijit.h"
#include "clause.h"
#include "eval.h"
#include "YapEval.h"
#if HAVE_ERRNO_H
#include <errno.h>
#else

View File

@ -76,16 +76,17 @@ endif (WITH_YAPOR_SBA)
if (WITH_YAPOR)
set_property(DIRECTORY .. APPEND PROPERTY COMPILE_DEFINITIONS YAPOR=1)
set_property(DIRECTORY .. APPEND PROPERTY COMPILE_DEFINITIONS YAPOR=1;YAP_KERNEL=1)
endif ()
set (POSITION_INDEPENDENT_CODE TRUE)
SET_PROPERTY(DIRECTORY PROPERTY COMPILE_DEFINITIONS YAP_KERNEL=1 )
add_component (libOPTYap
${OPTYap_SOURCES} )
MY_set_target_properties(libOPTYap
My_set_target_properties(libOPTYap
PROPERTIES
# RPATH ${libdir} VERSION ${LIBYAPTAI_FULL_VERSION}
# SOVERSION ${LIBYAPTAI_MAJOR_VERSION}.${LIBYAPTAI_MINOR_VERSION}

View File

@ -170,7 +170,7 @@ struct page_statistics {
#define INCREMENT_AUX_STATS(STATS, BYTES, PAGES) \
BYTES += PgEnt_bytes_in_use(STATS)
#define SHOW_PAGE_STATS_MSG(STR_NAME) \
" %s %10" Int_F "s bytes (%ld structs in use)\n", STR_NAME
" %s %10" Int_F "s bytes (%" Sizet_F " ; structs in use)\n", STR_NAME
#define SHOW_PAGE_STATS_ARGS(STATS, STR_TYPE) \
PgEnt_strs_in_use(STATS) * sizeof(STR_TYPE), PgEnt_strs_in_use(STATS)
#endif /* USE_PAGES_MALLOC */

View File

@ -19,7 +19,7 @@
#ifdef TABLING
#include "Yatom.h"
#include "YapHeap.h"
#include "eval.h"
#include "YapEval.h"
#include "tab.macros.h"
static inline sg_node_ptr

View File

@ -38,6 +38,8 @@ ENDIF(WITH_CPLINT)
#must be last
add_subDIRECTORY (packages/python)
OPTION (WITH_SWIG " Enable SWIG interfaces to foreign languages" ON)
IF (WITH_SWIG)
add_subDIRECTORY (packages/swig)
@ -67,7 +69,6 @@ endif()
add_subDIRECTORY (packages/real)
add_subDIRECTORY (packages/python)
add_subDIRECTORY (packages/jpl)

View File

@ -167,13 +167,13 @@ HEADERS = \
H/attvar.h \
H/blobs.h \
H/clause.h \
H/compile.h \
H/YapCöompile.h \
H/corout.h \
H/dlmalloc.h \
H/dglobals.h \
H/dlocals.h \
H/dhstruct.h \
H/eval.h \
H/YapEval.h \
H/heapgc.h \
H/hglobals.h \
H/hlocals.h \

View File

@ -145,30 +145,30 @@ endif (HAVE_LIBDL)
if (WIN32)
check_library_exists(comdlg32 FindText "" HAVE_LIBCOMDLG32)
if (HAVE_LIBCOMDLG32)
#if (HAVE_LIBCOMDLG32)
set(EXTRALIBS ${EXTRALIBS} comdlg32)
endif (HAVE_LIBCOMDLG32)
set(WINDLLS ${WINDLLS} comdlg32)
#endif (HAVE_LIBCOMDLG32)
check_library_exists(msvcrt strtok "" HAVE_LIBMSCRT)
if (HAVE_LIBMSCRT)
set(EXTRALIBS ${EXTRALIBS} mscrt)
endif (HAVE_LIBMSCRT)
#if (HAVE_LIBMSCRT)
set(WINDLLS ${WINDLLS} mscrt)
#endif (HAVE_LIBMSCRT)
check_library_exists(shell32 main "" HAVE_LIBSHELL32)
if (HAVE_LIBSHELL32)
set(EXTRALIBS ${EXTRALIBS} shell32)
endif (HAVE_LIBSHELL32)
#if (HAVE_LIBSHELL32)
set(WINDLLS ${WINDLLS} shell32)
#endif (HAVE_LIBSHELL32)
check_library_exists(wsock32 main "" HAVE_LIBWSOCK32)
if (HAVE_LIBWSOCK32)
set(EXTRALIBS ${EXTRALIBS} wsock32)
endif (HAVE_LIBWSOCK32)
#if (HAVE_LIBWSOCK32)
set(WINDLLS ${WINDLLS} wsock32)
#endif (HAVE_LIBWSOCK32)
check_library_exists(ws2_32 main "" HAVE_LIBWS2_32)
if (HAVE_LIBWS2_32)
set(EXTRALIBS ${EXTRALIBS} ws2_32)
endif (HAVE_LIBWS2_32)
#if (HAVE_LIBWS2_32 OR TRUE)
set(WINDLLS ${WINDLLS} ws2_32)
#endif (HAVE_LIBWS2_32)
endif ()
check_library_exists(judy Judy1Set "" HAVE_LIBJUDY)

View File

@ -17,6 +17,7 @@ site_name( YAP_SITE )
if (WIN32)
set (YAP_ARCH $ENV{PROCESSOR_ARCHITECTURE})
set_property( DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS "MS_WIN64=1" )
set(YAP_SYSTEM_OPTIONS "windows " ${YAP_SYSTEM_OPTIONS})
endif()
if (UNIX)

View File

@ -138,11 +138,11 @@ endif()
set ( includedir "${prefix}/include")
set ( exec_prefix "${prefix}")
set ( libdir "${exec_prefix}/lib")
set ( dlls "${exec_prefix}/lib/Yap")
set ( datadir "${datarootdir}")
set ( mandir "${datarootdir}/man")
set ( bindir "${exec_prefix}/bin")
set ( docdir "${datarootdir}/doc/Yap")
set ( dlls "${exec_prefix}/lib/Yap")
set(YAP_ROOTDIR ${prefix})
@ -164,4 +164,3 @@ set(YAP_ROOTDIR "${prefix}")
include (cudd NO-POLICY-SCOPE)
include (python NO-POLICY-SCOPE)
include (java NO-POLICY-SCOPE)

View File

@ -124,13 +124,13 @@ list(APPEND LIBYAP_SOURCES ${C_INTERFACE_SOURCES} ${ENGINE_SOURCES})
H/attvar.h
H/blobs.h
H/clause.h
H/compile.h
H/YapCompile.h
H/corout.h
H/dlmalloc.h
H/generated/dglobals.h
H/generated/dlocals.h
H/generated/dhstruct.h
H/eval.h
H/YapEval.h
H/heapgc.h
H/generated/hglobals.h
H/generated/hlocals.h

View File

@ -2,39 +2,72 @@
option (WITH_PYTHON
"Allow Python->YAP and YAP->Python" ON)
# PYTHONLIBS_FOUND - have the Python libs been found
# PYTHON_LIBRARIES - path to the python library
# PYTHON_INCLUDE_PATH - path to where Python.h is found (deprecated)
# PYTHON_INCLUDE_DIRS - path to where Python.h is found
# PYTHON_DEBUG_LIBRARIES - path to the debug library (deprecated)
# PYTHONLIBS_VERSION_STRING - version of the Python libs found (since CMake 2.8.8)
#
#
IF (WITH_PYTHON)
#BREW install for Python3
if (APPLE)
foreach (i 3.6 3.5 3.4 3.3 3.2 3.1 3.0)
set (PYTHON_INCLUDE_DIRS /usr/local/Frameworks/Python.framework/Versions/${i}/Headers)
message("Trying Python ${i}")
if (EXISTS ${PYTHON_INCLUDE_DIRS})
set (PYTHON_EXECUTABLE /usr/local/bin/python${i} CACHE FILEPATH "Path to a program" FORCE )
set (PYTHON_INCLUDE_DIR /usr/local/Frameworks/Python.framework/Versions/${i}/include/python${i}m
CACHE PATH "Path to a file." FORCE )
set (PYTHON_LIBRARY /usr/local/Frameworks/Python.framework/Versions/${i}/lib/libpython${i}.dylib
CACHE FILEPATH "Path to a library" FORCE )
break()
endif()
endforeach()
else()
set (Python_ADDITIONAL_VERSIONS 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.8 2.6 2.5)
endif()
set (Python_ADDITIONAL_VERSIONS 3.5 3.6 3.4 3.3)
find_package(PythonInterp)
# find_package(PythonLibs)
execute_process ( COMMAND ${PYTHON_EXECUTABLE} -c "import sysconfig; print( sysconfig.get_path( 'include' ) )"
OUTPUT_VARIABLE _ABS_PYTHON_INCLUDE_PATH
OUTPUT_STRIP_TRAILING_WHITESPACE )
get_filename_component ( ABS_PYTHON_INCLUDE_PATH ${_ABS_PYTHON_INCLUDE_PATH} ABSOLUTE )
set ( PYTHON_INCLUDE_DIR
${ABS_PYTHON_INCLUDE_PATH}
CACHE "PATH" "Directory with Python.h "
)
set ( PYTHON_INCLUDE_DIRS
${ABS_PYTHON_INCLUDE_PATH}
CACHE "PATH" "Python.h Dir (Deprecated)"
)
execute_process ( COMMAND ${PYTHON_EXECUTABLE} -c "import sysconfig; print( sysconfig.get_path( 'stdlib' ) )"
OUTPUT_VARIABLE _ABS_PYTHON_SYSLIB_PATH
OUTPUT_STRIP_TRAILING_WHITESPACE )
set( _ABS_PYTHON_SYSLIB_PATH
${_ABS_PYTHON_SYSLIB_PATH}/../${CMAKE_SHARED_LIBRARY_PREFIX}python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}m${CMAKE_SHARED_LIBRARY_SUFFIX} )
message("${_ABS_PYTHON_SYSLIB_PATH}")
get_filename_component ( ABS_PYTHON_SYSLIB_PATH ${_ABS_PYTHON_SYSLIB_PATH} ABSOLUTE )
set ( PYTHON_LIBRARY
${ABS_PYTHON_SYSLIB_PATH}
CACHE "FILEPATH" "Python Library"
)
set ( PYTHON_LIBRARIES
${PYTHON_LIBRARY}
CACHE "FILEPATH" "Python Library (Deprecated)"
)
if ( (EXISTS PYTHON_LIBRARY) AND ( EXISTS ${PYTHON_INCLUDE_DIR}) )
set ( PYTHONLIBS_FOUND ON)
else()
find_package(PythonLibs)
endif()
macro_log_feature (PYTHONLIBS_FOUND "Python"
"Use Python System"
"http://www.python.org" FALSE)
#include_directories( ${PYTHON_INCLUDE_DIRS} )
set( CMAKE_REQUIRED_INCLUDES ${PYTHON_INCLUDE_DIRS} ${CMAKE_REQUIRED_INCLUDES} )
include_directories( BEFORE ${PYTHON_INCLUDE_DIR} )
LIST( APPEND
CMAKE_REQUIRED_INCLUDES ${PYTHON_INCLUDE_DIR} ${CMAKE_REQUIRED_INCLUDES} )
check_include_file(Python.h HAVE_PYTHON_H)
endif(WITH_PYTHON)
endif(WITH_PYTHON)

View File

@ -2036,5 +2036,30 @@ calls it, or to nothing if 'inline' is not supported under any name. */
#define free(pt) my_free(pt)
#endif
#ifdef _WIN32
#ifndef __WINDOWS__
#define __WINDOWS__ 1
#endif
#endif
/**
* X_API macro
*
* @brief Linux exports all symbols by default, but WIN32 does
* not. cmake can enable exports, using CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS
*
* @param _WIN32
*
* @return
*/
#if _WIN32 && !defined(YAP_KERNEL)
#define X_API __declspec(dllimport)
#else
#define X_API
#endif
#define O_API
#endif

15
configure vendored
View File

@ -28,13 +28,14 @@ BUILD_TYPE="Debug"
PREFIX=/usr/local
LIBDIR=
CMAKE_ARGS=
GENERATOR=""
if [ -e "${TOP_SRCDIR}/.configure-custom.sh" ]; then
. "${TOP_SRCDIR}/.configure-custom.sh"
fi
quote() {
echo "$1" | sed -e "s|'|'\\\\''|g; 1s/^/'/; \$s/\$/'/"
echo "$*" | sed -e "s|'|'\\\\''|g; 1s/^/'/; \$s/\$/'/"
}
extract_var_string() {
@ -163,6 +164,8 @@ print_help() {
--localedir=DIR locale-dependent data [DATAROOTDIR/locale]
--mandir=DIR man documentation [DATAROOTDIR/man]
--docdir=DIR documentation root [DATAROOTDIR/doc/PROJECT_NAME]
--generato=Generator Specify the tool used to send callss
EOF
first=y
@ -288,6 +291,13 @@ while [ $# != 0 ]; do
"--docdir")
CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_DOCDIR=$(quote "$2")"; shift;;
"--generator="*)
GENERATOR="$CMAKE_ARGS -G $(1#*=)";;
"-G"|"--generator")
GENERATOR="$CMAKE_ARGS -G$(quote "$2")";
shift;;
"CC="*)
CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_C_COMPILER=$(quote "${1#*=}")";;
"CXX="*)
@ -362,4 +372,5 @@ if [ "x${LDFLAGS}" != "x" ]; then
fi
CMAKE_CMD="${CMAKE} ${TOP_SRCDIR}"
${CMAKE_CMD} ${TOP_SRCDIR} -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${PREFIX} -DCMAKE_INSTALL_LIBDIR=${LIBDIR} ${CMAKE_ARGS}
${CMAKE_CMD} "${GENERATOR}" ${TOP_SRCDIR} -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${PREFIX} -DCMAKE_INSTALL_LIBDIR=${LIBDIR} ${CMAKE_ARGS}

46
gtags.conf Normal file
View File

@ -0,0 +1,46 @@
#
# Copyright (c) 1998, 1999, 2000, 2001, 2002, 2003, 2010, 2011, 2013,
# 2015, 2016
# Tama Communications Corporation
#
# This file is part of GNU GLOBAL.
#
# This file is free software; as a special exception the author gives
# unlimited permission to copy and/or distribute it, with or without
# modifications, as long as this notice is preserved.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
# *
# Configuration file for GNU GLOBAL source code tag system.
#
# Basically, GLOBAL doesn't need this file ('gtags.conf'), because it has
# default values in itsself. If you have the file as '/etc/gtags.conf' or
# "$HOME/.globalrc" in your system then GLOBAL overwrite the default values
# with the values in the file.
#
# The format is similar to termcap(5). You can specify a target with
# GTAGSLABEL environment variable. Default target is 'default'.
#
# If you want to have a common record for yourself, it is recommended to
# use the following method:
#
common:
:skip=Debug/,Release/,Threads/,mxe/,xcode/,codeblocks/,Qt/,xcode/,android/,compile_commands.json,xml/,YAPDroid/app/build/,YAPDroid/lib/build/:HTML/,HTML.pub/,tags,TAGS,ID,y.tab.c,y.tab.h,gtags.files,cscope.files,cscope.out,cscope.po.out,cscope.in.out,SCCS/,RCS/,CVS/,CVSROOT/,{arch}/,autom4te.cache/,*.orig,*.rej,*.bak,*~,#*#,*.swp,*.tmp,*_flymake.*,*_flymake:
#
# A common map for both Exuberant Ctags and Universal Ctags.
# Don't include definitions of ctagscom and ctagslib in this entry.
#
default:\
yap:native:user:
yap:\
:tc=common:\
:langmap=Prolog\:.pl.yap.ypp.P.prolog:\
:gtags_parser=Prolog\:$ctagslib:

View File

@ -18,7 +18,7 @@ extern "C" {
#endif
//=== includes ===============================================================
#ifdef _YAP_NOT_INSTALLED_
#ifdef YAP_KERNEL
#include "config.h"
#ifdef __cplusplus
@ -26,9 +26,13 @@ extern "C" {
#endif
#if USE_GMP && !defined(__cplusplus)
#if USE_GMP
#if defined(__cplusplus)
#include <gmpxx.h>
#else
#include <gmp.h>
#endif
#endif
#ifdef __cplusplus
extern "C" {
@ -36,12 +40,14 @@ extern "C" {
#include "YapInterface.h"
#else
#include <Yap/src/config.h>
#if USE_GMP
#include <gmp.h>
#endif
#if _YAP_NOT_INSTALLED_
#include <config.h>
#include <YapInterface.h>
#else
#include <Yap/pl/config.h>
#include <Yap/YapInterface.h>
#endif
#endif
#include <stdarg.h>
#include <stddef.h>
#include <wchar.h>
@ -85,35 +91,9 @@ See SWI-Prolog.h, containing the same code for an explanation on this
stuff.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
#ifndef _PL_EXPORT_DONE
#define _PL_EXPORT_DONE
#if (defined(__WINDOWS__) || defined(__CYGWIN__) || defined(__MINGW32__)) && !defined(__LCC__)
#define HAVE_DECLSPEC
#endif
#ifdef HAVE_DECLSPEC
# ifdef _YAP_NOT_INSTALLED_
#define PL_EXPORT(type) __declspec(dllexport) type
#define PL_EXPORT_DATA(type) __declspec(dllexport) type
#define install_t void
# else
# ifdef __BORLANDC__
#define PL_EXPORT(type) type _stdcall
#define PL_EXPORT_DATA(type) extern type
# else
#define PL_EXPORT(type) extern type
#define PL_EXPORT_DATA(type) __declspec(dllimport) type
# endif
#define install_t __declspec(dllexport) void
# endif
#else /*HAVE_DECLSPEC*/
#define PL_EXPORT(type) extern type
#define PL_EXPORT_DATA(type) extern type
#define install_t void
#endif /*HAVE_DECLSPEC*/
#endif /*_PL_EXPORT_DONE*/
#define PL_EXPORT(type) extern X_API type
#define PL_EXPORT_DATA(type) extern X_API type
#define install_t O_API void
/*******************************
* GCC ATTRIBUTES *
@ -403,102 +383,101 @@ PL_EXPORT(int) PL_chars_to_term(const char *chars,
#define PL_fail return FALSE /* fail */
#define PL_succeed return TRUE /* success */
extern X_API PL_agc_hook_t PL_agc_hook(PL_agc_hook_t);
extern X_API char* PL_atom_chars(atom_t);
extern X_API char* PL_atom_nchars(atom_t, size_t *);
extern X_API term_t PL_copy_term_ref(term_t);
extern X_API term_t PL_new_term_ref(void);
extern X_API term_t PL_new_term_refs(int);
extern X_API void PL_reset_term_refs(term_t);
PL_EXPORT( PL_agc_hook_t ) PL_agc_hook(PL_agc_hook_t);
PL_EXPORT( char* ) PL_atom_chars(atom_t);
PL_EXPORT( char* ) PL_atom_nchars(atom_t, size_t *);
PL_EXPORT( term_t ) PL_copy_term_ref(term_t);
PL_EXPORT( term_t ) PL_new_term_ref(void);
PL_EXPORT( term_t ) PL_new_term_refs(int);
PL_EXPORT( void ) PL_reset_term_refs(term_t);
/* begin PL_get_* functions =============================*/
extern X_API int PL_get_arg(int, term_t, term_t);
extern X_API int _PL_get_arg(int, term_t, term_t);
extern X_API int PL_get_atom(term_t, atom_t *);
extern X_API int PL_get_atom_chars(term_t, char **);
extern X_API int PL_get_atom_nchars(term_t, size_t *, char **);
extern X_API int PL_get_bool(term_t, int *);
extern X_API int PL_get_chars(term_t, char **, unsigned);
extern X_API int PL_get_nchars(term_t, size_t *, char **, unsigned);
extern X_API int PL_get_wchars(term_t, size_t *, wchar_t **, unsigned);
extern X_API int PL_get_functor(term_t, functor_t *);
extern X_API int PL_get_compound_name_arity(term_t t, atom_t *ap, int *ip);
extern X_API int PL_get_float(term_t, double *);
extern X_API int PL_get_head(term_t, term_t);
extern X_API int PL_get_int64(term_t, int64_t *);
extern X_API int PL_get_integer(term_t, int *);
extern X_API int PL_get_list(term_t, term_t, term_t);
extern X_API int PL_get_long(term_t, long *);
extern X_API int PL_get_list_chars(term_t, char **, unsigned);
extern X_API int PL_get_list_nchars(term_t, size_t *, char **, unsigned);
extern X_API int PL_get_module(term_t, module_t *);
extern X_API module_t PL_context(void);
extern X_API int PL_strip_module(term_t, module_t *, term_t);
extern X_API atom_t PL_module_name(module_t);
extern X_API module_t PL_new_module(atom_t);
extern X_API int PL_get_name_arity(term_t, atom_t *, int *);
extern X_API int PL_get_nil(term_t);
extern X_API int PL_get_pointer(term_t, void **);
extern X_API int PL_get_intptr(term_t, intptr_t *);
extern X_API int PL_get_uintptr(term_t, uintptr_t *);
extern X_API int PL_get_tail(term_t, term_t);
PL_EXPORT( int ) PL_get_arg(int, term_t, term_t);
PL_EXPORT( int ) PL_get_atom(term_t, atom_t *);
PL_EXPORT( int ) PL_get_atom_chars(term_t, char **);
PL_EXPORT( int ) PL_get_atom_nchars(term_t, size_t *, char **);
PL_EXPORT( int ) PL_get_bool(term_t, int *);
PL_EXPORT( int ) PL_get_chars(term_t, char **, unsigned);
PL_EXPORT( int ) PL_get_nchars(term_t, size_t *, char **, unsigned);
PL_EXPORT( int ) PL_get_wchars(term_t, size_t *, wchar_t **, unsigned);
PL_EXPORT( int ) PL_get_functor(term_t, functor_t *);
PL_EXPORT( int ) PL_get_compound_name_arity(term_t t, atom_t *ap, int *ip);
PL_EXPORT( int ) PL_get_float(term_t, double *);
PL_EXPORT( int ) PL_get_head(term_t, term_t);
PL_EXPORT( int ) PL_get_int64(term_t, int64_t *);
PL_EXPORT( int ) PL_get_integer(term_t, int *);
PL_EXPORT( int ) PL_get_list(term_t, term_t, term_t);
PL_EXPORT( int ) PL_get_long(term_t, long *);
PL_EXPORT( int ) PL_get_list_chars(term_t, char **, unsigned);
PL_EXPORT( int ) PL_get_list_nchars(term_t, size_t *, char **, unsigned);
PL_EXPORT( int ) PL_get_module(term_t, module_t *);
PL_EXPORT( module_t ) PL_context(void);
PL_EXPORT( int ) PL_strip_module(term_t, module_t *, term_t);
PL_EXPORT( atom_t ) PL_module_name(module_t);
PL_EXPORT( module_t ) PL_new_module(atom_t);
PL_EXPORT( int ) PL_get_name_arity(term_t, atom_t *, int *);
PL_EXPORT( int ) PL_get_nil(term_t);
PL_EXPORT( int ) PL_get_pointer(term_t, void **);
PL_EXPORT( int ) PL_get_intptr(term_t, intptr_t *);
PL_EXPORT( int ) PL_get_uintptr(term_t, uintptr_t *);
PL_EXPORT( int ) PL_get_tail(term_t, term_t);
/* end PL_get_* functions =============================*/
/* begin PL_new_* functions =============================*/
extern X_API atom_t PL_new_atom(const char *);
extern X_API atom_t PL_new_atom_nchars(size_t, const char *);
extern X_API atom_t PL_new_atom_wchars(size_t, const pl_wchar_t *);
extern X_API char *PL_atom_nchars(atom_t, size_t *);
extern X_API pl_wchar_t *PL_atom_wchars(atom_t, size_t *);
extern X_API functor_t PL_new_functor(atom_t, int);
extern X_API atom_t PL_functor_name(functor_t);
extern X_API int PL_functor_arity(functor_t);
PL_EXPORT( atom_t ) PL_new_atom(const char *);
PL_EXPORT( atom_t ) PL_new_atom_nchars(size_t, const char *);
PL_EXPORT( atom_t ) PL_new_atom_wchars(size_t, const pl_wchar_t *);
PL_EXPORT( char *) PL_atom_nchars(atom_t, size_t *);
PL_EXPORT( pl_wchar_t *) PL_atom_wchars(atom_t, size_t *);
PL_EXPORT( functor_t ) PL_new_functor(atom_t, int);
PL_EXPORT( atom_t ) PL_functor_name(functor_t);
PL_EXPORT( int ) PL_functor_arity(functor_t);
/* end PL_new_* functions =============================*/
/* begin PL_put_* functions =============================*/
extern X_API int PL_cons_functor(term_t, functor_t,...);
extern X_API int PL_cons_functor_v(term_t, functor_t,term_t);
extern X_API int PL_cons_list(term_t, term_t, term_t);
extern X_API int PL_put_atom(term_t, atom_t);
extern X_API int PL_put_atom_chars(term_t, const char *);
extern X_API int PL_put_atom_nchars(term_t, size_t ,const char *);
extern X_API int PL_put_boolean(term_t, uintptr_t);
extern X_API int PL_put_float(term_t, double);
extern X_API int PL_put_functor(term_t, functor_t t);
extern X_API int PL_put_int64(term_t, int64_t);
extern X_API int PL_put_integer(term_t, long);
extern X_API int PL_put_list(term_t);
extern X_API int PL_put_list_chars(term_t, const char *);
extern X_API void PL_put_nil(term_t);
extern X_API int PL_put_pointer(term_t, void *);
extern X_API int PL_put_string_chars(term_t, const char *);
extern X_API int PL_put_string_nchars(term_t, size_t, const char *);
extern X_API int PL_put_term(term_t, term_t);
extern X_API int PL_put_variable(term_t);
extern X_API int PL_put_intptr(term_t t, intptr_t n);
extern X_API int PL_put_uintptr(term_t t, uintptr_t n);
extern X_API int PL_compare(term_t, term_t);
PL_EXPORT( int ) PL_cons_functor(term_t, functor_t,...);
PL_EXPORT( int ) PL_cons_functor_v(term_t, functor_t,term_t);
PL_EXPORT( int ) PL_cons_list(term_t, term_t, term_t);
PL_EXPORT( int ) PL_put_atom(term_t, atom_t);
PL_EXPORT( int ) PL_put_atom_chars(term_t, const char *);
PL_EXPORT( int ) PL_put_atom_nchars(term_t, size_t ,const char *);
PL_EXPORT( int ) PL_put_boolean(term_t, uintptr_t);
PL_EXPORT( int ) PL_put_float(term_t, double);
PL_EXPORT( int ) PL_put_functor(term_t, functor_t t);
PL_EXPORT( int ) PL_put_int64(term_t, int64_t);
PL_EXPORT( int ) PL_put_integer(term_t, long);
PL_EXPORT( int ) PL_put_list(term_t);
PL_EXPORT( int ) PL_put_list_chars(term_t, const char *);
PL_EXPORT( void ) PL_put_nil(term_t);
PL_EXPORT( int ) PL_put_pointer(term_t, void *);
PL_EXPORT( int ) PL_put_string_chars(term_t, const char *);
PL_EXPORT( int ) PL_put_string_nchars(term_t, size_t, const char *);
PL_EXPORT( int ) PL_put_term(term_t, term_t);
PL_EXPORT( int ) PL_put_variable(term_t);
PL_EXPORT( int ) PL_put_intptr(term_t t, intptr_t n);
PL_EXPORT( int ) PL_put_uintptr(term_t t, uintptr_t n);
PL_EXPORT( int ) PL_compare(term_t, term_t);
/* end PL_put_* functions =============================*/
/* begin PL_unify_* functions =============================*/
extern X_API int PL_unify(term_t, term_t);
extern X_API int PL_unify_atom(term_t, atom_t);
extern X_API int PL_unify_arg(int, term_t, term_t);
extern X_API int PL_unify_atom_chars(term_t, const char *);
extern X_API int PL_unify_atom_nchars(term_t, size_t len, const char *);
extern X_API int PL_unify_float(term_t, double);
extern X_API int PL_unify_functor(term_t, functor_t);
extern X_API int PL_unify_int64(term_t, int64_t);
extern X_API int PL_unify_intptr(term_t, intptr_t);
extern X_API int PL_unify_uintptr(term_t, uintptr_t);
extern X_API int PL_unify_integer(term_t, long);
extern X_API int PL_unify_list(term_t, term_t, term_t);
extern X_API int PL_unify_list_chars(term_t, const char *);
extern X_API int PL_unify_list_ncodes(term_t, size_t, const char *);
extern X_API int PL_unify_nil(term_t);
extern X_API int PL_unify_pointer(term_t, void *);
extern X_API int PL_unify_bool(term_t, int);
extern X_API int PL_unify_string_chars(term_t, const char *);
extern X_API int PL_unify_string_nchars(term_t, size_t, const char *);
extern X_API int PL_unify_term(term_t,...);
extern X_API int PL_unify_chars(term_t, int, size_t, const char *);
extern X_API int PL_unify_chars_diff(term_t, term_t, int, size_t, const char *);
PL_EXPORT( int ) PL_unify(term_t, term_t);
PL_EXPORT( int ) PL_unify_atom(term_t, atom_t);
PL_EXPORT( int ) PL_unify_arg(int, term_t, term_t);
PL_EXPORT( int ) PL_unify_atom_chars(term_t, const char *);
PL_EXPORT( int ) PL_unify_atom_nchars(term_t, size_t len, const char *);
PL_EXPORT( int ) PL_unify_float(term_t, double);
PL_EXPORT( int ) PL_unify_functor(term_t, functor_t);
PL_EXPORT( int ) PL_unify_int64(term_t, int64_t);
PL_EXPORT( int ) PL_unify_intptr(term_t, intptr_t);
PL_EXPORT( int ) PL_unify_uintptr(term_t, uintptr_t);
PL_EXPORT( int ) PL_unify_integer(term_t, long);
PL_EXPORT( int ) PL_unify_list(term_t, term_t, term_t);
PL_EXPORT( int ) PL_unify_list_chars(term_t, const char *);
PL_EXPORT( int ) PL_unify_list_ncodes(term_t, size_t, const char *);
PL_EXPORT( int ) PL_unify_nil(term_t);
PL_EXPORT( int ) PL_unify_pointer(term_t, void *);
PL_EXPORT( int ) PL_unify_bool(term_t, int);
PL_EXPORT( int ) PL_unify_string_chars(term_t, const char *);
PL_EXPORT( int ) PL_unify_string_nchars(term_t, size_t, const char *);
PL_EXPORT( int ) PL_unify_term(term_t,...);
PL_EXPORT( int ) PL_unify_chars(term_t, int, size_t, const char *);
PL_EXPORT( int ) PL_unify_chars_diff(term_t, term_t, int, size_t, const char *);
/*******************************
* LISTS *
*******************************/
@ -506,92 +485,92 @@ extern X_API int PL_unify_chars_diff(term_t, term_t, int, size_t, const char *)
PL_EXPORT(int) PL_skip_list(term_t list, term_t tail, size_t *len);
extern X_API int PL_unify_wchars(term_t, int, size_t, const pl_wchar_t *);
extern X_API int PL_unify_wchars_diff(term_t, term_t, int, size_t, const pl_wchar_t *);
extern X_API int PL_chars_to_term(const char *,term_t);
PL_EXPORT( int ) PL_unify_wchars(term_t, int, size_t, const pl_wchar_t *);
PL_EXPORT( int ) PL_unify_wchars_diff(term_t, term_t, int, size_t, const pl_wchar_t *);
PL_EXPORT( int ) PL_chars_to_term(const char *,term_t);
/* begin PL_is_* functions =============================*/
extern X_API int PL_is_atom(term_t);
extern X_API int PL_is_atomic(term_t);
extern X_API int PL_is_compound(term_t);
extern X_API int PL_is_float(term_t);
extern X_API int PL_is_functor(term_t, functor_t);
extern X_API int PL_is_ground(term_t);
extern X_API int PL_is_callable(term_t);
extern X_API int PL_is_integer(term_t);
extern X_API int PL_is_pair(term_t);
extern X_API int PL_is_list(term_t);
extern X_API int PL_is_pair(term_t);
extern X_API int PL_is_number(term_t);
extern X_API int PL_is_string(term_t);
extern X_API int PL_is_variable(term_t);
extern X_API int PL_term_type(term_t);
extern X_API int PL_is_inf(term_t);
extern X_API int PL_is_acyclic(term_t t);
PL_EXPORT( int ) PL_is_atom(term_t);
PL_EXPORT( int ) PL_is_atomic(term_t);
PL_EXPORT( int ) PL_is_compound(term_t);
PL_EXPORT( int ) PL_is_float(term_t);
PL_EXPORT( int ) PL_is_functor(term_t, functor_t);
PL_EXPORT( int ) PL_is_ground(term_t);
PL_EXPORT( int ) PL_is_callable(term_t);
PL_EXPORT( int ) PL_is_integer(term_t);
PL_EXPORT( int ) PL_is_pair(term_t);
PL_EXPORT( int ) PL_is_list(term_t);
PL_EXPORT( int ) PL_is_pair(term_t);
PL_EXPORT( int ) PL_is_number(term_t);
PL_EXPORT( int ) PL_is_string(term_t);
PL_EXPORT( int ) PL_is_variable(term_t);
PL_EXPORT( int ) PL_term_type(term_t);
PL_EXPORT( int ) PL_is_inf(term_t);
PL_EXPORT( int ) PL_is_acyclic(term_t t);
/* end PL_is_* functions =============================*/
extern X_API void PL_halt(int);
extern X_API int PL_initialise(int, char **);
extern X_API int PL_is_initialised(int *, char ***);
extern X_API void PL_close_foreign_frame(fid_t);
extern X_API void PL_discard_foreign_frame(fid_t);
extern X_API void PL_rewind_foreign_frame(fid_t);
extern X_API fid_t PL_open_foreign_frame(void);
extern X_API int PL_raise_exception(term_t);
extern X_API int PL_throw(term_t);
extern X_API void PL_clear_exception(void);
extern X_API void PL_register_atom(atom_t);
extern X_API void PL_unregister_atom(atom_t);
extern X_API predicate_t PL_pred(functor_t, module_t);
extern X_API predicate_t PL_predicate(const char *, int, const char *);
PL_EXPORT( void ) PL_halt(int);
PL_EXPORT( int ) PL_initialise(int, char **);
PL_EXPORT( int ) PL_is_initialised(int *, char ***);
PL_EXPORT( void ) PL_close_foreign_frame(fid_t);
PL_EXPORT( void ) PL_discard_foreign_frame(fid_t);
PL_EXPORT( void ) PL_rewind_foreign_frame(fid_t);
PL_EXPORT( fid_t ) PL_open_foreign_frame(void);
PL_EXPORT( int ) PL_raise_exception(term_t);
PL_EXPORT( int ) PL_throw(term_t);
PL_EXPORT( void ) PL_clear_exception(void);
PL_EXPORT( void ) PL_register_atom(atom_t);
PL_EXPORT( void ) PL_unregister_atom(atom_t);
PL_EXPORT( predicate_t ) PL_pred(functor_t, module_t);
PL_EXPORT( predicate_t ) PL_predicate(const char *, int, const char *);
#define GP_NAMEARITY 0x100 /* or'ed mask */
extern X_API int PL_unify_predicate(term_t head, predicate_t pred, int how);
extern X_API void PL_predicate_info(predicate_t, atom_t *, int *, module_t *);
extern X_API qid_t PL_open_query(module_t, int, predicate_t, term_t);
extern X_API int PL_next_solution(qid_t);
extern X_API void PL_cut_query(qid_t);
extern X_API void PL_close_query(qid_t);
extern X_API int PL_toplevel(void);
extern X_API term_t PL_exception(qid_t);
extern X_API term_t PL_exception(qid_t);
extern X_API int PL_call_predicate(module_t, int, predicate_t, term_t);
extern X_API int PL_call(term_t, module_t);
extern X_API void PL_register_foreign(const char *, int, pl_function_t, int);
extern X_API void PL_register_foreign_in_module(const char *, const char *, int, pl_function_t, int);
extern X_API void PL_register_extensions(const PL_extension *);
extern X_API void PL_register_extensions_in_module(const char *module, const PL_extension *);
extern X_API void PL_load_extensions(const PL_extension *);
extern X_API int PL_handle_signals(void);
extern X_API int PL_thread_self(void);
extern X_API int PL_unify_thread_id(term_t, int);
extern X_API int PL_thread_attach_engine(const PL_thread_attr_t *);
extern X_API int PL_thread_destroy_engine(void);
extern X_API int PL_thread_at_exit(void (*)(void *), void *, int);
extern X_API int PL_thread_raise(int tid, int sig);
extern X_API PL_engine_t PL_create_engine(const PL_thread_attr_t *);
extern X_API int PL_destroy_engine(PL_engine_t);
extern X_API int PL_set_engine(PL_engine_t,PL_engine_t *);
extern X_API int PL_get_string(term_t, char **, size_t *);
extern X_API int PL_get_string_chars(term_t, char **, size_t *);
extern X_API record_t PL_record(term_t);
extern X_API int PL_recorded(record_t, term_t);
extern X_API record_t PL_duplicate_record(record_t);
extern X_API void PL_erase(record_t);
PL_EXPORT( int ) PL_unify_predicate(term_t head, predicate_t pred, int how);
PL_EXPORT( void ) PL_predicate_info(predicate_t, atom_t *, int *, module_t *);
PL_EXPORT( qid_t ) PL_open_query(module_t, int, predicate_t, term_t);
PL_EXPORT( int ) PL_next_solution(qid_t);
PL_EXPORT( void ) PL_cut_query(qid_t);
PL_EXPORT( void ) PL_close_query(qid_t);
PL_EXPORT( int ) PL_toplevel(void);
PL_EXPORT( term_t ) PL_exception(qid_t);
PL_EXPORT( term_t ) PL_exception(qid_t);
PL_EXPORT( int ) PL_call_predicate(module_t, int, predicate_t, term_t);
PL_EXPORT( int ) PL_call(term_t, module_t);
PL_EXPORT( void ) PL_register_foreign(const char *, int, pl_function_t, int);
PL_EXPORT( void ) PL_register_foreign_in_module(const char *, const char *, int, pl_function_t, int);
PL_EXPORT( void ) PL_register_extensions(const PL_extension *);
PL_EXPORT( void ) PL_register_extensions_in_module(const char *module, const PL_extension *);
PL_EXPORT( void ) PL_load_extensions(const PL_extension *);
PL_EXPORT( int ) PL_handle_signals(void);
PL_EXPORT( int ) PL_thread_self(void);
PL_EXPORT( int ) PL_unify_thread_id(term_t, int);
PL_EXPORT( int ) PL_thread_attach_engine(const PL_thread_attr_t *);
PL_EXPORT( int ) PL_thread_destroy_engine(void);
PL_EXPORT( int ) PL_thread_at_exit(void (*)(void *), void *, int);
PL_EXPORT( int ) PL_thread_raise(int tid, int sig);
PL_EXPORT( PL_engine_t ) PL_create_engine(const PL_thread_attr_t *);
PL_EXPORT( int ) PL_destroy_engine(PL_engine_t);
PL_EXPORT( int ) PL_set_engine(PL_engine_t,PL_engine_t *);
PL_EXPORT( int ) PL_get_string(term_t, char **, size_t *);
PL_EXPORT( int ) PL_get_string_chars(term_t, char **, size_t *);
PL_EXPORT( record_t ) PL_record(term_t);
PL_EXPORT( int ) PL_recorded(record_t, term_t);
PL_EXPORT( record_t ) PL_duplicate_record(record_t);
PL_EXPORT( void ) PL_erase(record_t);
/* only partial implementation, does not guarantee export between different architectures and versions of YAP */
extern X_API char *PL_record_external(term_t, size_t *);
extern X_API int PL_recorded_external(const char *, term_t);
extern X_API int PL_erase_external(char *);
extern X_API int PL_action(int,...);
extern X_API void PL_on_halt(int (*)(int, void *), void *);
extern X_API void *PL_malloc(size_t);
extern X_API void *PL_malloc_uncollectable(size_t s);
extern X_API void *PL_realloc(void*,size_t);
extern X_API void PL_free(void *);
extern X_API int PL_eval_expression_to_int64_ex(term_t t, int64_t *val);
extern X_API void PL_cleanup_fork(void);
extern X_API int PL_get_signum_ex(term_t sig, int *n);
PL_EXPORT( char *) PL_record_external(term_t, size_t *);
PL_EXPORT( int ) PL_recorded_external(const char *, term_t);
PL_EXPORT( int ) PL_erase_external(char *);
PL_EXPORT( int ) PL_action(int,...);
PL_EXPORT( void ) PL_on_halt(int (*)(int, void *), void *);
PL_EXPORT( void *) PL_malloc(size_t);
PL_EXPORT( void *) PL_malloc_uncollectable(size_t s);
PL_EXPORT( void *) PL_realloc(void*,size_t);
PL_EXPORT( void ) PL_free(void *);
PL_EXPORT( int ) PL_eval_expression_to_int64_ex(term_t t, int64_t *val);
PL_EXPORT( void ) PL_cleanup_fork(void);
PL_EXPORT( int ) PL_get_signum_ex(term_t sig, int *n);
extern X_API size_t PL_utf8_strlen(const char *s, size_t len);
PL_EXPORT( size_t ) PL_utf8_strlen(const char *s, size_t len);
extern X_API int PL_unify_list_codes(term_t l, const char *chars);
PL_EXPORT( int ) PL_unify_list_codes(term_t l, const char *chas);
@ -607,8 +586,6 @@ extern X_API void PL_fatal_error(const char *msg);
extern X_API int Sprintf(const char * fm,...);
extern X_API int Sdprintf(const char *,...);
extern X_API char *PL_prompt_string(int fd);
/*******************************
* FILENAME SUPPORT *
*******************************/

View File

@ -23,8 +23,12 @@
#ifdef _WIN32
#include <stdint.h>
typedef uintptr_t uid_t;
typedef uintptr_t gid_t;
#ifndef uid_t
#define uid_t int
#endif
#ifndef gid_t
#define gid_t int
#endif
#endif
typedef struct {

View File

@ -42,7 +42,11 @@ struct yami *Yap_Error__(const char *file, const char *function, int lineno,
yap_error_number err, YAP_Term wheret, ...);
void Yap_ThrowError__(const char *file, const char *function, int lineno,
yap_error_number err, YAP_Term wheret, ...) __attribute__ ((noreturn));
yap_error_number err, YAP_Term wheret, ...)
#ifndef MSC_VER
__attribute__ ((noreturn))
#endif
;
#define Yap_NilError(id, ...) \

61
include/YapFormat.h Normal file
View File

@ -0,0 +1,61 @@
#ifndef YAP_FORMAT
#if defined(_WIN64)
typedef int64_t Int;
typedef uint64_t UInt;
#define Int_FORMAT "%I64d"
#define UInt_FORMAT "%I64u"
#define Int_F "I64d"
#define UInt_F "I64u"
#define UXInt_F "I64xu"
#define Sizet_F "Id"
#elif defined(_WIN32)
typedef int32_t Int;
typedef uint32_t UInt;
#define Int_FORMAT "%I32d"
#define UInt_FORMAT "%I32u"
#define Int_F "I32d"
#define UInt_F "I32u"
#define UInt_FORMAT "%I32u"
#define UXInt_FORMAT "%I32xu"
#define Sizet_F "Id"
#elif defined(PRIdPTR)
#define Int_FORMAT "%" PRIdPTR
#define Int_ANYFORMAT "%" PRIuPTR
#define UInt_FORMAT "%" PRIuPTR
#define Int_F PRIdPTR
#define Int_ANYF PRIuPTR
#define UInt_F PRIuPTR
#define UXInt_F PRIxPTR
#define Sizet_F "zd"
#elif SIZEOF_LONG_INT == SIZEOF_INT_P
typedef long int Int;
typedef unsigned long int UInt;
#define Int_FORMAT "%ld"
#define UInt_FORMAT "%uld"
#define Int_F "ld"
#define UInt_F "uld"
#define UXInt_F "ulxd"
#define Sizet_F "uld"
#elif SIZEOF_INT == SIZEOF_INT_P
typedef int Int;
typedef unsigned int UInt;
#define Int_FORMAT "%l"
#define UInt_FORMAT "%ul"
#define Int_F "l"
#define UInt_F "ul"
#define UXInt_F "uld"
#define Sizet_F "ux"
#endif
#endif

View File

@ -72,50 +72,9 @@ __BEGIN_DECLS
*
* @return
*/
#if defined(_WIN32)
#if YAP_H
#define X_API __declspec(dllexport)
#else
#define X_API __declspec(dllimport)
#endif
#else
#define X_API
#endif
#ifndef Int_FORMAT
#include "YapFormat.h"
#ifdef PRIdPTR
#define Int_FORMAT "%" PRIdPTR
#elif _WIN64
#define Int_FORMAT "%I64d"
#elif _WIN32
#define Int_FORMAT "%I32d"
#else
#define Int_FORMAT "%ld"
#endif
#ifdef PRIiPTR
#define Int_ANYFORMAT "%" PRIiPTR
#elif _WIN64
#define Int_ANYFORMAT "%I64i"
#elif _WIN32
#define Int_ANYFORMAT "%I32i"
#else
#define Int_ANYFORMAT "%li"
#endif
#ifdef PRIuPTR
#define UInt_FORMAT "%" PRIuPTR
#elif _WIN64
#define UInt_FORMAT "%I64ud"
#elif _WIN32
#define UInt_FORMAT "%I32ud"
#else
#define UInt_FORMAT "%lu"
#endif
/* portable form of formatted output for Prolog terms */
#endif
/* Primitive Functions */
@ -173,6 +132,9 @@ extern X_API YAP_Bool YAP_IsDbRefTerm(YAP_Term);
/* YAP_Bool IsAtomTerm(YAP_Term) */
extern X_API YAP_Bool YAP_IsAtomTerm(YAP_Term);
/* YAP_Bool IsAtomTerm(YAP_Term) */
extern X_API YAP_Bool YAP_IsStringTerm(YAP_Term);
/* YAP_Bool IsPairTerm(YAP_Term) */
extern X_API YAP_Bool YAP_IsPairTerm(YAP_Term);
@ -185,12 +147,24 @@ extern X_API YAP_Bool YAP_IsCompoundTerm(YAP_Term);
/* Term MkIntTerm(YAP_Int) */
extern X_API YAP_Term YAP_MkIntTerm(YAP_Int);
/* Term MkIntTerm(YAP_Int) */
extern X_API YAP_Term YAP_MkStringTerm(const char *);
/* Term MkIntTerm(YAP_Int) */
extern X_API YAP_Term YAP_MkUnsignedStringTerm(const unsigned char *);
/* Term MkBigNumTerm(void *) */
extern X_API YAP_Term YAP_MkBigNumTerm(void *);
/* Term MkRationalTerm(void *) */
extern X_API YAP_Term YAP_MkRationalTerm(void *);
/* YAP_Int IntOfTerm(Term) */
extern X_API const unsigned char *YAP_UnsignedStringOfTerm(YAP_Term);
/* YAP_Int StribgOfTerm(Term) */
extern X_API const char *YAP_StringOfTerm(YAP_Term);
/* YAP_Int IntOfTerm(Term) */
extern X_API YAP_Int YAP_IntOfTerm(YAP_Term);

View File

@ -36,7 +36,9 @@ static char SccsId[] = "%W% %G%";
#define ALIASES_BLOCK_SIZE 8
#if _WIN32
#ifndef USE_SOCKET
#define USE_SOCKET 1
#endif
#define HAVE_SOCKET 1
#endif

View File

@ -17,7 +17,6 @@ string(TIMESTAMP YAP_TIMESTAMP)
string( SUBSTRING ${CMAKE_SHARED_LIBRARY_SUFFIX} 1 -1 SO_EXT )
set_property(DIRECTORY PROPERTY CXX_STANDARD 11)
# rpath stuff, hopefully it works

View File

@ -13,6 +13,8 @@ MY_set_target_properties(libswi
POSITION_INDEPENDENT_CODE ON
)
SET_PROPERTY(DIRECTORY PROPERTY COMPILE_DEFINITIONS YAP_KERNEL=1 )
include_directories (../../../H ../.../../include ../os ${CMAKE_BINARY_DIR} ${GMP_INCLUDE_DIR})
set (YAP_SWILIB $<TARGET_FILE_NAME:libswi> )

View File

@ -29,8 +29,8 @@ Moyle. All rights reserved.
#include <wchar.h>
#include <Yap.h>
#include <YapEval.h>
#include <Yatom.h>
#include <eval.h>
#include "swi.h"
#include <YapHeap.h>
@ -216,6 +216,7 @@ X_API int PL_get_nchars(term_t l, size_t *lengthp, char **s, unsigned flags) {
if (flags & BUF_MALLOC) {
out.type |= YAP_STRING_MALLOC;
out.val.c = NULL;
}
if (lengthp) {
out.type |= YAP_STRING_NCHARS;
@ -245,6 +246,7 @@ int PL_get_wchars(term_t l, size_t *lengthp, wchar_t **s, unsigned flags) {
out.type = YAP_STRING_WCHARS;
if (flags & BUF_MALLOC) {
out.type |= YAP_STRING_MALLOC;
out.val.c = NULL;
}
if (lengthp) {
out.type |= YAP_STRING_NCHARS;
@ -278,9 +280,7 @@ X_API int PL_unify_chars(term_t l, int flags, size_t length, const char *s) {
} else if (flags & PL_CHAR_LIST) {
out.type = YAP_STRING_ATOMS;
}
if (length != (size_t)-1) {
out.max = length;
}
if (!Yap_CVT_Text(&inp, &out PASS_REGS))
return 0L;
return Yap_unify(Yap_GetFromSlot(l), out.val.t);
@ -345,8 +345,7 @@ X_API term_t PL_new_term_refs(int n) {
*/
X_API void PL_reset_term_refs(term_t after) {
CACHE_REGS
term_t new = Yap_NewSlots(1);
Yap_RecoverSlots(after - new, new);
LOCAL_CurSlot = after;
}
/** @}
@ -629,9 +628,17 @@ X_API int PL_get_atom_chars(term_t ts, char **a) /* SAM check type */
{
CACHE_REGS
Term t = Yap_GetFromSlot(ts);
if (!IsAtomTerm(t))
char *src;
if (!IsAtomTerm(t)) {
return 0;
*a = RepAtom(AtomOfTerm(t))->StrOfAE;
}
src = (char *)RepAtom(AtomOfTerm(t))->StrOfAE;
if (!a)
return 0;
if (*a && *a != src)
strcpy(*a, src);
else
*a = src;
return 1;
}
@ -644,10 +651,14 @@ X_API int PL_get_atom_nchars(term_t ts, size_t *len,
{
CACHE_REGS
Term t = Yap_GetFromSlot(ts);
if (!IsAtomTerm(t))
if (!IsAtomTerm(t)) {
return 0;
*s = RepAtom(AtomOfTerm(t))->StrOfAE;
}
if (s)
*s = (char*)RepAtom(AtomOfTerm(t))->StrOfAE;
if (len) {
*len = strlen(*s);
}
return 1;
}

View File

@ -29,7 +29,7 @@
#ifdef __YAP_PROLOG__
#include "Yatom.h"
#include "pl-ctype.h"
#include "eval.h"
#include "YapEval.h"
#else
#include "os/pl-ctype.h"
#endif

View File

@ -82,6 +82,7 @@ if (MPI_C_FOUND)
install(TARGETS yap_mpi
LIBRARY DESTINATION ${dlls}
RUNTIME DESTINATION ${dlls}
ARCHIVE DESTINATION ${dlls}
)

View File

@ -78,7 +78,7 @@ extern int GLOBAL_argc;
static hashtable requests=NULL;
static hashtable broadcasts=NULL;
void init_mpi(void);
X_API void init_mpi(void);
/********************************************************************
* Time accounting
@ -1003,7 +1003,7 @@ mpi_default_buffer_size(void)
/********************************************************************
* Init
*******************************************************************/
void
X_API void
init_mpi(void) {
requests=new_hashtable(HASHSIZE);

View File

@ -17,7 +17,7 @@ if (MATLAB_FOUND)
target_link_libraries(matlab libYap $(MATLAB_LIBRARIES) )
install(TARGETS matlab
LIBRARY DESTINATION ${dlls}
RUNTIME DESTINATION ${dlls}
ARCHIVE DESTINATION ${dlls} )
endif (MATLAB_FOUND)

View File

@ -6,7 +6,8 @@ target_link_libraries(matrix libYap)
set_target_properties (matrix PROPERTIES PREFIX "")
install(TARGETS matrix
LIBRARY DESTINATION ${dlls}
RUNTIME DESTINATION ${dlls}
ARCHIVE DESTINATION ${dlls}
LIBRARY DESTINATION ${dlls}
)

View File

@ -3244,9 +3244,9 @@ is_matrix(void)
return TRUE;
}
void init_matrix( void );
X_API void init_matrix( void );
void
X_API void
init_matrix(void)
{
AtomC = YAP_LookupAtom("c");

View File

@ -22,7 +22,7 @@
#include <windows.h>
#endif
void init_random( void );
X_API void init_random( void );
static short a1 = 27314, b1 = 9213, c1 = 17773;
@ -59,7 +59,7 @@ p_getrand(void)
YAP_Unify(YAP_ARG3,YAP_MkIntTerm(c1)));
}
void
X_API void
init_random(void)
{
YAP_UserCPredicate("random", p_random, 1);

View File

@ -1,17 +1,23 @@
set ( REGEX_SOURCES
set ( REGEX_INCLUDES
cclass.h
cname.h
collate.h
utils.h
yapregex.h
engine.c
)
set ( REGEX_SOURCES
regcomp.c
regerror.c
regexec.c
regfree.c
)
INCLUDE_DIRECTORIES(BEFORE
.
)
add_library (regexp SHARED regexp.c ${REGEX_SOURCES})
target_link_libraries(regexp libYap)
@ -19,6 +25,7 @@ target_link_libraries(regexp libYap)
set_target_properties (regexp PROPERTIES PREFIX "")
install(TARGETS regexp
LIBRARY DESTINATION ${dlls}
LIBRARY DESTINATION ${libdir}
RUNTIME DESTINATION ${dlls}
ARCHIVE DESTINATION ${dlls} )

View File

@ -52,7 +52,7 @@ static char sccsid[] = "@(#)regexec.c 8.3 (Berkeley) 3/20/94";
#ifndef HAVE_REGEXEC
#include "c_interface.h"
#include "YapInterface.h"
#if HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
@ -68,8 +68,8 @@ static char sccsid[] = "@(#)regexec.c 8.3 (Berkeley) 3/20/94";
#include <limits.h>
#endif
#include "regex2.h"
#include "utils.h"
#include "regex2.h"
#include "yapregex.h"
#if used

View File

@ -1,6 +1,7 @@
/*******************************************************************************************
Copyright (C) 2004,2005,2006,2007,2008 (Nuno A. Fonseca) <nuno.fonseca@gmail.com>
Copyright (C) 2004,2005,2006,2007,2008 (Nuno A. Fonseca)
<nuno.fonseca@gmail.com>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -21,40 +22,48 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
Last rev: $Id: range_list.c,v 1.1 2008-03-26 23:05:22 nunofonseca Exp $
**************************************************************************/
#include "range_list.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "range_list.h"
/*****************************************************************************/
void set_num_bit(unsigned int number, char *storage, STATUS status);
BOOLEAN is_num_bit(unsigned int number, char *storage, STATUS status);
static void set_quadrant(RL_Node *node, short quadrant, QUADRANT_STATUS status);
static QUADRANT_STATUS quadrant_status(RL_Node *node, short quadrant);
static void quadrant_interval(RL_Tree *tree,short quadrant,NUM interval,NUM *quad_interval);
static NUM get_quadrant_node(RL_Tree* tree,NUM node,short quadrant,NUM interval);
static void quadrant_interval(RL_Tree *tree, short quadrant, NUM interval,
NUM *quad_interval);
static NUM get_quadrant_node(RL_Tree *tree, NUM node, short quadrant,
NUM interval);
static unsigned int tree_size(RL_Tree *tree, NUM node, NUM);
int get_location(RL_Tree *tree, NUM node, short quadrant, NUM interval);
long set_in(NUM number,NUM node, NUM node_num, NUM interval,NUM max,RL_Tree* tree,STATUS status);
long compact_node(RL_Tree*,NUM node,NUM next_node,NUM node_interval,NUM next_node_interval,NUM next_node_num,short quadrant,NUM max);
long set_in(NUM number, NUM node, NUM node_num, NUM interval, NUM max,
RL_Tree *tree, STATUS status);
long compact_node(RL_Tree *, NUM node, NUM next_node, NUM node_interval,
NUM next_node_interval, NUM next_node_num, short quadrant,
NUM max);
BOOLEAN in_tree(NUM number,RL_Tree *tree,NUM node,NUM node_num,NUM interval);
BOOLEAN in_tree(NUM number, RL_Tree *tree, NUM node, NUM node_num,
NUM interval);
void display_tree(RL_Tree *tree);
void idisplay_tree(RL_Tree *tree,NUM node,NUM node_num,NUM interval,NUM max);
void idisplay_tree(RL_Tree *tree, NUM node, NUM node_num, NUM interval,
NUM max);
static void display_leaf(RL_Tree *tree, NUM node, NUM node_num, NUM max);
NUM new_node(RL_Tree* tree,NUM node_father,short quadrant,NUM node_num,NUM quad_min,NUM quad_max,STATUS);
NUM new_node(RL_Tree *tree, NUM node_father, short quadrant, NUM node_num,
NUM quad_min, NUM quad_max, STATUS);
static void root_intervals(RL_Tree *tree);
NUM next_min(RL_Tree *tree,NUM node,NUM node_num,NUM interval,NUM max,NUM min);
NUM tree_minus(RL_Tree *r1,RL_Tree *r2,NUM node1,NUM node2,NUM node_num,NUM interval,NUM max);
NUM next_min(RL_Tree *tree, NUM node, NUM node_num, NUM interval, NUM max,
NUM min);
NUM tree_minus(RL_Tree *r1, RL_Tree *r2, NUM node1, NUM node2, NUM node_num,
NUM interval, NUM max);
RL_Tree *minus_rl(RL_Tree *range1, RL_Tree *range2);
void shift_right(RL_Tree *tree, const NUM idx, const long nnodes);
@ -65,25 +74,9 @@ void intersect_leafs(char *storage1,char *storage2);
//
RL_Buffer *buffer = NULL;
unsigned int active_bits[16]={
1,
3,
7,
15,
31,
63,
127,
255,
511,
1023,
2047,
4095,
8191,
16383,
32767,
65535
};
unsigned int active_bits[16] = {1, 3, 7, 15, 31, 63,
127, 255, 511, 1023, 2047, 4095,
8191, 16383, 32767, 65535};
/*****************************************************************************/
/*
@ -114,7 +107,8 @@ RL_Tree* new_rl(NUM max_size) {
// reset buffer
buf_ptr = new->root; // tree_buffer();
ALL_OUT(&buf_ptr[0]); // Initialize all numbers as being out of the range/interval
ALL_OUT(
&buf_ptr[0]); // Initialize all numbers as being out of the range/interval
buf_ptr[0].i_node.num_subnodes = 1;
new->root = buf_ptr; // pointer to the buffer
@ -175,12 +169,14 @@ RL_Tree* set_in_rl(RL_Tree* tree,NUM number,STATUS status) {
/* */
if (number > 0 && number <= tree->range_max)
set_in(number,ROOT(tree),1,ROOT_INTERVAL(tree),tree->range_max,tree,status);
set_in(number, ROOT(tree), 1, ROOT_INTERVAL(tree), tree->range_max, tree,
status);
#ifdef DEBUG
printf("Setting: %lu size=%lu\n", number, tree->size);
#endif
/*if (status==IN && !in_rl(tree,number)) {
fprintf(stderr,"Error adding %lu to tree: size=%lu max=%lu\n",number,tree->size,tree->range_max);
fprintf(stderr,"Error adding %lu to tree: size=%lu
max=%lu\n",number,tree->size,tree->range_max);
display_tree(tree);
exit(1);
}*/
@ -229,7 +225,7 @@ BOOLEAN freeze_rl(RL_Tree* range) {
* Constraint:range1->max==range2->max
*/
RL_Tree *minus_rl(RL_Tree *range1, RL_Tree *range2) {
if (range1->range_max!=range1->range_max)
if (range1->range_max != range2->range_max)
return NULL;
//!!!!tree_minus(range1,range2,ROOT(range1),ROOT(range2),1,ROOT_INTERVAL(range1),range1->range_max);
return range1;
@ -242,11 +238,13 @@ NUM rl_next_in_bigger(RL_Tree *tree,NUM min) {
if (tree == NULL) {
fprintf(stdout, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%lu\n", min);
}
return next_min(tree,ROOT(tree),1,ROOT_INTERVAL(tree),tree->range_max,min+1);
return next_min(tree, ROOT(tree), 1, ROOT_INTERVAL(tree), tree->range_max,
min + 1);
}
/* ******************************************************************************
Private Functions
****************************************************************************** */
******************************************************************************
*/
/*
static void print_nodes(RL_Tree* tree) {
RL_Node* nodes=tree->root;
@ -259,7 +257,8 @@ static void print_nodes(RL_Tree* tree) {
*/
// treeXquadrantXinterval->quadrant_minXquadrant_max
static void quadrant_interval(RL_Tree *tree,short quadrant,NUM interval,NUM *quad_interval) {
static void quadrant_interval(RL_Tree *tree, short quadrant, NUM interval,
NUM *quad_interval) {
if (IS_ROOT(tree, interval)) {
*quad_interval = tree->root_i;
@ -269,7 +268,9 @@ static void quadrant_interval(RL_Tree *tree,short quadrant,NUM interval,NUM *qua
}
// numberXtreeXinterval->quadrantXquadrant_minXquadrant_max
static void number_quadrant(NUM number,RL_Tree *tree,NUM node_interval,NUM node_num,short *quadrant,NUM *quad_min,NUM *quad_max) {
static void number_quadrant(NUM number, RL_Tree *tree, NUM node_interval,
NUM node_num, short *quadrant, NUM *quad_min,
NUM *quad_max) {
NUM tmp = node_num - 1, quad_interval;
int i;
quadrant_interval(tree, 1, node_interval, &quad_interval);
@ -278,13 +279,15 @@ static void number_quadrant(NUM number,RL_Tree *tree,NUM node_interval,NUM node_
*quad_max = tmp;
*quadrant = i;
*quad_min = tmp - quad_interval + 1;
//printf("number=%lu node num=%lu quad_interval=%lu-------> quadrant=%d quad_max=%lu\n",number,node_num,quad_interval,i,tmp);
// printf("number=%lu node num=%lu quad_interval=%lu-------> quadrant=%d
// quad_max=%lu\n",number,node_num,quad_interval,i,tmp);
}
/*
* returns the index to the quadrant "quadrant" node
*/
static NUM get_quadrant_node(RL_Tree* tree,NUM node,short quadrant,NUM interval) {
static NUM get_quadrant_node(RL_Tree *tree, NUM node, short quadrant,
NUM interval) {
int d = get_location(tree, node, quadrant, interval);
return node + d;
}
@ -299,7 +302,8 @@ void shift_right(RL_Tree *tree,const NUM idx,const long nnodes){
long n = idx + nnodes;
RL_Node *s = tree->root;
if (nnodes<=0) return;
if (nnodes <= 0)
return;
// print_nodes(tree);
while (n >= idx) {
s[n + 1].leaf = s[n].leaf;
@ -320,7 +324,8 @@ void shift_left(RL_Tree *tree,const NUM idx, const long nnodes){
// print_nodes(tree);
while (n < idx + nnodes) {
s[n].leaf = s[n + 1].leaf;
++n;;
++n;
;
}
// print_nodes(tree);
// printf("<<----------------\n");
@ -330,7 +335,8 @@ void shift_left(RL_Tree *tree,const NUM idx, const long nnodes){
*
*
*/
NUM new_node(RL_Tree* tree,NUM node_father,short quadrant,NUM father_interval,NUM quad_min,NUM quad_max,STATUS status) {
NUM new_node(RL_Tree *tree, NUM node_father, short quadrant,
NUM father_interval, NUM quad_min, NUM quad_max, STATUS status) {
// RL_Node *new,*root_node=tree->root;
NUM new_interval = +NEXT_INTERVAL(father_interval);
NUM times;
@ -341,7 +347,8 @@ NUM new_node(RL_Tree* tree,NUM node_father,short quadrant,NUM father_interval,NU
if (tree->mem_alloc != 0) {
// increase array size and shift elements right
if (REALLOC_MEM(tree)) {
//printf("new node:resizing memory: current %lu -> new %lu [%lu]\n",tree->mem_alloc,MEM_SIZE(tree),tree->size);
// printf("new node:resizing memory: current %lu -> new %lu
// [%lu]\n",tree->mem_alloc,MEM_SIZE(tree),tree->size);
ptr = (RL_Node *)realloc(tree->root, MEM_SIZE(tree));
if (ptr == NULL) {
fprintf(stderr, "Fatal error:range_list: Unable to allocate memory");
@ -365,7 +372,9 @@ NUM new_node(RL_Tree* tree,NUM node_father,short quadrant,NUM father_interval,NU
RL_Node *node_ptr = NODE(tree, new);
node_ptr->i_node.num_subnodes = 1;
for (q = 2; q <= BRANCH_FACTOR; ++q)
if ( MIN(quad_max,tree->range_max) < quad_min+NEXT_INTERVAL(new_interval)*(q-1) ) //QUADRANT_MAX_VALUE(
if (MIN(quad_max, tree->range_max) <
quad_min +
NEXT_INTERVAL(new_interval) * (q - 1)) // QUADRANT_MAX_VALUE(
set_quadrant(NODE(tree, new), q, R_IGNORE);
}
} else {
@ -376,9 +385,13 @@ NUM new_node(RL_Tree* tree,NUM node_father,short quadrant,NUM father_interval,NU
short q;
RL_Node *node_ptr = NODE(tree, new);
node_ptr->i_node.num_subnodes = 1;
node_ptr->i_node.quadrant_1=node_ptr->i_node.quadrant_2=node_ptr->i_node.quadrant_3=node_ptr->i_node.quadrant_4=R_TOTALLY_IN_INTERVAL;
node_ptr->i_node.quadrant_1 = node_ptr->i_node.quadrant_2 =
node_ptr->i_node.quadrant_3 = node_ptr->i_node.quadrant_4 =
R_TOTALLY_IN_INTERVAL;
for (q = 2; q <= BRANCH_FACTOR; ++q)
if ( MIN(quad_max,tree->range_max) < quad_min+NEXT_INTERVAL(new_interval)*(q-1) ) //QUADRANT_MAX_VALUE(
if (MIN(quad_max, tree->range_max) <
quad_min +
NEXT_INTERVAL(new_interval) * (q - 1)) // QUADRANT_MAX_VALUE(
set_quadrant(NODE(tree, new), q, R_IGNORE);
}
}
@ -396,7 +409,8 @@ int get_location(RL_Tree* tree,NUM node,short quadrant,NUM node_interval) {
NUM next_node;
NUM next_interval;
if (quadrant==1 || IS_LEAF(node_interval)) return 1;
if (quadrant == 1 || IS_LEAF(node_interval))
return 1;
//
if (LAST_LEVEL_INODE(node_interval)) {
@ -429,10 +443,12 @@ int get_location(RL_Tree* tree,NUM node,short quadrant,NUM node_interval) {
*
* number: number to insert from the interval
* node: index of current node
* node_num: number corresponding to the beginning o the interval represented by node
* node_num: number corresponding to the beginning o the interval represented by
* node
* interval: size of the interval represented in the current node
*/
long set_in(NUM number,NUM node, NUM node_num, NUM node_interval,NUM max,RL_Tree* tree,STATUS status) {
long set_in(NUM number, NUM node, NUM node_num, NUM node_interval, NUM max,
RL_Tree *tree, STATUS status) {
NUM next_node;
long ret_val = tree->size, compacted;
NUM interval = node_interval;
@ -446,7 +462,8 @@ long set_in(NUM number,NUM node, NUM node_num, NUM node_interval,NUM max,RL_Tree
return 0;
}
//
number_quadrant(number,tree,node_interval,node_num,&quadrant,&quad_min,&quad_max);
number_quadrant(number, tree, node_interval, node_num, &quadrant, &quad_min,
&quad_max);
interval = quad_max - quad_min + 1;
// select next node
switch (status) {
@ -455,8 +472,10 @@ long set_in(NUM number,NUM node, NUM node_num, NUM node_interval,NUM max,RL_Tree
if (quadrant_status(NODE(tree, node), quadrant) == R_NOT_IN_INTERVAL) {
// new node
// display_tree(tree);
next_node=new_node(tree,node,quadrant,node_interval,quad_min,quad_max,status);
}else if ( quadrant_status(NODE(tree,node),quadrant)==R_TOTALLY_IN_INTERVAL )
next_node = new_node(tree, node, quadrant, node_interval, quad_min,
quad_max, status);
} else if (quadrant_status(NODE(tree, node), quadrant) ==
R_TOTALLY_IN_INTERVAL)
return 0;
else
next_node = get_quadrant_node(tree, node, quadrant, node_interval);
@ -464,7 +483,8 @@ long set_in(NUM number,NUM node, NUM node_num, NUM node_interval,NUM max,RL_Tree
case OUT:
if (quadrant_status(NODE(tree, node), quadrant) == R_TOTALLY_IN_INTERVAL) {
// new node
next_node=new_node(tree,node,quadrant,node_interval,quad_min,quad_max,status);
next_node = new_node(tree, node, quadrant, node_interval, quad_min,
quad_max, status);
} else if (quadrant_status(NODE(tree, node), quadrant) == R_NOT_IN_INTERVAL)
return 0;
else
@ -503,10 +523,13 @@ long set_in(NUM number,NUM node, NUM node_num, NUM node_interval,NUM max,RL_Tree
return ret_val;
}
/*
* Check if can change quadrant color of node. If it changes, the node is deleted and all nodes at right in the array are shifted one position.
* Check if can change quadrant color of node. If it changes, the node is
* deleted and all nodes at right in the array are shifted one position.
*
*/
long compact_node(RL_Tree *tree,NUM node,NUM next_node,NUM node_interval,NUM next_node_interval,NUM next_node_num,short quadrant,NUM max){
long compact_node(RL_Tree *tree, NUM node, NUM next_node, NUM node_interval,
NUM next_node_interval, NUM next_node_num, short quadrant,
NUM max) {
unsigned int j;
RL_Node *node_ptr = NODE(tree, next_node); // next node pointer
@ -524,7 +547,8 @@ long compact_node(RL_Tree *tree,NUM node,NUM next_node,NUM node_interval,NUM nex
// ALL IN: part II
// The last node does not need to be all in
if (max - next_node_num + 1 <= LEAF_SIZE) {
j=ON_BITS(max-next_node_num+1); //153,154,155,156,157,.,.,.,[158 -> valor do max=200 devia ser 158
j = ON_BITS(max - next_node_num + 1); // 153,154,155,156,157,.,.,.,[158
// -> valor do max=200 devia ser 158
if (node_ptr->leaf == j) {
set_quadrant(NODE(tree, node), quadrant, R_TOTALLY_IN_INTERVAL);
return -1;
@ -547,7 +571,8 @@ long compact_node(RL_Tree *tree,NUM node,NUM next_node,NUM node_interval,NUM nex
return 0;
// ALL IN
for (j = 1; j <= BRANCH_FACTOR; ++j)
if ( quadrant_status(NODE(tree,next_node),j)!=R_IGNORE && quadrant_status(NODE(tree,next_node),j)!=R_TOTALLY_IN_INTERVAL )
if (quadrant_status(NODE(tree, next_node), j) != R_IGNORE &&
quadrant_status(NODE(tree, next_node), j) != R_TOTALLY_IN_INTERVAL)
break;
if (j > BRANCH_FACTOR) {
@ -556,7 +581,8 @@ long compact_node(RL_Tree *tree,NUM node,NUM next_node,NUM node_interval,NUM nex
}
// ALL OUT
for (j = 1; j <= BRANCH_FACTOR; ++j)
if ( quadrant_status(NODE(tree,next_node),j)!=R_IGNORE && quadrant_status(NODE(tree,next_node),j)!=R_NOT_IN_INTERVAL )
if (quadrant_status(NODE(tree, next_node), j) != R_IGNORE &&
quadrant_status(NODE(tree, next_node), j) != R_NOT_IN_INTERVAL)
break;
if (j > BRANCH_FACTOR) {
@ -578,7 +604,8 @@ static unsigned int tree_size(RL_Tree *tree,NUM node,NUM interval) {
NUM next_node;
RL_Node *node_ptr = NODE(tree, node);
if ( IS_LEAF(interval)) return 1;
if (IS_LEAF(interval))
return 1;
if (node_ptr->i_node.num_subnodes == 255) {
// compute the size of all subtrees
@ -593,8 +620,8 @@ static unsigned int tree_size(RL_Tree *tree,NUM node,NUM interval) {
// default:
}
}
}
else c=node_ptr->i_node.num_subnodes;
} else
c = node_ptr->i_node.num_subnodes;
return c;
}
/*
@ -625,7 +652,8 @@ BOOLEAN is_num_bit(unsigned int number,char *storage,STATUS status) {
/*
*
*/
static void set_quadrant(RL_Node *node,short quadrant,QUADRANT_STATUS status){
static void set_quadrant(RL_Node *node, short quadrant,
QUADRANT_STATUS status) {
switch (quadrant) {
case 1:
@ -641,7 +669,8 @@ static void set_quadrant(RL_Node *node,short quadrant,QUADRANT_STATUS status){
node->i_node.quadrant_4 = status;
break;
default:
fprintf(stderr,"ERROR: set_quadrant: invalid quadrant %d(%d)\n",quadrant,status);
fprintf(stderr, "ERROR: set_quadrant: invalid quadrant %d(%d)\n", quadrant,
status);
}
}
/*
@ -667,7 +696,8 @@ static QUADRANT_STATUS quadrant_status(RL_Node *node,short quadrant){
*
*
*/
static BOOLEAN in_leaf(NUM number,RL_Tree *tree,NUM node,NUM node_num,NUM max) {
static BOOLEAN in_leaf(NUM number, RL_Tree *tree, NUM node, NUM node_num,
NUM max) {
if (is_num_bit(number - node_num, (char *)NODE(tree, node), IN))
return TRUE;
@ -678,7 +708,8 @@ static BOOLEAN in_leaf(NUM number,RL_Tree *tree,NUM node,NUM node_num,NUM max) {
*
*
*/
BOOLEAN in_tree(NUM number,RL_Tree *tree,NUM node,NUM node_num,NUM node_interval) {
BOOLEAN in_tree(NUM number, RL_Tree *tree, NUM node, NUM node_num,
NUM node_interval) {
NUM next_node;
short quadrant;
NUM interval = node_interval;
@ -690,7 +721,8 @@ BOOLEAN in_tree(NUM number,RL_Tree *tree,NUM node,NUM node_num,NUM node_interval
// current node is a leaf
return in_leaf(number, tree, node, node_num, max);
number_quadrant(number,tree,node_interval,node_num,&quadrant,&quad_min,&quad_max);
number_quadrant(number, tree, node_interval, node_num, &quadrant, &quad_min,
&quad_max);
interval = quad_max - quad_min + 1;
node_num = quad_min;
@ -704,10 +736,11 @@ BOOLEAN in_tree(NUM number,RL_Tree *tree,NUM node,NUM node_num,NUM node_interval
return FALSE;
}
/* ************************************************************************************************* */
/* *************************************************************************************************
*/
/* I/O */
/* ************************************************************************************************* */
/* *************************************************************************************************
*/
/*
*
@ -767,7 +800,8 @@ void display_tree(RL_Tree *tree) {
*
*
*/
void idisplay_tree(RL_Tree *tree,NUM node,NUM node_num,NUM interval,NUM max) {
void idisplay_tree(RL_Tree *tree, NUM node, NUM node_num, NUM interval,
NUM max) {
NUM next_node;
short quadrant;
NUM interval2;
@ -788,7 +822,8 @@ void idisplay_tree(RL_Tree *tree,NUM node,NUM node_num,NUM interval,NUM max) {
case R_PARCIALLY_IN_INTERVAL:
next_node = get_quadrant_node(tree, node, quadrant, interval);
if (IS_LEAF(interval2))
display_leaf(tree,next_node,node_num2,MIN(quadrant_max,tree->range_max));
display_leaf(tree, next_node, node_num2,
MIN(quadrant_max, tree->range_max));
else
idisplay_tree(tree, next_node, node_num2, interval2, quadrant_max);
break;
@ -798,17 +833,20 @@ void idisplay_tree(RL_Tree *tree,NUM node,NUM node_num,NUM interval,NUM max) {
case R_IGNORE:
break;
default:
printf(",]%lu-%lu[",node_num2,MIN(tree->range_max,node_num2+interval2-1));
printf(",]%lu-%lu[", node_num2,
MIN(tree->range_max, node_num2 + interval2 - 1));
}
}
}
/* *************************************************************************************************** */
static NUM next_in_leaf(RL_Tree *tree,NUM node,NUM node_num,NUM max,NUM min) {
/* ***************************************************************************************************
*/
static NUM next_in_leaf(RL_Tree *tree, NUM node, NUM node_num, NUM max,
NUM min) {
NUM number;
number = node_num;
if ( number<min) number=min;
if (number < min)
number = min;
// fprintf(stderr,"next_in_leaf:[%lu,%lu]:min=%lu-->number=%lu\n",node_num,max,min,number);
for (; number <= max; ++number)
if (is_num_bit(number - node_num, (char *)NODE(tree, node), IN)) {
@ -823,7 +861,8 @@ static NUM next_in_leaf(RL_Tree *tree,NUM node,NUM node_num,NUM max,NUM min) {
* Find next element bigger than min
*
*/
NUM next_min(RL_Tree *tree,NUM node,NUM node_num,NUM interval,NUM max,NUM min) {
NUM next_min(RL_Tree *tree, NUM node, NUM node_num, NUM interval, NUM max,
NUM min) {
NUM next_node;
short quadrant;
NUM interval2;
@ -831,7 +870,8 @@ NUM next_min(RL_Tree *tree,NUM node,NUM node_num,NUM interval,NUM max,NUM min) {
NUM quadrant_max;
short status;
if ( min > tree->range_max ) return 0;
if (min > tree->range_max)
return 0;
if (IS_LEAF(interval))
return next_in_leaf(tree, node, node_num, MIN(max, tree->range_max), min);
@ -846,15 +886,17 @@ NUM next_min(RL_Tree *tree,NUM node,NUM node_num,NUM interval,NUM max,NUM min) {
switch (status) {
case R_PARCIALLY_IN_INTERVAL:
next_node = get_quadrant_node(tree, node, quadrant, interval);
found=next_min(tree,next_node,node_num2,interval2,quadrant_max,min);
if ( found>0) return found;
found =
next_min(tree, next_node, node_num2, interval2, quadrant_max, min);
if (found > 0)
return found;
break;
case R_TOTALLY_IN_INTERVAL:
if (min <= quadrant_max && min >= node_num2)
return min;
if ( min < node_num2 ) return node_num2;
if (min < node_num2)
return node_num2;
}
}
return 0;
}
@ -866,14 +908,16 @@ NUM next_min(RL_Tree *tree,NUM node,NUM node_num,NUM interval,NUM max,NUM min) {
void intersect_leafs(char *storage1, char *storage2) {
BITMAP_difference(*storage1, *storage1, *storage2);
storage1++; storage2++;
storage1++;
storage2++;
BITMAP_difference(*storage1, *storage1, *storage2);
}
/*
* Removes the elements in tree1 that are in tree2
*
*/
/*NUM tree_minus(RL_Tree *tree1,RL_Tree *tree2,NUM node1,NUM node2,NUM node_num,NUM interval,NUM max) {
/*NUM tree_minus(RL_Tree *tree1,RL_Tree *tree2,NUM node1,NUM node2,NUM
node_num,NUM interval,NUM max) {
NUM next_node1,next_node2;
short quadrant;
NUM interval2;
@ -895,16 +939,20 @@ void intersect_leafs(char *storage1,char *storage2) {
status2=quadrant_status(NODE(tree2,node2),quadrant);
if (status2==R_IGNORE || status2==R_NOT_IN_INTERVAL) {
// do nothing
} else if ( status2==R_TOTALLY_IN_INTERVAL && (status1==R_IGNORE || status1==R_NOT_IN_INTERVAL )) {
} else if ( status2==R_TOTALLY_IN_INTERVAL && (status1==R_IGNORE ||
status1==R_NOT_IN_INTERVAL )) {
// do nothing
} else if ( status2==R_TOTALLY_IN_INTERVAL && status1==R_TOTALLY_IN_INTERVAL ) {
} else if ( status2==R_TOTALLY_IN_INTERVAL && status1==R_TOTALLY_IN_INTERVAL
) {
// delete entire quadrant subtree in tree1
} else if ( status2==R_PARTIALLY_IN_INTERVAL && status1==R_PARTIALLY_IN_INTERVAL){
} else if ( status2==R_PARTIALLY_IN_INTERVAL &&
status1==R_PARTIALLY_IN_INTERVAL){
// call same function
next_node1=get_quadrant_node(tree1,node1,quadrant,interval);
next_node2=get_quadrant_node(tree1,node2,quadrant,interval);
tree_minus(tree1,tree2,next_node1,next_node2,node_num2,interval2,quadrant_max);
} else if ( status2==R_PARTIALLY_IN_INTERVAL && status1==R_TOTALLY_IN_INTERVAL) {
} else if ( status2==R_PARTIALLY_IN_INTERVAL &&
status1==R_TOTALLY_IN_INTERVAL) {
// foreach element of tree2, remove it in tree1
} else {
@ -925,17 +973,22 @@ void intersect_leafs(char *storage1,char *storage2) {
}
return 0;
}*/
/* *************************************************************************************************** */
/* ***************************************************************************************************
*/
// root level
static NUM norm_tree_size(NUM interval) {
NUM tmp;
NUM j=BRANCH_FACTOR;;
NUM j = BRANCH_FACTOR;
;
if ( interval<= LEAF_SIZE*BRANCH_FACTOR) return LEAF_SIZE;
if (interval <= LEAF_SIZE * BRANCH_FACTOR)
return LEAF_SIZE;
while (1) {
tmp = LEAF_SIZE * j;
if ( tmp * BRANCH_FACTOR >= interval )break;
j*=BRANCH_FACTOR;;
if (tmp * BRANCH_FACTOR >= interval)
break;
j *= BRANCH_FACTOR;
;
}
return tmp;
}
@ -953,5 +1006,3 @@ static void root_intervals(RL_Tree* tree) {
// printf("%lu---->>%lu\n",tree->range_max,tree->root_i);
}
}

View File

@ -42,6 +42,7 @@ endif()
MY_install(TARGETS sys
LIBRARY DESTINATION ${dlls}
RUNTIME DESTINATION ${dlls}
ARCHIVE DESTINATION ${dlls} )
configure_file ("sys_config.h.cmake" "sys_config.h" )

View File

@ -85,7 +85,7 @@
#include <android/log.h>
#endif
void init_sys(void);
X_API void init_sys(void);
#if defined(__MINGW32__) || _MSC_VER
static YAP_Term WinError(void) {
@ -1034,7 +1034,7 @@ static YAP_Bool error_message(void) {
return YAP_Unify(YAP_ARG2, YAP_ARG1);
#endif
}
void init_sys(void) {
X_API void init_sys(void) {
#if HAVE_MKTIME
tzset();
#endif

View File

@ -1,3 +1,4 @@
set (CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS TRUE)
set ( TRIES_SOURCES
core_tries.c
@ -13,6 +14,7 @@ set_target_properties (tries PROPERTIES PREFIX "")
install(TARGETS tries
LIBRARY DESTINATION ${dlls}
RUNTIME DESTINATION ${dlls}
ARCHIVE DESTINATION ${dlls})
@ -22,6 +24,9 @@ set ( ITRIES_SOURCES
itries.c
)
if (ANDROID OR WIN32)
add_component ( otries ${TRIES_SOURCES} )
endif()
add_library (itries SHARED ${ITRIES_SOURCES})
target_link_libraries(itries libYap)
@ -30,5 +35,6 @@ set_target_properties (itries PROPERTIES PREFIX "")
install(TARGETS itries
LIBRARY DESTINATION ${dlls}
RUNTIME DESTINATION ${dlls}
ARCHIVE DESTINATION ${dlls} )

View File

@ -843,7 +843,7 @@ int traverse_get_counter(TrNode node) {
YAP_Term generate_label(YAP_Int Index) {
char label[20];
sprintf(label,"L%ld", Index);
sprintf(label,"L%" Int_F, Index);
return YAP_MkAtomTerm(YAP_LookupAtom(label));
}
@ -1004,7 +1004,7 @@ YAP_Int core_db_trie_get_optimization_level_count(YAP_Int opt_level) {
void displaynode(TrNode node) {
if (node != NULL) {
if (IS_HASH_NODE(node))
printf("HASH n%i, b%i, p%li\n", TrHash_num_nodes((TrHash) node), TrHash_num_buckets((TrHash) node), (long) node);
printf("HASH n%i, b%i, p%p\n", TrHash_num_nodes((TrHash) node), TrHash_num_buckets((TrHash) node), node);
else if (TrNode_entry(node) == PairInitTag)
printf("PairInitTag\n");
else if (TrNode_entry(node) == PairEndTag)
@ -1012,7 +1012,7 @@ void displaynode(TrNode node) {
else if (IS_FUNCTOR_NODE(node))
printf("functor(%s)\n", YAP_AtomName(YAP_NameOfFunctor((YAP_Functor)( ~ApplTag & TrNode_entry(node)))));
else if (YAP_IsIntTerm(TrNode_entry(node)))
printf("int(%ld)\n", YAP_IntOfTerm(TrNode_entry(node)));
printf("int(%"Int_F")\n", YAP_IntOfTerm(TrNode_entry(node)));
else if (YAP_IsAtomTerm(TrNode_entry(node)))
printf("atom(%s)\n", YAP_AtomName(YAP_AtomOfTerm(TrNode_entry(node))));
else
@ -1040,7 +1040,7 @@ void displayterm(YAP_Term term) {
else if (YAP_IsApplTerm(term))
printf("functor(%s)\n", YAP_AtomName(YAP_NameOfFunctor((YAP_Functor)( ~ApplTag & term))));
else if (YAP_IsIntTerm(term))
printf("int(%ld)\n", YAP_IntOfTerm(term));
printf("int(%"Int_F")\n", YAP_IntOfTerm(term));
else if (YAP_IsAtomTerm(term))
printf("atom(%s)\n", YAP_AtomName(YAP_AtomOfTerm(term)));
else
@ -1070,7 +1070,7 @@ void display_trie_inner(TrNode node) {
void trie_display_node(TrNode node) {
if (node != NULL) {
if (IS_HASH_NODE(node))
printf("HASH(n%i, b%i, p%li), ", TrHash_num_nodes((TrHash) node), TrHash_num_buckets((TrHash) node), (long) node);
printf("HASH(n%i, b%i, p%p), ", TrHash_num_nodes((TrHash) node), TrHash_num_buckets((TrHash) node), node);
else if (TrNode_entry(node) == PairInitTag)
printf("PairInitTag, ");
else if (TrNode_entry(node) == PairEndTag)
@ -1078,7 +1078,7 @@ void trie_display_node(TrNode node) {
else if (IS_FUNCTOR_NODE(node))
printf("functor(%s), ", YAP_AtomName(YAP_NameOfFunctor((YAP_Functor)( ~ApplTag & TrNode_entry(node)))));
else if (YAP_IsIntTerm(TrNode_entry(node)))
printf("int(%ld), ", YAP_IntOfTerm(TrNode_entry(node)));
printf("int(%" Int_F"), ", YAP_IntOfTerm(TrNode_entry(node)));
else if (YAP_IsAtomTerm(TrNode_entry(node)))
printf("atom(%s), ", YAP_AtomName(YAP_AtomOfTerm(TrNode_entry(node))));
else

View File

@ -31,7 +31,7 @@ typedef struct {
/* Procedures */
/* -------------------------- */
void init_tries(void);
O_API void init_tries(void);
static YAP_Bool p_trie_open(void);
static YAP_Bool p_trie_close(void);
static YAP_Bool p_trie_close_all(void);
@ -87,7 +87,7 @@ static YAP_Bool p_print_trie(void);
/* Module Init Procedure */
/* -------------------------- */
void init_tries(void) {
O_API void init_tries(void) {
trie_init_module();
YAP_UserCPredicate("trie_open", p_trie_open, 1);
@ -955,3 +955,27 @@ static YAP_Bool p_trie_db_opt_min_prefix(void) {
return FALSE;
}
#undef min_prefix
#ifdef _WIN32
#include <windows.h>
int WINAPI win_tries(HANDLE, DWORD, LPVOID);
int WINAPI win_tries(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

View File

@ -23,13 +23,13 @@ gen_fields(Inp,Out) :-
split_unquoted(Inp," ",["A",Atom,_,_]), !,
( Atom = [C|_], code_type(C, alpha), Atom \= "Trail"
->
append(["EXTERNAL Atom Atom",Atom,"; EXTERNAL Term Term",Atom,";"], Out)
append(["X_API EXTERNAL Atom Atom",Atom,"; X_API EXTERNAL Term Term",Atom,";"], Out)
;
append(["EXTERNAL Atom Atom",Atom,";"], Out)
append(["X_API EXTERNAL Atom Atom",Atom,";"], Out)
).
gen_fields(Inp,Out) :-
split_unquoted(Inp," ",["F",Name,_,_]), !,
append(["EXTERNAL Functor Functor",Name,";\n"],Out).
append(["X_API EXTERNAL Functor Functor",Name,";\n"],Out).
gen_rcov(Inp,Out) :-
split_unquoted(Inp," ",["A",Atom,_,_]), !,

13
misc/mktags Normal file
View File

@ -0,0 +1,13 @@
# etags
/bin/rm -f TAGS
find . -name '*.c' | xargs etags -a -Q
find . -name '*.h' | xargs etags -a -Q
find . -name '*.pl' | xargs etags -a -Q -lprolog
find . -name '*.yap' | xargs etags -a -Q -lprolog
find . -name '*.cxx' | xargs etags -a -Q
find . -name '*.hh' | xargs etags -a -Q
find . -name '*.py' | xargs etags -a -Q

View File

@ -38,6 +38,8 @@ set (YAPOS_HEADERS
include_directories (../H ../include ../OPTYap . ${GMP_INCLUDE_DIR} ${PROJECT_BINARY_DIR})
SET_PROPERTY(DIRECTORY PROPERTY COMPILE_DEFINITIONS YAP_KERNEL=1 )
set (POSITION_INDEPENDENT_CODE TRUE)
add_component (libYAPOs

View File

@ -30,7 +30,7 @@ static char SccsId[] = "%W% %G%";
#include "YapHeap.h"
#include "YapText.h"
#include "Yatom.h"
#include "eval.h"
#include "YapEval.h"
#include "yapio.h"
#include <stdlib.h>
#if HAVE_STDARG_H
@ -500,13 +500,16 @@ static void reset_regs(TokEntry *tokstart, FEnv *fe) {
static Term get_variables(FEnv *fe, TokEntry *tokstart) {
CACHE_REGS
Term v;
jmp_buf j;
LOCAL_IOBotch = &j;
if (fe->vp) {
while (true) {
fe->old_H = HR;
if (setjmp(LOCAL_IOBotch) == 0) {
if (setjmp(j) == 0) {
if ((v = Yap_Variables(LOCAL_VarTable, TermNil))) {
fe->old_H = HR;
LOCAL_IOBotch = NULL;
return v;
}
} else {
@ -514,19 +517,23 @@ static Term get_variables(FEnv *fe, TokEntry *tokstart) {
}
}
}
LOCAL_IOBotch = NULL;
return 0;
}
static Term get_varnames(FEnv *fe, TokEntry *tokstart) {
CACHE_REGS
Term v;
jmp_buf j;
LOCAL_IOBotch = &j;
if (fe->np) {
while (true) {
fe->old_H = HR;
if (setjmp(LOCAL_IOBotch) == 0) {
if (setjmp(j) == 0) {
if ((v = Yap_VarNames(LOCAL_VarTable, TermNil))) {
fe->old_H = HR;
LOCAL_IOBotch = NULL;
return v;
}
} else {
@ -534,24 +541,30 @@ static Term get_varnames(FEnv *fe, TokEntry *tokstart) {
}
}
}
LOCAL_IOBotch = NULL;
return 0;
}
static Term get_singletons(FEnv *fe, TokEntry *tokstart) {
CACHE_REGS
Term v;
jmp_buf j;
LOCAL_IOBotch = &j;
if (fe->sp) {
while (TRUE) {
fe->old_H = HR;
if (setjmp(LOCAL_IOBotch) == 0) {
if ((v = Yap_Singletons(LOCAL_VarTable, TermNil)))
if (setjmp(j) == 0) {
if ((v = Yap_Singletons(LOCAL_VarTable, TermNil))) {
LOCAL_IOBotch = NULL;
return v;
}
} else {
reset_regs(tokstart, fe);
}
}
}
LOCAL_IOBotch = NULL;
return 0;
}
@ -580,18 +593,23 @@ static void warn_singletons(FEnv *fe, TokEntry *tokstart) {
static Term get_stream_position(FEnv *fe, TokEntry *tokstart) {
CACHE_REGS
Term v;
jmp_buf j;
LOCAL_IOBotch = &j;
if (fe->tp) {
while (true) {
fe->old_H = HR;
if (setjmp(LOCAL_IOBotch) == 0) {
if ((v = CurrentPositionToTerm()))
if (setjmp(j) == 0) {
if ((v = CurrentPositionToTerm())) {
LOCAL_IOBotch = NULL;
return v;
}
} else {
reset_regs(tokstart, fe);
}
}
}
LOCAL_IOBotch = NULL;
return 0;
}

129
os/time.c
View File

@ -142,18 +142,23 @@ void Yap_systime_interval(Int *now, Int *interval) {
#include <time.h>
static FILETIME StartOfTimes, last_time;
typedef union {
FILETIME f;
__int64 t;
} win64_time_t;
static FILETIME StartOfTimes_sys, last_time_sys;
static win64_time_t StartOfTimes, last_time;
static win64_time_t StartOfTimes_sys, last_time_sys;
static clock_t TimesStartOfTimes, Times_last_time;
/* store user time in this variable */
void Yap_InitTime(int wid) {
HANDLE hProcess = GetCurrentProcess();
FILETIME CreationTime, ExitTime, KernelTime, UserTime;
if (!GetProcessTimes(hProcess, &CreationTime, &ExitTime, &KernelTime,
&UserTime)) {
win64_time_t CreationTime, ExitTime, KernelTime, UserTime;
if (!GetProcessTimes(hProcess, &CreationTime.f, &ExitTime.f, &KernelTime.f,
&UserTime.f)) {
/* WIN98 */
clock_t t;
t = clock();
@ -161,125 +166,89 @@ void Yap_InitTime(int wid) {
} else {
#if THREADS
REMOTE_ThreadHandle(wid).start_of_timesp =
(struct _FILETIME *)malloc(sizeof(FILETIME));
(struct _win64_time_t *)malloc(sizeof(win64_time_t));
REMOTE_ThreadHandle(wid).last_timep =
(struct _FILETIME *)malloc(sizeof(FILETIME));
(struct _win64_time_t *)malloc(sizeof(win64_time_t));
REMOTE_ThreadHandle(wid).start_of_times_sysp =
(struct _FILETIME *)malloc(sizeof(FILETIME));
(struct _win64_time_t *)malloc(sizeof(win64_time_t));
REMOTE_ThreadHandle(wid).last_time_sysp =
(struct _FILETIME *)malloc(sizeof(FILETIME));
(*REMOTE_ThreadHandle(wid).last_timep).dwLowDateTime =
(struct _win64_time_t *)malloc(sizeof(win64_time_t));
(*REMOTE_ThreadHandle(wid).last_timep).f.dwLowDateTime =
UserTime.dwLowDateTime;
(*REMOTE_ThreadHandle(wid).last_timep).dwHighDateTime =
UserTime.dwHighDateTime;
(*REMOTE_ThreadHandle(wid).start_of_timesp).dwLowDateTime =
(*REMOTE_ThreadHandle(wid).start_of_timesp).f.dwLowDateTime =
UserTime.dwLowDateTime;
(*REMOTE_ThreadHandle(wid).start_of_timesp).dwHighDateTime =
(*REMOTE_ThreadHandle(wid).start_of_timesp).f.dwHighDateTime =
UserTime.dwHighDateTime;
(*REMOTE_ThreadHandle(wid).last_time_sysp).dwLowDateTime =
(*REMOTE_ThreadHandle(wid).last_time_sysp).f.dwLowDateTime =
KernelTime.dwLowDateTime;
(*REMOTE_ThreadHandle(wid).last_time_sysp).dwHighDateTime =
(*REMOTE_ThreadHandle(wid).last_time_sysp).f.dwHighDateTime =
KernelTime.dwHighDateTime;
(*REMOTE_ThreadHandle(wid).start_of_times_sysp).dwLowDateTime =
(*REMOTE_ThreadHandle(wid).start_of_times_sysp).f.dwLowDateTime =
KernelTime.dwLowDateTime;
(*REMOTE_ThreadHandle(wid).start_of_times_sysp).dwHighDateTime =
(*REMOTE_ThreadHandle(wid).start_of_times_sysp).f.dwHighDateTime =
KernelTime.dwHighDateTime;
#else
last_time.dwLowDateTime = UserTime.dwLowDateTime;
last_time.dwHighDateTime = UserTime.dwHighDateTime;
StartOfTimes.dwLowDateTime = UserTime.dwLowDateTime;
StartOfTimes.dwHighDateTime = UserTime.dwHighDateTime;
last_time_sys.dwLowDateTime = KernelTime.dwLowDateTime;
last_time_sys.dwHighDateTime = KernelTime.dwHighDateTime;
StartOfTimes_sys.dwLowDateTime = KernelTime.dwLowDateTime;
StartOfTimes_sys.dwHighDateTime = KernelTime.dwHighDateTime;
last_time.f.dwLowDateTime = UserTime.f.dwLowDateTime;
last_time.f.dwHighDateTime = UserTime.f.dwHighDateTime;
StartOfTimes.f.dwLowDateTime = UserTime.f.dwLowDateTime;
StartOfTimes.f.dwHighDateTime = UserTime.f.dwHighDateTime;
last_time_sys.f.dwLowDateTime = KernelTime.f.dwLowDateTime;
last_time_sys.f.dwHighDateTime = KernelTime.f.dwHighDateTime;
StartOfTimes_sys.f.dwLowDateTime = KernelTime.f.dwLowDateTime;
StartOfTimes_sys.f.dwHighDateTime = KernelTime.f.dwHighDateTime;
#endif
}
}
#ifdef __GNUC__
static unsigned long long int sub_utime(FILETIME t1, FILETIME t2) {
ULARGE_INTEGER u[2];
memcpy((void *)u, (void *)&t1, sizeof(FILETIME));
memcpy((void *)(u + 1), (void *)&t2, sizeof(FILETIME));
return u[0].QuadPart - u[1].QuadPart;
}
#endif
UInt Yap_cputime(void) {
HANDLE hProcess = GetCurrentProcess();
FILETIME CreationTime, ExitTime, KernelTime, UserTime;
if (!GetProcessTimes(hProcess, &CreationTime, &ExitTime, &KernelTime,
&UserTime)) {
win64_time_t CreationTime, ExitTime, KernelTime, UserTime;
if (!GetProcessTimes(hProcess, &CreationTime.f, & ExitTime.f, &KernelTime.f,
&UserTime.f)) {
clock_t t;
t = clock();
return (((t - TimesStartOfTimes) * 1000) / CLOCKS_PER_SEC);
} else {
#ifdef __GNUC__
unsigned long long int t = sub_utime(UserTime, StartOfTimes);
do_div(t, 10000);
return ((Int)t);
#endif
#ifdef _MSC_VER
__int64 t = *(__int64 *)&UserTime - *(__int64 *)&StartOfTimes;
__int64 t = UserTime.t - StartOfTimes.t;
return ((Int)(t / 10000));
#endif
}
}
void Yap_cputime_interval(Int *now, Int *interval) {
HANDLE hProcess = GetCurrentProcess();
FILETIME CreationTime, ExitTime, KernelTime, UserTime;
if (!GetProcessTimes(hProcess, &CreationTime, &ExitTime, &KernelTime,
&UserTime)) {
win64_time_t CreationTime, ExitTime, KernelTime, UserTime;
if (!GetProcessTimes(hProcess, &CreationTime.f, & ExitTime.f, &KernelTime.f,
&UserTime.f)) {
clock_t t;
t = clock();
*now = ((t - TimesStartOfTimes) * 1000) / CLOCKS_PER_SEC;
*interval = (t - Times_last_time) * 1000 / CLOCKS_PER_SEC;
Times_last_time = t;
} else {
#ifdef __GNUC__
unsigned long long int t1 = sub_utime(UserTime, StartOfTimes);
unsigned long long int t2 = sub_utime(UserTime, last_time);
do_div(t1, 10000);
*now = (Int)t1;
do_div(t2, 10000);
*interval = (Int)t2;
#endif
#ifdef _MSC_VER
__int64 t1 = *(__int64 *)&UserTime - *(__int64 *)&StartOfTimes;
__int64 t2 = *(__int64 *)&UserTime - *(__int64 *)&last_time;
__int64 t1 = UserTime.t - StartOfTimes.t;
__int64 t2 = UserTime.t - last_time.t;
*now = (Int)(t1 / 10000);
*interval = (Int)(t2 / 10000);
#endif
last_time.dwLowDateTime = UserTime.dwLowDateTime;
last_time.dwHighDateTime = UserTime.dwHighDateTime;
last_time.f.dwLowDateTime = UserTime.f.dwLowDateTime;
last_time.f.dwHighDateTime = UserTime.f.dwHighDateTime;
}
}
void Yap_systime_interval(Int *now, Int *interval) {
HANDLE hProcess = GetCurrentProcess();
FILETIME CreationTime, ExitTime, KernelTime, UserTime;
if (!GetProcessTimes(hProcess, &CreationTime, &ExitTime, &KernelTime,
&UserTime)) {
win64_time_t CreationTime, ExitTime, KernelTime, UserTime;
if (!GetProcessTimes(hProcess, &CreationTime.f, &ExitTime.f, &KernelTime.f,
&UserTime.f)) {
*now = *interval = 0; /* not available */
} else {
#ifdef __GNUC__
unsigned long long int t1 = sub_utime(KernelTime, StartOfTimes_sys);
unsigned long long int t2 = sub_utime(KernelTime, last_time_sys);
do_div(t1, 10000);
*now = (Int)t1;
do_div(t2, 10000);
*interval = (Int)t2;
#endif
#ifdef _MSC_VER
__int64 t1 = *(__int64 *)&KernelTime - *(__int64 *)&StartOfTimes_sys;
__int64 t2 = *(__int64 *)&KernelTime - *(__int64 *)&last_time_sys;
__int64 t1 = KernelTime.t - StartOfTimes_sys.t;
__int64 t2 = KernelTime.t - last_time_sys.t;
*now = (Int)(t1 / 10000);
*interval = (Int)(t2 / 10000);
#endif
last_time_sys.dwLowDateTime = KernelTime.dwLowDateTime;
last_time_sys.dwHighDateTime = KernelTime.dwHighDateTime;
last_time_sys.f.dwLowDateTime = KernelTime.f.dwLowDateTime;
last_time_sys.f.dwHighDateTime = KernelTime.f.dwHighDateTime;
}
}
@ -376,9 +345,9 @@ static void InitTime(int wid) {
struct timeval tp;
gettimeofday(&tp, NULL);
(*REMOTE_ThreadHandle(wid).last_timep).tv_sec =
(*REMOTE_ThreadHandle(wid).last_timep).f.tv_sec =
(*REMOTE_ThreadHandle.start_of_timesp(wid)).tv_sec = tp.tv_sec;
(*REMOTE_ThreadHandle(wid).last_timep).tv_usec =
(*REMOTE_ThreadHandle(wid).last_timep).f.tv_usec =
(*REMOTE_ThreadHandle.start_of_timesp(wid)).tv_usec = tp.tv_usec;
}

View File

@ -28,7 +28,7 @@ static char SccsId[] = "%W% %G%";
#include "Yatom.h"
#include "YapHeap.h"
#include "yapio.h"
#include "eval.h"
#include "YapEval.h"
#include "YapText.h"
#include <stdlib.h>
#if HAVE_STDARG_H

62
packages/CMakeLists.txt Normal file
View File

@ -0,0 +1,62 @@
#TODO: change macro_log_feature to check both WITH_{$name} and ${name}_FOUND
#TODO: improve FindGecode.cmake to be similar to other Find*.cmake
#CHECK: GECODE
macro_optional_find_package (Gecode ON)
macro_log_feature (GECODE_FOUND "libgecode"
"Use Generic Constraint Development Environment (GECODE) library"
"http://www.gecode.org" FALSE)
if (GECODE_FOUND)
#DEFINES:
# GECODE_INCLUDE_DIR
# GECODE_VERSION
# GECODE_LIBRARIES
#set (EXTRALIBS gecode)
string(SUBSTRING ${GECODE_VERSION} 0 1 GECODE_MAJOR )
set (GECODE_SOURCES gecode${GECODE_MAJOR}_yap.cc
gecode${GECODE_MAJOR}-common.icc
${GECODE_VERSION}/gecode_yap_cc_impl_auto_generated.icc
${GECODE_VERSION}/gecode_yap_cc_init_auto_generated.icc
${GECODE_VERSION}/gecode_yap_cc_forward_auto_generated.icc
disjunctor.icc
disjunctor.hh )
add_custom_target (gecodeyap ALL DEPENDS gecode${GECODE_MAJOR}_yap_hand_written.yap ${GECODE_VERSION}/gecode_yap_auto_generated.yap gecode_yap
) # WORKING_DIRECTORY ${CMAKE_BINARY_DIR} )
# create a startup.yss on the top directory.
add_custom_command (TARGET gecodeyap
COMMAND cat ${CMAKE_CURRENT_SOURCE_DIR}/gecode${GECODE_MAJOR}_yap_hand_written.yap ${CMAKE_CURRENT_SOURCE_DIR}/${GECODE_VERSION}/gecode_yap_auto_generated.yap > gecode.yap
VERBATIM
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
)
add_library (gecode_yap SHARED ${GECODE_SOURCES})
target_link_libraries(gecode_yap libYap ${GECODE_LIBRARIES})
set_target_properties (gecode_yap PROPERTIES PREFIX "")
include_directories (${GECODE_INCLUDE_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/${GECODE_VERSION})
install(TARGETS gecode_yap
LIBRARY DESTINATION ${dlls}
RUNTIME DESTINATION ${dlls}
ARCHIVE DESTINATION ${dlls}
)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/gecode.yap
DESTINATION ${libpl}
)
install(FILES clpfd.yap
DESTINATION ${libpl}/gecode
)
endif (GECODE_FOUND)

84
packages/Makefile.in Normal file
View File

@ -0,0 +1,84 @@
#
# default base directory for YAP installation
# (EROOT for architecture-dependent files)
#
prefix = @prefix@
exec_prefix = @exec_prefix@
ROOTDIR = $(prefix)
EROOTDIR = @exec_prefix@
abs_top_builddir = @abs_top_builddir@
#
# where the binary should be
#
BINDIR = $(EROOTDIR)/bin
#
# where YAP should look for libraries
#
LIBDIR=@libdir@
YAPLIBDIR=@libdir@/Yap
#
# where YAP should look for architecture-independent Prolog libraries
#
SHAREDIR=$(ROOTDIR)/share
#
#
CXX=@CXX@
CXXFLAGS= @SHLIB_CXXFLAGS@ $(YAP_EXTRAS) $(DEFS) -I. -I$(srcdir) -I../.. -I$(srcdir)/../../include -I$(srcdir)/../../os -I @GECODE_INCLUDES@
#
#
# You shouldn't need to change what follows.
#
INSTALL=@INSTALL@
INSTALL_DATA=@INSTALL_DATA@
INSTALL_PROGRAM=@INSTALL_PROGRAM@
SHELL=/bin/sh
RANLIB=@RANLIB@
srcdir=@srcdir@
SO=@SO@
#4.1VPATH=@srcdir@:@srcdir@/OPTYap
CWD=$(PWD)
#
OBJS=gecode_yap.o
SOBJS=gecode_yap.@SO@
GECODE_VERSION = @GECODE_VERSION@
DISJUNCTOR = -DDISJUNCTOR
GECODE_LIBS = @GECODE_EXTRALIBS@
GECODE_MAJOR = @GECODE_MAJOR@
all: $(SOBJS) gecode.yap
gecode_yap.o: \
$(srcdir)/gecode$(GECODE_MAJOR)_yap.cc \
$(srcdir)/gecode$(GECODE_MAJOR)-common.icc \
$(srcdir)/$(GECODE_VERSION)/gecode_yap_cc_impl_auto_generated.icc \
$(srcdir)/$(GECODE_VERSION)/gecode_yap_cc_init_auto_generated.icc \
$(srcdir)/$(GECODE_VERSION)/gecode_yap_cc_forward_auto_generated.icc \
$(srcdir)/disjunctor.icc \
$(srcdir)/disjunctor.hh
$(CXX) -c -I$(srcdir)/$(GECODE_VERSION) $(CXXFLAGS) $(DISJUNCTOR) -o $@ $<
@DO_SECOND_LD@gecode_yap.@SO@: gecode_yap.o
@DO_SECOND_LD@ @SHLIB_CXX_LD@ -o gecode_yap.@SO@ gecode_yap.o $(LDFLAGS) $(GECODE_LIBS) @EXTRA_LIBS_FOR_DLLS@
gecode.yap: $(srcdir)/gecode$(GECODE_MAJOR)_yap_hand_written.yap $(srcdir)/$(GECODE_VERSION)/gecode_yap_auto_generated.yap
cat $^ > $@
.PHONY: all clean install
clean:
-rm -f *.o $(SOBJS) *~ gecode.yap
distclean:
-rm -f $(SOBJS) Makefile
install: all install-examples
mkdir -p $(DESTDIR)$(YAPLIBDIR)
mkdir -p $(DESTDIR)$(SHAREDIR)/Yap
mkdir -p $(DESTDIR)$(SHAREDIR)/Yap/gecode
$(INSTALL_PROGRAM) $(SOBJS) $(DESTDIR)$(YAPLIBDIR)
$(INSTALL) gecode.yap $(DESTDIR)$(SHAREDIR)/Yap
$(INSTALL) $(srcdir)/clpfd.yap $(DESTDIR)$(SHAREDIR)/Yap/gecode
install-examples:

12
packages/README Normal file
View File

@ -0,0 +1,12 @@
Development of gecode/yap takes place in:
git@github.com:denys-duchier/yap-6.3.git
which tracks the official yap repository and is also regularly pulled into it.
see:
https://github.com/denys-duchier/yap-6.3
Enquiries/bug reports can be made either on the yap mailing list or to the
author denys.duchier /AT/ univ-orleans.fr.
What litle documentation there is can be found in file DOC.txt.

View File

@ -52,6 +52,7 @@ IF (CUDD_FOUND)
install(TARGETS cudd
LIBRARY DESTINATION ${dlls}
RUNTIME DESTINATION ${dlls}
ARCHIVE DESTINATION ${dlls}
)

View File

@ -104,6 +104,16 @@ bdd_new(T, Vars, cudd(M,X,VS,TrueVars)) :-
VS =.. [vs|TrueVars],
findall(Manager-Cudd, set_bdd(T, VS, Manager, Cudd), [M-X]).
set_bdd(T, VS, Manager, Cudd) :-
numbervars(VS,0,_),
( ground(T)
->
term_to_cudd(T,Manager,Cudd)
;
writeln(throw(error(instantiation_error,T)))
).
/** @pred bdd_from_list(? _List_, ?_Vars_, - _BddHandle_)
Convert a _List_ of logical expressions of the form above, that
@ -116,15 +126,6 @@ bdd_from_list(List, Vars, cudd(M,X,VS,TrueVars)) :-
VS =.. [vs|TrueVars],
findall(Manager-Cudd, set_bdd_from_list(List, VS, Manager, Cudd), [M-X]).
set_bdd(T, VS, Manager, Cudd) :-
numbervars(VS,0,_),
( ground(T)
->
term_to_cudd(T,Manager,Cudd)
;
writeln(throw(error(instantiation_error,T)))
).
set_bdd_from_list(T0, VS, Manager, Cudd) :-
numbervars(VS,0,_),
generate_releases(T0, Manager, T),

View File

@ -33,9 +33,10 @@ extract_vars((_-V).MapList, V.Vs) :-
extract_vars(MapList, Vs).
complex_to_andor(empty, Map, Map, 0).
complex_to_andor([endlist], Map, Map, 0) :- !.
complex_to_andor([list(Els)], Map0, MapF, Tree) :- !,
complex_to_andor(Els, Map0, MapF, Tree).
complex_to_andor([endlist|_], Map, Map, 1) :- !.
El1 == endlist, !.
complex_to_andor([El1,El2|Els], Map0, MapF, or(T1,T2)) :- !,
complex_to_and(El1, Map0, MapI, T1),
complex_to_andor([El2|Els], MapI, MapF, T2).
@ -44,8 +45,8 @@ complex_to_andor([Els], Map0, MapF, V) :-
complex_to_and(int(A1,[endlist]), Map0, MapF, V) :- !,
check(Map0, A1, V, MapF).
complex_to_and(atom(true,[endlist]), Map0, MapF, 1) :- !.
complex_to_and(atom(A1,[endlist]), Map0, MapF, V) :- !,
check(Map0, A1, V, MapF).
complex_to_and(functor(not,1,[int(A1,[endlist])]), Map0, MapF, not(V)) :- !,
check(Map0, A1, V, MapF).
complex_to_and(functor(not,1,[atom(A1,[endlist])]), Map0, MapF, not(V)) :- !,
@ -76,6 +77,7 @@ complex_to_and(functor(not,1,[int(A1,Els)|More]), Map0, MapF, or(NOTV1,O2)) :-
complex_to_and(functor(not,1,More), MapI2, MapF, O2).
complex_to_and(functor(not,1,[atom(A1,Els)|More]), Map0, MapF, or(NOTV1,O2)) :-
check(Map0, A1, V, MapI),
check(Map0, A1, V, MapF).
(Els == [endlist]
->
NOTV1 = not(V),
@ -86,17 +88,18 @@ complex_to_and(functor(not,1,[atom(A1,Els)|More]), Map0, MapF, or(NOTV1,O2)) :-
),
complex_to_and(functor(not,1,More), MapI2, MapF, O2).
tabled_complex_to_andor(empty, Map, Map, Tab, Tab, 0).
tabled_complex_to_andor(T, Map, Map, Tab, Tab, V) :-
rb_lookup(T, V, Tab), !,
increment_ref_count(V).
tabled_complex_to_andor(IN, Map0, MapF, Tab0, TabF, OUT) :-
IN = [El1,El2|Els], !,
OUT = or(0,_,T1,T2),
rb_insert(Tab0, IN, OUT, Tab1),
tabled_complex_to_and(El1, Map0, MapI, Tab1, TabI, T1),
tabled_complex_to_andor(El2.Els, MapI, MapF, TabI, TabF, T2).
tabled_complex_to_andor(IN, Map, Map, Tab, Tab, 1) :-
IN = !.
tabled_complex_to_andor([Els], Map0, MapF, Tab0, TabF, V) :-
tabled_complex_to_and(Els, Map0, MapF, Tab0, TabF, V).
rb_insert(Tab0, IN, OUT, Tab1),
tabled_complex_to_andor([El1,Dl2], Map0, MapF, Tab0, TabF, or(T1,T2)) :-
tabled_complex_to_and(El1, Map0, MapI, Tab1, TabI, T1),
tabled_complex_to_andor(El2.Els, MapI, MapF, TabI, TabF, T2).
tabled_complex_to_and(int(A1,[endlist]), Map0, MapF, Tab, Tab, V) :- !,
check(Map0, A1, V, MapF).
@ -141,5 +144,3 @@ increment_ref_count(V) :-
arg(1,V,I0),
I is I0+1,
setarg(1,V,I).

View File

@ -0,0 +1,129 @@
% Example with matrices,based on:
%
% Three jugs problem in Minzinc modelled as a shortest path problem.
%
% Problem from Taha "Introduction to Operations Research", page 245
%
% Model created by Hakan Kjellerstrand, hakank@bonetmail.com
% See also my MiniZinc page: http://www.hakank.org/minizinc
%
% VSC: had to transpose the matrix, and change the constraints....
%
:- style_check( all ).
:- use_module(library(gecode/clpfd)).
:- use_module(library(maplist)).
:- use_module(library(lists)).
main :-
problem(Z, X, InFlow, OutFlow, N),
out(Z, X, InFlow, OutFlow, N),
fail.
main.
problem(Z, X, InFlow, OutFlow, N) :-
N = 15,
Start = 1,
End = 15,
M = 999,
d( M, DD ),
D <== array[1..N,1..N] of DD, % distance
RHS <== array[1..N] of _, % requirements (right hand statement)
X <== array[1..N, 1..N] of 0..1, % the resulting matrix, 1 if connected, 0 else
OutFlow <== array[1..N] of 0..1,
InFlow <== array[1..N] of 0..1,
% objective to minimize
Z in 0..M,
Z #= sum( [I in 1..N, J in 1..N] where D[I,J]<M,
D[I,J]*X[I,J]),
% solve minimize z;
% alternative solve statements which may give faster solution
%solve :: int_search([ x[i,j] | i,j in 1..n], first_fail, indomain_min, complete) minimize z;
% solve minimize z;
minimize(Z),
% constraint
foreach(I in 1..N,
( I == Start ->
RHS[I] <== 1 ;
I == End ->
RHS[I] <== -1 ;
RHS[I] <== 0 )
),
% must be larger than 0??
foreach( [I in 1..N, J in 1..N],
( D[J,I] = M ->
X[J,I] #= 0 ;
true )
),
% outflow constraint
foreach(I in 1..N,
OutFlow[I] #= sum(J in 1..N where D[J,I]<M, X[J,I])
),
% inflow constraint
foreach(J in 1..N,
InFlow[J] #= sum(I in 1..N where D[J,I]<M, X[J,I])
),
% inflow = outflow
foreach(I in 1..N, OutFlow[I]-InFlow[I]#=RHS[I]),
% labeling
labeling( [], X).
% data
d(M, [
M, 1, M, M, M, M, M, M, 1, M, M, M, M, M, M,
M, M, 1, M, M, M, M, M, M, M, M, M, M, M, M,
M, M, M, 1, M, M, M, M, 1, M, M, M, M, M, M,
M, M, M, M, 1, M, M, M, M, M, M, M, M, M, M,
M, M, M, M, M, 1, M, M, 1, M, M, M, M, M, M,
M, M, M, M, M, M, 1, M, M, M, M, M, M, M, M,
M, M, M, M, M, M, M, 1, 1, M, M, M, M, M, M,
M, M, M, M, M, M, M, M, M, M, M, M, M, M, 1,
M, M, M, M, M, M, M, M, M, 1, M, M, M, M, M,
M, 1, M, M, M, M, M, M, M, M, 1, M, M, M, M,
M, M, M, M, M, M, M, M, M, M, M, 1, M, M, M,
M, 1, M, M, M, M, M, M, M, M, M, M, 1, M, M,
M, M, M, M, M, M, M, M, M, M, M, M, M, 1, M,
M, 1, M, M, M, M, M, M, M, M, M, M, M, M, 1,
M, M, M, M, M, M, M, M, M, M, M, M, M, M, M
]).
/*
% shows the result matrix
output [
if i = 1 /\ j = 1 then
"z: " ++ show(z) ++ "\n" ++
"inFlow: " ++ show(inFlow) ++ "\n" ++ "outFlow: " ++ show(outFlow) ++ "\n" ++
" 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5\n"
else "" endif ++
if j = 1 then show(i) ++ " : " else "" endif ++
show(x[i,j]) ++ if j = n then "\n" else " " endif
| i in 1..n, j in 1..n
];
*/
out(Cost, Ts, Ins, Out, N) :-
format('cost = ~d~n', [Cost]),
InsL <== list(Ins),
OutL <== list(Out),
format('Inputs =', []), maplist(out, InsL), nl,
format('Outputs =', []), maplist(out, OutL), nl,
format('transitions =~n', []),
foreach(I in 1..N, outl(Ts[_,I]) ).
outl( X ) :-
L <== X, % evaluate matrix notation to Prolog lists.
format(' ', []),
maplist(out, L), nl.
out(0) :- format(' .', []).
out(1) :- format(' 1', []).

View File

@ -0,0 +1,85 @@
%% -*- prolog -*-
%%=============================================================================
%% Copyright (C) 2011 by Denys Duchier
%%
%% This program is free software: you can redistribute it and/or modify it
%% under the terms of the GNU Lesser General Public License as published by the
%% Free Software Foundation, either version 3 of the License, or (at your
%% option) any later version.
%%
%% This program is distributed in the hope that it will be useful, but WITHOUT
%% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
%% FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
%% more details.
%%
%% You should have received a copy of the GNU Lesser General Public License
%% along with this program. If not, see <http://www.gnu.org/licenses/>.
%%=============================================================================
:- use_module(library(gecode/clpfd)).
:- use_module(library(maplist)).
main :- ex(Ex, People, Names, _Preferences),
photo(Ex, People, Amount ),
format( 'Example ~a: ~w~n', [Ex, Amount]),
maplist(join, People, Names, PeopleNames),
keysort( PeopleNames, SortedPeopleNames),
maplist(join, _People, SortedNames, SortedPeopleNames),
maplist(output, SortedNames ),
fail.
main.
join( Key, El, Key-El ).
output( Name ) :- format(' ~a~n', [Name]).
% 5 people want to have a photograph together, but they have preferences.
photo(Ex, People, Amount) :-
ex(Ex, People, _, Preferences),
length(People, Len),
Len0 is Len-1,
People ins 0..Len0,
all_distinct(People),
% Bools are the satisfied constraints
maplist(preference_satisfied, Preferences, Bools),
length(Preferences, PLen),
Amount in 0..PLen,
sum( Bools ) #= Amount,
% add all satisfied constraints
maximize(Amount),
labeling([], People).
%reification, use with care
preference_satisfied(X-Y, B) :-
abs(X - Y) #= 1 #<==> B.
ex(s,[Alice,Bob,Carl,Deb,Evan],
['Alice','Bob','Carl','Deb','Evan'],
[Alice-Carl,
Carl-Deb,
Deb-Alice,
Evan-Alice,
Bob-Evan,
Carl-Evan,
Deb-Evan,
Evan-Bob]).
ex(l,[Betty,Chris,Donald,Fred,Gary,Mary,Paul,Peter,Susan],
['Betty','Chris','Donald','Fred','Gary','Mary','Paul','Peter','Susan'],
[Betty-Donald,
Betty-Gary,
Betty-Peter,
Chris-Gary,
Chris-Susan,
Donald-Fred,
Donald-Gary,
Fred-Betty,
Fred-Gary,
Gary-Mary,
Gary-Betty,
Mary-Betty,
Mary-Susan,
Paul-Donald,
Paul-Peter,
Peter-Susan,
Peter-Paul]).

View File

@ -0,0 +1,49 @@
:- use_module(library(gecode/clpfd)).
:- use_module(library(maplist)).
main :-
between(1,10,N),
I is N*100,
statistics( runtime, _ ),
once( queens(I, _Queens) ),
statistics( runtime, [DT|_] ),
% findall(Queens, queens(I, Queens), Solutions ),
% length( Solutions, N),
format('~d took ~w msec to find first solution.~n', [I, DT]),
fail.
main.
queens(N, Queens) :-
length(Queens, N),
Queens ins 1..N,
all_distinct(Queens),
foldl(inc, Queens, Inc, 0, _), % [0, 1, 2, .... ]
foldl(dec, Queens, Dec, 0, _), % [0, -1, -2, ... ]
all_distinct(Inc,Queens),
all_distinct(Dec,Queens),
labeling([], Queens).
inc(_, I0, I0, I) :-
I is I0+1.
dec(_, I0, I0, I) :-
I is I0-1.
lqueens(N, Queens) :-
length(Queens, N),
Queens ins 1..N,
all_distinct(Queens),
lconstrain( Queens, 0 ),
labeling([], Queens).
lconstrain([], _).
lconstrain( [Q|Queens], I0) :-
I is I0+1,
foldl(constrain(Q, I0), Queens, I, _),
lconstrain( Queens, I).
constrain(Q, I, R, J, J1) :-
J1 is J+1,
Q + I #\= R + J,
Q - I #\= R - J.

View File

@ -0,0 +1,44 @@
%% -*- prolog -*-
%%=============================================================================
%% Copyright (C) 2011, 2013 by Denys Duchier, Vitor Santos Costa
%%
%% This program is free software: you can redistribute it and/or modify it
%% under the terms of the GNU Lesser General Public License as published by the
%% Free Software Foundation, either version 3 of the License, or (at your
%% option) any later version.
%%
%% This program is distributed in the hope that it will be useful, but WITHOUT
%% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
%% FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
%% more details.
%%
%% You should have received a copy of the GNU Lesser General Public License
%% along with this program. If not, see <http://www.gnu.org/licenses/>.
%%=============================================================================
:- use_module(library(gecode/clpfd)).
main :-
statistics( runtime, _ ),
once( send_more_money(Letters) ),
statistics( runtime, [DT|_] ),
% findall(Queens, queens(I, Queens), Solutions ),
% length( Solutions, N),
format('took ~w msec to find first solution, ~w.~n', [I, DT, Letters]),
fail.
main.
% S E N D
% + M O R E
% ---------
% M O N E Y
send_more_money(Letters) :-
[S,E,N,D,M,O,R,Y] = Letters,
Letters ins 0..9,
M #\= 0,
S #\= 0,
all_distinct(Letters),
1000*S + 100*E + 10*N + D +
1000*M + 100*O + 10*R + E #=
10000*M + 1000*O + 100*N + 10*E + Y,
labeling([], Letters).

View File

@ -0,0 +1,47 @@
%% -*- prolog -*-
%%=============================================================================
%% Copyright (C) 2011, 2013 by Denys Duchier, Vitor Santos Costa
%%
%% This program is free software: you can redistribute it and/or modify it
%% under the terms of the GNU Lesser General Public License as published by the
%% Free Software Foundation, either version 3 of the License, or (at your
%% option) any later version.
%%
%% This program is distributed in the hope that it will be useful, but WITHOUT
%% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
%% FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
%% more details.
%%
%% You should have received a copy of the GNU Lesser General Public License
%% along with this program. If not, see <http://www.gnu.org/licenses/>.
%%=============================================================================
:- use_module(library(gecode/clpfd)).
main :-
statistics( runtime, _ ),
once( send_most_money(Letters, Money) ),
statistics( runtime, [DT|_] ),
% findall(Queens, queens(I, Queens), Solutions ),
% length( Solutions, N),
format('took ~w msec to find first solution, ~w.~n', [DT, Letters:Money]),
fail.
main.
% S E N D
% + M O S T
% ---------
% M O N E Y
send_most_money(Letters, Money) :-
[S,E,N,D,M,O,T,Y] = Letters,
Letters ins 0..9,
Money in 0..99999,
M #\= 0,
S #\= 0,
all_distinct(Letters),
1000*S + 100*E + 10*N + D +
1000*M + 100*O + 10*S + T #= Money,
10000*M + 1000*O + 100*N + 10*E + Y #= Money,
maximize(Money),
labeling([], Letters).

View File

@ -0,0 +1,84 @@
:- style_check(all).
:- use_module(library(gecode/clpfd)).
:- use_module(library(maplist)).
main :-
ex(Ex, _),
sudoku(Ex, _My),
fail.
main.
sudoku( Ex, Els ) :-
problem(Ex, Els),
output(Els).
%
% gecode constraints
%
problem(Ex, Els) :-
length(Els, 81),
Els ins 1..9,
M <== matrix( Els, [dim=[9,9]] ),
% select rows
foreach( I in 0..8 , all_different(M[I,_]) ),
% select cols
foreach( J in 0..8, all_different(M[_,J]) ),
% select squares
foreach( [I,J] ins 0..2 ,
all_different(M[I*3+(0..2),J*3+(0..2)]) ),
ex(Ex, Els),
% maplist( bound, Els, Exs),
labeling( [], Els ).
% The gecode interface doesn't support wake-ups on binding constained variables, this is the closest.
%
bound(El, X) :-
( nonvar(X) -> El #= X ; true ).
%
% output using matrix library
%
output(Els) :-
M <== matrix( Els, [dim=[9,9]] ),
foreach( I in 0..2 , output(M, I) ),
output_line.
output(M, I) :-
output_line,
foreach( J in 0..2 , output_row(M, J+I*3) ).
output_row( M, Row ) :-
L <== M[Row,_],
format('| ~d ~d ~d | ~d ~d ~d | ~d ~d ~d |~n', L).
output_line :-
format(' ~|~`-t~24+~n', []).
ex( 1, [
_,6,_,1,_,4,_,5,_,
_,_,8,3,_,5,6,_,_,
2,_,_,_,_,_,_,_,1,
8,_,_,4,_,7,_,_,6,
_,_,6,_,_,_,3,_,_,
7,_,_,9,_,1,_,_,4,
5,_,_,_,_,_,_,_,2,
_,_,7,2,_,6,9,_,_,
_,4,_,5,_,8,_,7,_
] ).
ex(2, [
_,_,1,_,8,_,6,_,4,
_,3,7,6,_,_,_,_,_,
5,_,_,_,_,_,_,_,_,
_,_,_,_,_,5,_,_,_,
_,_,6,_,1,_,8,_,_,
_,_,_,4,_,_,_,_,_,
_,_,_,_,_,_,_,_,3,
_,_,_,_,_,7,5,2,_,
8,_,2,_,9,_,7,_,_
] ).

Binary file not shown.

1318
packages/clpfd.yap Normal file

File diff suppressed because it is too large Load Diff

View File

@ -147,7 +147,8 @@ IF (CUDD_FOUND)
)
install(TARGETS bddem
LIBRARY DESTINATION ${dlls}
LIBRARY DESTINATION ${libdir}
RUNTIME DESTINATION ${dlls}
ARCHIVE DESTINATION ${dlls}
)
@ -169,7 +170,8 @@ IF (CUDD_FOUND)
add_subDIRECTORY ( approx/simplecuddLPADs )
install(TARGETS cplint
LIBRARY DESTINATION ${dlls}
LIBRARY DESTINATION ${libdir}
RUNTIME DESTINATION ${dlls}
ARCHIVE DESTINATION ${dlls}
)

View File

@ -106,7 +106,7 @@ endif( THRUST_INCLUDE_DIR )
)
install(TARGETS libcuda
LIBRARY DESTINATION ${dlls}
RUNTIME DESTINATION ${dlls}
ARCHIVE DESTINATION ${dlls}
)

View File

@ -0,0 +1,80 @@
%% -*- prolog -*-
%%=============================================================================
%% Copyright (C) 2011 by Denys Duchier
%%
%% This program is free software: you can redistribute it and/or modify it
%% under the terms of the GNU Lesser General Public License as published by the
%% Free Software Foundation, either version 3 of the License, or (at your
%% option) any later version.
%%
%% This program is distributed in the hope that it will be useful, but WITHOUT
%% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
%% FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
%% more details.
%%
%% You should have received a copy of the GNU Lesser General Public License
%% along with this program. If not, see <http://www.gnu.org/licenses/>.
%%=============================================================================
:- use_module(library(gecode)).
:- use_module(library(maplist)).
% 5 people want to have a photograph together, but they have preferences.
photo(Ex, Solution,Amount) :-
db(Ex, People, Preferences),
Space := space,
length(People, Len),
Len0 is Len-1,
People := intvars(Space,Len,0,Len0),
Space += distinct(People),
% Bools are the satisfied constraints
maplist(preferences(Space, Len), Preferences, Bools),
length(Preferences, PLen),
Sum := intvar(Space,0,PLen),
Space += linear(Bools,'IRT_EQ',Sum),
% add all satisfied constraints
Space += maximize(Sum),
Space += branch(People,'INT_VAR_SIZE_MIN','INT_VAL_MIN'),
SolSpace := search(Space),
Solution := val(SolSpace,People),
Amount := val(SolSpace,Sum).
%reification, use with care
preferences(Space, Len, X-Y, B) :-
NLen is -Len,
I0 := intvar(Space, NLen, Len),
I := intvar(Space, 0, Len),
B := boolvar(Space),
Space += reify(B, 'RM_EQV', R),
Space += linear([1,-1],[X,Y],'IRT_EQ', I0),
Space += abs(I0, I),
Space += rel(I, 'IRT_EQ', 1, R).
db(s,[Alice,Bob,Carl,Deb,Evan], [Alice-Carl,
Carl-Deb,
Deb-Alice,
Evan-Alice,
Bob-Evan,
Carl-Evan,
Deb-Evan,
Evan-Bob]).
db(l,[Betty,Chris,Donald,Fred,Gary,Mary,Paul,Peter,Susan],
[Betty-Donald,
Betty-Gary,
Betty-Peter,
Chris-Gary,
Chris-Susan,
Donald-Fred,
Donald-Gary,
Fred-Betty,
Fred-Gary,
Gary-Mary,
Gary-Betty,
Mary-Betty,
Mary-Susan,
Paul-Donald,
Paul-Peter,
Peter-Susan,
Peter-Paul]).

View File

@ -0,0 +1,67 @@
%% -*- prolog -*-
%%=============================================================================
%% Copyright (C) 2011 by Denys Duchier
%%
%% This program is free software: you can redistribute it and/or modify it
%% under the terms of the GNU Lesser General Public License as published by the
%% Free Software Foundation, either version 3 of the License, or (at your
%% option) any later version.
%%
%% This program is distributed in the hope that it will be useful, but WITHOUT
%% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
%% FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
%% more details.
%%
%% You should have received a copy of the GNU Lesser General Public License
%% along with this program. If not, see <http://www.gnu.org/licenses/>.
%%=============================================================================
:- use_module(library(gecode)).
:- use_module(library(maplist)).
% use alldiff constraints
queens(N, Solution) :-
Space := space,
length(Queens, N),
Queens := intvars(Space,N,1,N),
Space += distinct(Queens),
foldl(inc, Queens, Inc, 0, _),
foldl(dec, Queens, Dec, 0, _),
Space += distinct(Inc,Queens),
Space += distinct(Dec,Queens),
Space += branch(Queens, 'INT_VAR_SIZE_MIN', 'INT_VAL_MIN'),
SolSpace := search(Space),
Solution := val(SolSpace,Queens).
inc(_, I0, I0, I) :-
I is I0+1.
dec(_, I0, I0, I) :-
I is I0-1.
%
% Using gecode linear constraints for diagonals.
%
lqueens(N, Solution) :-
Space := space,
length(Queens, N),
Queens := intvars(Space,N,1,N),
Space += distinct(Queens),
lconstrain( Queens, Space, 0),
Space += branch(Queens, 'INT_VAR_SIZE_MIN', 'INT_VAL_MIN'),
SolSpace := search(Space),
Solution := val(SolSpace,Queens).
lconstrain([], _, _).
lconstrain( [Q|Queens], Space, I0) :-
I is I0+1,
foldl(constrain(Q, I0, Space), Queens, I, _),
lconstrain( Queens, Space, I).
constrain(Q, I, Space, R, J, J1) :-
% Q+I != R+J, Q-I != R-J <=> Q-R != J-I, Q-R != I-J,
J1 is J+1,
Sum is I-J,
Diff is J-I,
Space += linear([1,-1], [Q,R], 'IRT_NQ', Diff),
Space += linear([1,-1], [Q,R], 'IRT_NQ', Sum).

Some files were not shown because too many files have changed in this diff Show More