This commit is contained in:
Vitor Santos Costa 2017-09-03 10:49:16 +01:00
commit a115024aee
41 changed files with 1384 additions and 1221 deletions

3
.gitignore vendored
View File

@ -213,3 +213,6 @@ cmake/compile_commands.json
cmake/cudd_config.h cmake/cudd_config.h
cmake/docs/Doxyfile cmake/docs/Doxyfile
*.stackdump
*.gz

View File

@ -1430,6 +1430,7 @@ OpenRestore(const char *inpf, const char *YapLibDir, CELL *Astate, CELL *ATrail,
return FAIL_RESTORE; return FAIL_RESTORE;
if (fname[0] && if (fname[0] &&
(mode = try_open(fname,Astate,ATrail,AStack,AHeap,streamp)) != FAIL_RESTORE) { (mode = try_open(fname,Astate,ATrail,AStack,AHeap,streamp)) != FAIL_RESTORE) {
setAtomicGlobalPrologFlag( RESOURCE_DATABASE_FLAG, MkAtomTerm(Yap_LookupAtom(fname)) );
return mode; return mode;
} }
/* try to open from current directory */ /* try to open from current directory */

View File

@ -871,7 +871,7 @@ static int num_send_error_message(char s[]) {
#define number_overflow() \ #define number_overflow() \
{ \ { \
size_t nsz = min(max_size * 2, max_size); \ size_t nsz = Yap_Min(max_size * 2, max_size); \
char *nbuf; \ char *nbuf; \
\ \
if (buf == buf0) { \ if (buf == buf0) { \
@ -1408,7 +1408,7 @@ TokEntry *Yap_tokenizer(struct stream_desc *inp_stream, bool store_comments,
for (; chtype(ch) <= NU; ch = getchr(inp_stream)) { for (; chtype(ch) <= NU; ch = getchr(inp_stream)) {
if (charp == TokImage + (sz - 1)) { if (charp == TokImage + (sz - 1)) {
unsigned char *p0 = TokImage; unsigned char *p0 = TokImage;
sz = min(sz * 2, sz + MBYTE); sz = Yap_Min(sz * 2, sz + MBYTE);
TokImage = Realloc(p0, sz); TokImage = Realloc(p0, sz);
if (TokImage == NULL) { if (TokImage == NULL) {
return CodeSpaceError(t, p, l); return CodeSpaceError(t, p, l);
@ -1562,7 +1562,7 @@ TokEntry *Yap_tokenizer(struct stream_desc *inp_stream, bool store_comments,
while (TRUE) { while (TRUE) {
if (charp > TokImage + (sz - 1)) { if (charp > TokImage + (sz - 1)) {
TokImage = Realloc(TokImage, min(sz * 2, sz + MBYTE)); TokImage = Realloc(TokImage, Yap_Min(sz * 2, sz + MBYTE));
if (TokImage == NULL) { if (TokImage == NULL) {
return CodeSpaceError(t, p, l); return CodeSpaceError(t, p, l);
} }
@ -1737,7 +1737,7 @@ TokEntry *Yap_tokenizer(struct stream_desc *inp_stream, bool store_comments,
add_ch_to_buff(och); add_ch_to_buff(och);
for (; chtype(ch) == SY; ch = getchr(inp_stream)) { for (; chtype(ch) == SY; ch = getchr(inp_stream)) {
if (charp >= TokImage + (sz - 10)) { if (charp >= TokImage + (sz - 10)) {
sz = min(sz * 2, sz + MBYTE); sz = Yap_Min(sz * 2, sz + MBYTE);
TokImage = Realloc(TokImage, sz); TokImage = Realloc(TokImage, sz);
if (!TokImage) if (!TokImage)
return CodeSpaceError(t, p, l); return CodeSpaceError(t, p, l);

View File

@ -92,9 +92,12 @@ endif()
OPTION (WITH_SWIG " Enable SWIG interfaces to foreign languages" ON) OPTION (WITH_SWIG " Enable SWIG interfaces to foreign languages" ON)
IF (WITH_SWIG) IF (WITH_SWIG OR ANDROID)
find_host_package (SWIG) find_host_package (SWIG)
ENDIF (WITH_SWIG) macro_log_feature (SWIG_FOUND "Swig"
"Use SWIG Interface Generator "
"http://www.swig.org" ON)
ENDIF (WITH_SWIG OR ANDROID)
option (WITH_PYTHON option (WITH_PYTHON
"Allow Python->YAP and YAP->Python" ON) "Allow Python->YAP and YAP->Python" ON)
@ -104,37 +107,20 @@ IF (WITH_PYTHON)
ENDIF (WITH_PYTHON) ENDIF (WITH_PYTHON)
IF (SWIG_FOUND)
add_subDIRECTORY (packages/swig NO_POLICY_SCOPE)
ENDIF(SWIG_FOUND)
if (ANDROID)
ADD_SUBDIRECTORY(os)
ADD_SUBDIRECTORY(OPTYap)
ADD_SUBDIRECTORY(packages/myddas)
ADD_SUBDIRECTORY(utf8proc)
ADD_SUBDIRECTORY(CXX)
else()
List (APPEND YLIBS $<TARGET_OBJECTS:libOPTYap> ) List (APPEND YLIBS $<TARGET_OBJECTS:libOPTYap> )
List (APPEND YLIBS $<TARGET_OBJECTS:libYAPOs> ) List (APPEND YLIBS $<TARGET_OBJECTS:libYAPOs> )
List (APPEND YLIBS $<TARGET_OBJECTS:utf8proc> ) List (APPEND YLIBS $<TARGET_OBJECTS:utf8proc> )
List (APPEND YLIBS $<TARGET_OBJECTS:myddas> ) List (APPEND YLIBS $<TARGET_OBJECTS:myddas> )
List (APPEND YLIBS $<TARGET_OBJECTS:Yapsqlite3> )
List (APPEND YLIBS $<TARGET_OBJECTS:libswi> ) List (APPEND YLIBS $<TARGET_OBJECTS:libswi> )
if (WIN32) if (WIN32)
List (APPEND YLIBS $<TARGET_OBJECTS:Yapsqlite3> )
List (APPEND YLIBS $<TARGET_OBJECTS:YAP++> ) List (APPEND YLIBS $<TARGET_OBJECTS:YAP++> )
if (WITH_PYTHON ) if (WITH_PYTHON )
List (APPEND YLIBS $<TARGET_OBJECTS:Py4YAP> ) List (APPEND YLIBS $<TARGET_OBJECTS:Py4YAP> )
endif() endif()
endif() endif()
endif()
@ -165,8 +151,6 @@ if (USE_READLINE)
endif (USE_READLINE) endif (USE_READLINE)
if (ANDROID) if (ANDROID)
add_dependencies(libYap plmyddas )
target_link_libraries(libYap android log) target_link_libraries(libYap android log)
endif () endif ()
@ -190,6 +174,11 @@ if (PYTHONLIBS_FOUND AND SWIG_FOUND)
ENDIF() ENDIF()
endif() endif()
IF (SWIG_FOUND OR ANDROID)
add_subDIRECTORY (packages/swig NO_POLICY_SCOPE)
ENDIF()
include(Config NO_POLICY_SCOPE) include(Config NO_POLICY_SCOPE)
feature_summary(WHAT ENABLED_FEATURES DISABLED_FEATURES feature_summary(WHAT ENABLED_FEATURES DISABLED_FEATURES

View File

@ -27,12 +27,14 @@ X_API void YAP_UserBackCPredicate(const char *, YAP_UserCPred, YAP_UserCPred,
} }
static YAPEngine *curren;
YAPAtomTerm::YAPAtomTerm(char *s) YAPAtomTerm::YAPAtomTerm(char *s)
{ // build string { // build string
BACKUP_H(); BACKUP_H();
CACHE_REGS CACHE_REGS
seq_tv_t inp, out; seq_tv_t inp, out;
inp.val.c = s; inp.val.c = s;
inp.type = YAP_STRING_CHARS; inp.type = YAP_STRING_CHARS;
out.type = YAP_STRING_ATOM; out.type = YAP_STRING_ATOM;
@ -187,6 +189,7 @@ YAPApplTerm::YAPApplTerm(std::string f, std::vector<YAPTerm> ts)
mk(o); mk(o);
} }
YAPApplTerm::YAPApplTerm(YAPFunctor f) : YAPTerm() YAPApplTerm::YAPApplTerm(YAPFunctor f) : YAPTerm()
{ {
BACKUP_H(); BACKUP_H();
@ -649,20 +652,20 @@ YAPQuery::YAPQuery(YAPFunctor f, YAPTerm mod, YAPTerm ts[])
/* ignore flags for now */ /* ignore flags for now */
BACKUP_MACHINE_REGS(); BACKUP_MACHINE_REGS();
Term *nts; Term *nts;
Term goal; Term tgoal;
if ( ts) { if ( ts) {
goal = YAPApplTerm(f, ts).term(); goal = new YAPApplTerm(f, ts);
nts = RepAppl(goal)+1; nts = RepAppl(goal->term())+1;
} else { } else {
goal = MkVarTerm(); goal = new YAPVarTerm();
nts = nullptr; nts = nullptr;
} }
openQuery( nts); openQuery(goal->term(), nts);
names = YAPPairTerm( TermNil ); names = new YAPPairTerm();
RECOVER_MACHINE_REGS(); RECOVER_MACHINE_REGS();
} }
#if 0 #if 0
@ -671,13 +674,14 @@ YAPQuery::YAPQuery(YAPFunctor f, YAPTerm ts[]) : YAPPredicate(f) {
BACKUP_MACHINE_REGS(); BACKUP_MACHINE_REGS();
CELL *nts; CELL *nts;
if (ts) { if (ts) {
goal = YAPApplTerm(f, nts); tgoal = YAPApplTerm(f, nts);
} else { } else {
goal = YAPVarTerm(); tgoal = YAPVarTerm();
nts = nullptr; nts = nullptr;
} }
names = YAPPairTerm( TermNil ); *names = new YAPPairTerm();
openQuery(term(), nts); *goal = new YAPTerm(tgoal);
openQuery(goal.term(), nts);
RECOVER_MACHINE_REGS(); RECOVER_MACHINE_REGS();
} }
#endif #endif
@ -691,15 +695,15 @@ YAPQuery::YAPQuery(YAPTerm t) : YAPPredicate(t)
if (IsApplTerm(tt)) { if (IsApplTerm(tt)) {
Functor f = FunctorOfTerm(tt); Functor f = FunctorOfTerm(tt);
if (IsExtensionFunctor(f)) if (IsExtensionFunctor(f))
nts = nullptr; nts = nullptr;
nts = RepAppl(goal.term())+1; nts = RepAppl(tt)+1;
} else if (IsPairTerm(tt)) { } else if (IsPairTerm(tt)) {
nts = RepPair(tt); nts = RepPair(tt);
} else { } else {
nts = nullptr; nts = nullptr;
} }
openQuery( nts); names = new YAPPairTerm();
names = YAPPairTerm( TermNil ); goal = new YAPTerm(t);
RECOVER_MACHINE_REGS(); RECOVER_MACHINE_REGS();
} }
@ -708,15 +712,14 @@ YAPQuery::YAPQuery(YAPPredicate p, YAPTerm ts[]) : YAPPredicate(p.ap) {
BACKUP_MACHINE_REGS(); BACKUP_MACHINE_REGS();
arity_t arity = p.ap->ArityOfPE; arity_t arity = p.ap->ArityOfPE;
if (arity) { if (arity) {
goal = YAPApplTerm(YAPFunctor(p.ap->FunctorOfPred), ts).term(); goal = new YAPApplTerm(YAPFunctor(p.ap->FunctorOfPred), ts);
for (arity_t i =0; i < arity; i++) for (arity_t i =0; i < arity; i++) {
XREGS[i+1]=ts[i].term(); XREGS[i + 1] = ts[i].term();
openQuery( nullptr); }
} else { } else {
goal = YAPAtomTerm((Atom)(p.ap->FunctorOfPred)); goal = new YAPAtomTerm((Atom)(p.ap->FunctorOfPred)); }
openQuery(nullptr); openQuery(goal->term(), nullptr);
} names = new YAPPairTerm();
names = TermNil;
RECOVER_MACHINE_REGS(); RECOVER_MACHINE_REGS();
} }
@ -726,13 +729,21 @@ bool YAPQuery::next()
bool result = false; bool result = false;
sigjmp_buf buf, *oldp = LOCAL_RestartEnv; sigjmp_buf buf, *oldp = LOCAL_RestartEnv;
Term terr; Term terr;
try __android_log_print(ANDROID_LOG_INFO, "YAPDroid", "next %d %ld",
q_state, LOCAL_CurSlot);
__android_log_print(ANDROID_LOG_INFO, "YAPDroid", "next %d %s %ld",
q_state, names->text(), LOCAL_CurSlot);
if (ap == NULL || ap->OpcodeOfPred == UNDEF_OPCODE) {
ap = rewriteUndefQuery();
}
LOCAL_RestartEnv = &q_env;
try
{ {
BACKUP_MACHINE_REGS(); BACKUP_MACHINE_REGS();
if (!q_open) if (!q_open)
return false; return false;
LOCAL_RestartEnv = &buf; if (false && sigsetjmp(q_env, false))
if (sigsetjmp(*LOCAL_RestartEnv, false))
{ {
//throw YAPError(); //throw YAPError();
return false; return false;
@ -751,60 +762,58 @@ bool YAPQuery::next()
} }
if (result) if (result)
{ {
__android_log_print(ANDROID_LOG_INFO, "YAPDroid", "vnames %d %s %ld", __android_log_print(ANDROID_LOG_INFO, "YAPDroid", "names %d %s %ld",
q_state, vnames.text(), LOCAL_CurSlot); q_state, names->text(), LOCAL_CurSlot);
} }
else else
{ {
__android_log_print(ANDROID_LOG_INFO, "YAPDroid", "fail"); __android_log_print(ANDROID_LOG_INFO, "YAPDroid", "fail");
} }
q_state = 1; q_state = 1;
if ((terr = Yap_GetException())) if ((terr = Yap_GetException()))
{
if ((terr = Yap_GetException()))
{ {
LOCAL_RestartEnv = &buf; if ((terr = Yap_GetException()))
throw YAPError(); {
throw YAPError();
}
} }
}
__android_log_print(ANDROID_LOG_INFO, "YAPDroid", "out %d", result); __android_log_print(ANDROID_LOG_INFO, "YAPDroid", "out %d", result);
if (!result) if (!result)
{ {
YAP_LeaveGoal(false, &q_h); YAP_LeaveGoal(false, &q_h);
Yap_CloseHandles(q_handles); Yap_CloseHandles(q_handles);
q_open = false; q_open = false;
} }
else else
{ {
q_handles = Yap_StartSlots(); q_handles = Yap_StartSlots();
} }
RECOVER_MACHINE_REGS(); RECOVER_MACHINE_REGS();
LOCAL_RestartEnv = oldp; LOCAL_RestartEnv = oldp;
return result; return result;
} }
catch (YAPError e) catch (YAPError e)
{ {
q_open = false; q_open = false;
Yap_PopTermFromDB(LOCAL_ActiveError->errorTerm); Yap_PopTermFromDB(LOCAL_ActiveError->errorTerm);
memset(LOCAL_ActiveError, 0, sizeof(*LOCAL_ActiveError)); memset(LOCAL_ActiveError, 0, sizeof(*LOCAL_ActiveError));
YAP_LeaveGoal(false, &q_h); YAP_LeaveGoal(false, &q_h);
Yap_CloseHandles(q_handles); Yap_CloseHandles(q_handles);
q_open = false; q_open = false;
std::cerr << "Exception received by " << __func__ << "( " << YAPTerm(terr).text() << ").\n Forwarded...\n\n"; std::cerr << "Exception received by " << __func__ << "( " << YAPTerm(terr).text() << ").\n Forwarded...\n\n";
LOCAL_RestartEnv = oldp; throw e;
throw e; }
}
} }
PredEntry * PredEntry *
YAPQuery::rewriteUndefQuery() YAPQuery::rewriteUndefQuery()
{ {
Term ts[3]; Term ts[3];
ARG1 = ts[0] = goal.term(); ARG1 = ts[0] = goal->term();
ARG2 = ts[1] = ap->ModuleOfPred; ARG2 = ts[1] = ap->ModuleOfPred;
ARG3 = ts[2] = Yap_cp_as_integer(B PASS_REGS); ARG3 = ts[2] = Yap_cp_as_integer(B PASS_REGS);
goal = YAPApplTerm(FunctorUndefinedQuery, ts); goal = new YAPApplTerm(FunctorUndefinedQuery, ts);
return ap = PredUndefinedQuery; return ap = PredUndefinedQuery;
} }
@ -886,39 +895,6 @@ JNIEXPORT jint JNICALL JNI_MySQLOnLoad(JavaVM *vm, void *reserved)
return JNI_VERSION_1_6; return JNI_VERSION_1_6;
} }
char *Yap_AndroidBufp;
static size_t Yap_AndroidMax, Yap_AndroidSz;
extern void (*Yap_DisplayWithJava)(int c);
void Yap_displayWithJava(int c)
{
char *ptr = Yap_AndroidBufp;
if (!ptr)
ptr = Yap_AndroidBufp = (char *)malloc(Yap_AndroidSz);
ptr[Yap_AndroidSz++] = c;
if (Yap_AndroidMax - 1 == Yap_AndroidSz)
{
if (Yap_AndroidMax < 32 * 1024)
{
Yap_AndroidMax *= 2;
}
else
{
Yap_AndroidMax += 32 * 1024;
}
Yap_AndroidBufp = (char *)realloc(ptr, Yap_AndroidMax);
}
Yap_AndroidBufp[Yap_AndroidSz] = '\0';
if (c == '\n')
{
Yap_AndroidBufp[Yap_AndroidSz] = '\0';
curren->run(Yap_AndroidBufp);
Yap_AndroidSz = 0;
}
}
#endif #endif
@ -932,22 +908,18 @@ void YAPEngine::doInit(YAP_file_type_t BootMode)
/* Begin preprocessor code */ /* Begin preprocessor code */
/* live */ /* live */
__android_log_print(ANDROID_LOG_INFO, "YAPDroid", "initialize_prolog"); __android_log_print(ANDROID_LOG_INFO, "YAPDroid", "initialize_prolog");
#if __ANDROID__ curren = this;
Yap_AndroidBufp = (char *)malloc(Yap_AndroidMax = 4096);
Yap_AndroidBufp[0] = '\0';
Yap_AndroidSz = 0;
#endif
//yerror = YAPError(); //yerror = YAPError();
#if YAP_PYTHON #if YAP_PYTHON
do_init_python(); do_init_python();
#endif #endif
YAP_PredEntryPtr p = YAP_AtomToPred( YAP_LookupAtom("initialize_prolog") ); YAP_PredEntryPtr p = YAP_AtomToPred( YAP_LookupAtom("initialize_prolog") );
YAPQuery initq = YAPQuery(YAPPredicate(p), nullptr); YAPQuery initq = YAPQuery(YAPPredicate(p), nullptr);
if (initq.next()) if (initq.next())
{ {
initq.cut(); initq.cut();
} }
CurrentModule = TermUser; CurrentModule = TermUser;
} }

View File

@ -9,8 +9,8 @@
* *
* @{ * @{
* *
* These classes wrap engine and query. An engine is an environment where we can rum * These classes wrap engine and query. An engine is an environment where we
* Prolog, that is, where we can run queries. * can rum Prolog, that is, where we can run queries.
* *
* Also, supports callbacks and engine configuration. * Also, supports callbacks and engine configuration.
* *
@ -31,8 +31,7 @@ class X_API YAPPredicate;
* interface to a YAP Query; * interface to a YAP Query;
* uses an SWI-like status info internally. * uses an SWI-like status info internally.
*/ */
class X_API YAPQuery : public YAPPredicate class X_API YAPQuery : public YAPPredicate {
{
bool q_open; bool q_open;
int q_state; int q_state;
yhandle_t q_g, q_handles; yhandle_t q_g, q_handles;
@ -41,33 +40,34 @@ class X_API YAPQuery : public YAPPredicate
int q_flags; int q_flags;
YAP_dogoalinfo q_h; YAP_dogoalinfo q_h;
YAPQuery *oq; YAPQuery *oq;
YAPPairTerm names; YAPPairTerm *names;
YAPTerm goal; YAPTerm *goal;
// temporaries // temporaries
Term tnames, tgoal ; Term tnames, tgoal;
inline void setNext() { // oq = LOCAL_execution; inline void setNext() { // oq = LOCAL_execution;
// LOCAL_execution = this; // LOCAL_execution = this;
q_open = true; q_open = true;
q_state = 0; q_state = 0;
q_flags = true; // PL_Q_PASS_EXCEPTION; q_flags = true; // PL_Q_PASS_EXCEPTION;
q_p = P; q_p = P;
q_cp = CP; q_cp = CP;
// make sure this is safe // make sure this is safe
q_handles = LOCAL_CurSlot; names = new YAPPairTerm();
}; goal = new YAPTerm();
q_handles = LOCAL_CurSlot;
};
void openQuery(Term *ts);
void openQuery( Term *ts); PredEntry *rewriteUndefQuery();
PredEntry *rewriteUndefQuery();
public: public:
YAPQuery() { YAPQuery() {
goal = TermTrue; goal = TermTrue;
openQuery( nullptr); openQuery(nullptr);
}; };
/// main constructor, uses a predicate and an array of terms /// main constructor, uses a predicate and an array of terms
/// ///
/// It is given a YAPPredicate _p_ , and an array of terms that must have at /// It is given a YAPPredicate _p_ , and an array of terms that must have at
@ -85,32 +85,29 @@ YAPQuery() {
/// ///
/// It is given a functor, and an array of terms that must have at least /// It is given a functor, and an array of terms that must have at least
/// the same arity as the functor. Works within the current module. /// the same arity as the functor. Works within the current module.
//YAPQuery(YAPFunctor f, YAPTerm t[]); // YAPQuery(YAPFunctor f, YAPTerm t[]);
/// string constructor without varnames /// string constructor without varnames
/// ///
/// It is given a string, calls the parser and obtains a Prolog term that /// It is given a string, calls the parser and obtains a Prolog term that
/// should be a callable /// should be a callable
/// goal. /// goal.
inline YAPQuery(const char *s) : YAPPredicate(s, tgoal, tnames) inline YAPQuery(const char *s) : YAPPredicate(s, tgoal, tnames) {
{
CELL *qt = nullptr; CELL *qt = nullptr;
__android_log_print(ANDROID_LOG_INFO, "YAPDroid", "got game %ld", __android_log_print(ANDROID_LOG_INFO, "YAPDroid", "got game %ld",
LOCAL_CurSlot); LOCAL_CurSlot);
if (!ap) if (!ap)
return; return;
__android_log_print(ANDROID_LOG_INFO, "YAPDroid", "%s", vnames.text()); __android_log_print(ANDROID_LOG_INFO, "YAPDroid", "ŸAPQuery");
goal = YAPTerm(tgoal); if (IsPairTerm(tgoal)) {
if (IsPairTerm(tgoal)) { qt = RepPair(tgoal);
qt = RepPair(tgoal); tgoal =
tgoal = Yap_MkApplTerm(Yap_MkFunctor(Yap_LookupAtom("consult"), 1),1,qt); Yap_MkApplTerm(Yap_MkFunctor(Yap_LookupAtom("consult"), 1), 1, qt);
} else if (IsApplTerm(tgoal)) { } else if (IsApplTerm(tgoal)) {
Functor f = FunctorOfTerm(tgoal); Functor f = FunctorOfTerm(tgoal);
if (!IsExtensionFunctor(f)) { if (!IsExtensionFunctor(f)) {
qt = RepAppl(tgoal)+1; qt = RepAppl(tgoal) + 1;
}
} }
names = YAPPairTerm(tnames); }
openQuery(qt);
}; };
// inline YAPQuery() : YAPPredicate(s, tgoal, tnames) // inline YAPQuery() : YAPPredicate(s, tgoal, tnames)
// { // {
@ -118,7 +115,7 @@ YAPQuery() {
// LOCAL_CurSlot); // LOCAL_CurSlot);
// if (!ap) // if (!ap)
// return; // return;
// __android_log_print(ANDROID_LOG_INFO, "YAPDroid", "%s", vnames.text()); // __android_log_print(ANDROID_LOG_INFO, "YAPDroid", "%s", names->text());
// goal = YAPTerm(tgoal); // goal = YAPTerm(tgoal);
// names = YAPPairTerm(tnames); // names = YAPPairTerm(tnames);
// openQuery(tgoal); // openQuery(tgoal);
@ -131,40 +128,37 @@ YAPQuery() {
/// set flags for query execution, currently only for exception handling /// set flags for query execution, currently only for exception handling
void setFlag(int flag) { q_flags |= flag; } void setFlag(int flag) { q_flags |= flag; }
/// reset flags for query execution, currently only for exception handling /// reset flags for query execution, currently only for exception handling
void resetFlag(int flag) { q_flags &= ~flag; } void resetFlag(int flag) { q_flags &= ~flag; }
/// first query /// first query
/// ///
/// actually implemented by calling the next(); /// actually implemented by calling the next();
inline bool first() { return next(); } inline bool first() { return next(); }
/// ask for the next solution of the current query /// ask for the next solution of the current query
/// same call for every solution /// same call for every solution
bool next(); bool next();
/// does this query have open choice-points? /// does this query have open choice-points?
/// or is it deterministic? /// or is it deterministic?
bool deterministic(); bool deterministic();
/// represent the top-goal /// represent the top-goal
const char *text(); const char *text();
/// remove alternatives in the current search space, and finish the current /// remove alternatives in the current search space, and finish tnamedyaphe
/// query /// current query finish the current query: undo all bindings.
/// finish the current query: undo all bindings. void close();
void close(); /// query variables.
/// query variables. void cut();
void cut();
Term namedVars() {return names.term(); }; Term namedVars() { return names->term(); };
/// query variables, but copied out YAPPairTerm *namedYAPVars() { return names; };
std::vector<Term> namedVarsVector() { /// query variables, but copied out
return names.listToArray(); }; YAPTerm getTerm(yhandle_t t);
/// convert a ref to a binding. /// simple YAP Query;
YAPTerm getTerm(yhandle_t t); /// just calls YAP and reports success or failure, Useful when we just
/// simple YAP Query; /// want things done, eg YAPCommand("load_files(library(lists), )")
/// just calls YAP and reports success or failure, Useful when we just inline bool command() {
/// want things done, eg YAPCommand("load_files(library(lists), )") bool rc = next();
inline bool command() close();
{ return rc;
bool rc = next(); };
close();
return rc;
};
}; };
// Java support // Java support
@ -172,170 +166,96 @@ inline bool command()
/// This class implements a callback Prolog-side. It will be inherited by the /// This class implements a callback Prolog-side. It will be inherited by the
/// Java or Python /// Java or Python
/// class that actually implements the callback. /// class that actually implements the callback.
class X_API YAPCallback class X_API YAPCallback {
{
public: public:
virtual ~YAPCallback() {} virtual ~YAPCallback() {}
virtual void run() { LOG("callback"); } virtual void run() { LOG("callback"); }
virtual void run(char *s) {} virtual void run(char *s) {}
}; };
/// @brief Setup all arguments to a new engine /// @brief Setup all arguments to a new engine
class X_API YAPEngineArgs { class X_API YAPEngineArgs {
public: public:
YAP_init_args init_args; YAP_init_args init_args;
inline void setEmbedded( bool fl ) inline void setEmbedded(bool fl) { init_args.Embedded = fl; };
{
init_args.Embedded = fl;
};
inline bool getEmbedded( ) inline bool getEmbedded() { return init_args.Embedded; };
{
return init_args.Embedded;
};
inline void setStackSize( bool fl ) inline void setStackSize(bool fl) { init_args.StackSize = fl; };
{
init_args.StackSize = fl;
};
inline bool getStackSize( ) inline bool getStackSize() { return init_args.StackSize; };
{
return init_args.StackSize;
};
inline void setTrailSize( bool fl ) inline void setTrailSize(bool fl) { init_args.TrailSize = fl; };
{
init_args.TrailSize = fl;
};
inline bool getTrailSize( ) inline bool getTrailSize() { return init_args.TrailSize; };
{
return init_args.TrailSize;
};
inline bool getMStackSize( ) inline bool getMStackSize() { return init_args.StackSize; };
{
return init_args.StackSize;
};
inline void setMaxTrailSize( bool fl ) inline void setMaxTrailSize(bool fl) { init_args.MaxTrailSize = fl; };
{
init_args.MaxTrailSize = fl;
};
inline bool getMaxTrailSize( ) inline bool getMaxTrailSize() { return init_args.MaxTrailSize; };
{
return init_args.MaxTrailSize;
};
inline void setYapLibDir( const char * fl ) inline void setYapLibDir(const char *fl) {
{ init_args.YapLibDir = (const char *)malloc(strlen(fl) + 1);
init_args.YapLibDir = (const char *)malloc(strlen(fl)+1);
strcpy((char *)init_args.YapLibDir, fl); strcpy((char *)init_args.YapLibDir, fl);
}; };
inline const char * getYapLibDir( ) inline const char *getYapLibDir() { return init_args.YapLibDir; };
{
return init_args.YapLibDir;
};
inline void setYapShareDir( const char * fl ) inline void setYapShareDir(const char *fl) {
{ init_args.YapShareDir = (const char *)malloc(strlen(fl) + 1);
init_args.YapShareDir = (const char *)malloc(strlen(fl)+1);
strcpy((char *)init_args.YapShareDir, fl); strcpy((char *)init_args.YapShareDir, fl);
}; };
inline const char * getYapShareDir( ) inline const char *getYapShareDir() { return init_args.YapShareDir; };
{
return init_args.YapShareDir;
};
inline void setSavedState( const char * fl ) inline void setSavedState(const char *fl) {
{ init_args.SavedState = (const char *)malloc(strlen(fl) + 1);
init_args.SavedState = (const char *)malloc(strlen(fl)+1);
strcpy((char *)init_args.SavedState, fl); strcpy((char *)init_args.SavedState, fl);
}; };
inline const char * getSavedState( ) inline const char *getSavedState() { return init_args.SavedState; };
{
return init_args.SavedState; inline void setYapPrologBootFile(const char *fl) {
init_args.YapPrologBootFile = (const char *)malloc(strlen(fl) + 1);
strcpy((char *)init_args.YapPrologBootFile, fl);
}; };
inline void setYapPrologBootFile( const char * fl ) inline const char *getYapPrologBootFile() {
{
init_args.YapPrologBootFile = (const char *)malloc(strlen(fl)+1);
strcpy((char *)init_args.YapPrologBootFile, fl);
};
inline const char * getYapPrologBootFile( )
{
return init_args.YapPrologBootFile; return init_args.YapPrologBootFile;
}; };
inline void setYapPrologGoal( const char * fl ) inline void setYapPrologGoal(const char *fl) {
{
init_args.YapPrologGoal = fl; init_args.YapPrologGoal = fl;
}; };
inline const char * getYapPrologGoal( ) inline const char *getYapPrologGoal() { return init_args.YapPrologGoal; };
{
return init_args.YapPrologGoal;
};
inline void setYapPrologTopLevelGoal( const char * fl ) inline void setYapPrologTopLevelGoal(const char *fl) {
{
init_args.YapPrologTopLevelGoal = fl; init_args.YapPrologTopLevelGoal = fl;
}; };
inline const char * getYapPrologTopLevelGoal( ) inline const char *getYapPrologTopLevelGoal() {
{
return init_args.YapPrologTopLevelGoal; return init_args.YapPrologTopLevelGoal;
}; };
inline void setHaltAfterConsult( bool fl ) inline void setHaltAfterConsult(bool fl) { init_args.HaltAfterConsult = fl; };
{
init_args.HaltAfterConsult = fl;
};
inline bool getHaltAfterConsult( ) inline bool getHaltAfterConsult() { return init_args.HaltAfterConsult; };
{
return init_args.HaltAfterConsult;
};
inline void setFastBoot( bool fl ) inline void setFastBoot(bool fl) { init_args.FastBoot = fl; };
{
init_args.FastBoot = fl;
};
inline bool getFastBoot( ) inline bool getFastBoot() { return init_args.FastBoot; };
{
return init_args.FastBoot;
};
inline void setArgc( int fl ) inline void setArgc(int fl) { init_args.Argc = fl; };
{
init_args.Argc = fl;
};
inline int getArgc( ) inline int getArgc() { return init_args.Argc; };
{
return init_args.Argc;
};
inline void setArgv( char ** fl ) inline void setArgv(char **fl) { init_args.Argv = fl; };
{
init_args.Argv = fl;
};
inline char ** getArgv( ) inline char **getArgv() { return init_args.Argv; };
{
return init_args.Argv;
};
YAPEngineArgs() { YAPEngineArgs() {
Yap_InitDefaults(&init_args, NULL, 0, NULL); Yap_InitDefaults(&init_args, NULL, 0, NULL);
@ -346,15 +266,13 @@ public:
}; };
}; };
/** /**
* @brief YAP Engine: takes care of the execution environment * @brief YAP Engine: takes care of the execution environment
where we can go executing goals. where we can go executing goals.
* *
* *
*/ */
class YAPEngine class YAPEngine {
{
private: private:
YAPEngineArgs *engine_args; YAPEngineArgs *engine_args;
YAPCallback *_callback; YAPCallback *_callback;
@ -363,32 +281,29 @@ private:
YAP_dogoalinfo q; YAP_dogoalinfo q;
PredEntry *rewriteUndefEngineQuery(PredEntry *ap, Term t, Term tmod); PredEntry *rewriteUndefEngineQuery(PredEntry *ap, Term t, Term tmod);
public : public:
/// construct a new engine; may use a variable number of arguments /// construct a new engine; may use a variable number of arguments
YAPEngine(YAPEngineArgs *cargs) YAPEngine(YAPEngineArgs *cargs) {
{
engine_args = cargs; engine_args = cargs;
//doInit(cargs->init_args.boot_file_type); // doInit(cargs->init_args.boot_file_type);
doInit(YAP_QLY); doInit(YAP_QLY);
}; /// construct a new engine, including aaccess to callbacks }; /// construct a new engine, including aaccess to callbacks
/// construct a new engine using argc/argv list of arguments /// construct a new engine using argc/argv list of arguments
YAPEngine(int argc, char *argv[], YAPEngine(int argc, char *argv[],
YAPCallback *callback = (YAPCallback *)NULL); YAPCallback *callback = (YAPCallback *)NULL);
/// kill engine /// kill engine
~YAPEngine() { delYAPCallback(); }; ~YAPEngine() { delYAPCallback(); };
/// remove current callback /// remove current callback
void delYAPCallback() { _callback = 0; }; void delYAPCallback() { _callback = 0; };
/// set a new callback /// set a new callback
void setYAPCallback(YAPCallback *cb) void setYAPCallback(YAPCallback *cb) {
{
delYAPCallback(); delYAPCallback();
_callback = cb; _callback = cb;
}; };
/// execute the callback. /// execute the callback.
////void run() { if (_callback) _callback.run(); } ////void run() { if (_callback) _callback.run(); }
/// execute the callback with a text argument. /// execute the callback with a text argument.
void run(char *s) void run(char *s) {
{
if (_callback) if (_callback)
_callback->run(s); _callback->run(s);
} }
@ -415,25 +330,20 @@ private:
bool mgoal(Term t, Term tmod); bool mgoal(Term t, Term tmod);
/// current directory for the engine /// current directory for the engine
bool goal(Term t) bool goal(Term t) { return mgoal(t, CurrentModule); }
{
return mgoal(t, CurrentModule);
}
/// reset Prolog state /// reset Prolog state
void reSet(); void reSet();
/// assune that there are no stack pointers, just release memory /// assune that there are no stack pointers, just release memory
// for last execution // for last execution
void release(); void release();
const char *currentDir() const char *currentDir() {
{
char dir[1024]; char dir[1024];
std::string s = Yap_getcwd(dir, 1024 - 1); std::string s = Yap_getcwd(dir, 1024 - 1);
return s.c_str(); return s.c_str();
}; };
/// report YAP version as a string /// report YAP version as a string
const char *version() const char *version() {
{
std::string s = Yap_version(); std::string s = Yap_version();
return s.c_str(); return s.c_str();
}; };
@ -445,16 +355,15 @@ private:
Term fun(YAPTerm t) { return fun(t.term()); }; Term fun(YAPTerm t) { return fun(t.term()); };
//> set a StringFlag, usually a path //> set a StringFlag, usually a path
//> //>
bool setStringFlag(std::string arg, std::string path) bool setStringFlag(std::string arg, std::string path) {
{ return setYapFlag(MkAtomTerm(Yap_LookupAtom(arg.data())),
return setYapFlag(MkAtomTerm(Yap_LookupAtom(arg.data())), MkAtomTerm(Yap_LookupAtom(path.data()))); MkAtomTerm(Yap_LookupAtom(path.data())));
}; };
Term top_level( std::string s); Term top_level(std::string s);
Term next_answer(YAPQuery * &Q); Term next_answer(YAPQuery *&Q);
};
};
#endif /* YAPQ_HH */ #endif /* YAPQ_HH */
/// @} /// @}

File diff suppressed because it is too large Load Diff

View File

@ -300,7 +300,7 @@ static inline bool trueLocalPrologFlag(int id) {
return LOCAL_Flags[id].at == TermTrue; return LOCAL_Flags[id].at == TermTrue;
} }
static inline bool falsePrologFlag(int id) { static inline bool falseLocalPrologFlag(int id) {
CACHE_REGS CACHE_REGS
return LOCAL_Flags[id].at == TermFalse; return LOCAL_Flags[id].at == TermFalse;
} }
@ -317,6 +317,10 @@ static inline bool silentMode(void) {
return GLOBAL_Flags[VERBOSE_FLAG].at == TermSilent; return GLOBAL_Flags[VERBOSE_FLAG].at == TermSilent;
} }
static inline bool verboseMode(void) {
return GLOBAL_Flags[VERBOSE_FLAG].at != TermSilent;
}
static inline void setVerbosity(Term val) { static inline void setVerbosity(Term val) {
GLOBAL_Flags[VERBOSE_FLAG].at = val; GLOBAL_Flags[VERBOSE_FLAG].at = val;
} }

View File

@ -358,7 +358,7 @@ call_count_data/3 built-in.
YAP_FLAG(REPORT_ERROR_FLAG, "report_error", true, booleanFlag, "true", YAP_FLAG(REPORT_ERROR_FLAG, "report_error", true, booleanFlag, "true",
NULL), NULL),
YAP_FLAG(RESOURCE_DATABASE_FLAG, "resource_database", false, isatom, YAP_FLAG(RESOURCE_DATABASE_FLAG, "resource_database", false, isatom,
"boot.yap", NULL), "pl/boot.yap", NULL),
/**<`resource_database` /**<`resource_database`
Name of the resource file (saved-state or Prolog file) used to construct Name of the resource file (saved-state or Prolog file) used to construct
the YAP the YAP

View File

@ -179,15 +179,15 @@ INLINE_ONLY inline EXTERN void Yap_PutInHandle__(yhandle_t slot,
LOCAL_HandleBase[slot] = t; LOCAL_HandleBase[slot] = t;
} }
#ifndef max #ifndef Yap_Max
#define max(X, Y) (X > Y ? X : Y) #define Yap_Max(X, Y) (X > Y ? X : Y)
#endif #endif
#define ensure_handles ensure_slots #define ensure_handles ensure_slots
INLINE_ONLY inline EXTERN void ensure_slots(int N USES_REGS) { INLINE_ONLY inline EXTERN void ensure_slots(int N USES_REGS) {
if (LOCAL_CurHandle + N >= LOCAL_NHandles) { if (LOCAL_CurHandle + N >= LOCAL_NHandles) {
size_t inc = max(16 * 1024, LOCAL_NHandles / 2); // measured in cells size_t inc = Yap_Max(16 * 1024, LOCAL_NHandles / 2); // measured in cells
inc = max(inc, (size_t)N + 16); // measured in cells inc = Yap_Max(inc, (size_t)N + 16); // measured in cells
LOCAL_HandleBase = (CELL *)realloc(LOCAL_HandleBase, LOCAL_HandleBase = (CELL *)realloc(LOCAL_HandleBase,
(inc + LOCAL_NHandles) * sizeof(CELL)); (inc + LOCAL_NHandles) * sizeof(CELL));
LOCAL_NHandles += inc; LOCAL_NHandles += inc;

View File

@ -59,8 +59,9 @@ extern int pop_text_stack(int lvl USES_REGS);
extern void *protected_pop_text_stack(int lvl, void *safe, bool tmp, extern void *protected_pop_text_stack(int lvl, void *safe, bool tmp,
size_t sz USES_REGS); size_t sz USES_REGS);
#ifndef min #ifndef Yap_Min
#define min(x, y) (x < y ? x : y) #define Yap_Min(x, y) (x < y ? x : y)
#endif #endif
#define MBYTE (1024 * 1024) #define MBYTE (1024 * 1024)

View File

@ -8,6 +8,8 @@
# GMP_LIBRARY_DLL - library DLL to install. Only available on WIN32. # GMP_LIBRARY_DLL - library DLL to install. Only available on WIN32.
# GMP_LIBRARIES_DIR - the directory the library we link with is found in. # GMP_LIBRARIES_DIR - the directory the library we link with is found in.
message( "xxxxx ${ANDROID_ABI} yyyyy ${CMAKE_CURRENT_DIR} zzzzzzzzzz" )
if (ANDROID) if (ANDROID)
set( GMP_ROOT ${CMAKE_SOURCE_DIR}/../gmp/${ANDROID_ABI} ) set( GMP_ROOT ${CMAKE_SOURCE_DIR}/../gmp/${ANDROID_ABI} )
set (GMP_FOUND ON) set (GMP_FOUND ON)
@ -26,7 +28,8 @@ if(MSVC)
${CMAKE_SOURCE_DIR}/../tools/mpird/lib ${CMAKE_SOURCE_DIR}/../tools/mpird/lib
${CMAKE_SOURCE_DIR}/../mpir/lib ${CMAKE_SOURCE_DIR}/../mpir/lib
${CMAKE_SOURCE_DIR}/../mpird/lib ${CMAKE_SOURCE_DIR}/../mpird/lib
$ENV{PROGRAMFILES}/mpir/lib
$ENV{PROGRAMFILES}/mpir/lib
$ENV{PROGRAMFILES}/mpird/lib $ENV{PROGRAMFILES}/mpird/lib
$ENV{HOME}/mpir/lib $ENV{HOME}/mpir/lib
$ENV{HOME}/mpird/lib $ENV{HOME}/mpird/lib

View File

@ -7,7 +7,7 @@ if (POLICY CMP0042)
cmake_policy( SET CMP0042 NEW) cmake_policy( SET CMP0042 NEW)
endif() endif()
if (ANDROID) if (ANDROID_OLD)
macro ( MY_add_custom_target) macro ( MY_add_custom_target)
endmacro() endmacro()
else() else()
@ -17,7 +17,7 @@ else()
endif() endif()
if (ANDROID) if (ANDROID_OLD)
macro ( add_component arg1) macro ( add_component arg1)
foreach(item ${ARGN}) foreach(item ${ARGN})
get_filename_component(i ${item} ABSOLUTE) get_filename_component(i ${item} ABSOLUTE)
@ -41,7 +41,7 @@ else()
endmacro() endmacro()
endif() endif()
if (ANDROID) if (ANDROID_OLD)
macro ( MY_add_dependencies) macro ( MY_add_dependencies)
endmacro() endmacro()
else() else()
@ -50,7 +50,7 @@ else()
endmacro() endmacro()
endif() endif()
if (ANDROID) if (ANDROID_OLD)
macro ( MY_add_library) macro ( MY_add_library)
endmacro() endmacro()
else() else()
@ -68,7 +68,7 @@ else()
endmacro() endmacro()
endif() endif()
if (ANDROID) if (ANDROID_OLD)
macro ( MY_include) macro ( MY_include)
endmacro() endmacro()
else() else()
@ -86,7 +86,7 @@ else()
endmacro() endmacro()
endif() endif()
if (ANDROID) if (ANDROID_OLD)
macro ( MY_set_target_properties) macro ( MY_set_target_properties)
endmacro() endmacro()
else() else()
@ -95,7 +95,7 @@ else()
endmacro() endmacro()
endif() endif()
if (ANDROID) if (ANDROID_OLD)
macro ( MY_target_link_libraries) macro ( MY_target_link_libraries)
endmacro() endmacro()
else() else()

View File

@ -31,6 +31,8 @@
#endif #endif
#endif #endif
#include <encoding.h>
typedef struct { typedef struct {
dev_t st_dev; /* ID of device containing file */ dev_t st_dev; /* ID of device containing file */
mode_t st_mode; /* Mode of file (see below) */ mode_t st_mode; /* Mode of file (see below) */
@ -47,6 +49,7 @@ typedef struct {
#endif #endif
} vfs_stat; } vfs_stat;
typedef enum vfs_flags { typedef enum vfs_flags {
VFS_CAN_WRITE = 0x1, /// we can write to files in this space VFS_CAN_WRITE = 0x1, /// we can write to files in this space
VFS_CAN_EXEC = 0x2, /// we can execute files in this space VFS_CAN_EXEC = 0x2, /// we can execute files in this space
@ -62,7 +65,7 @@ typedef union {
size_t sz; size_t sz;
void *pt; void *pt;
uintptr_t scalar; uintptr_t scalar;
#if __ANDROID__ #if __ANDROID__0
AAssetManager *mgr; AAssetManager *mgr;
AAsset *asset; AAsset *asset;
#endif #endif
@ -108,6 +111,10 @@ typedef struct vfs {
extern VFS_t *GLOBAL_VFS; extern VFS_t *GLOBAL_VFS;
extern void init_android_stream(void);
extern void Yap_InitStdStream(int sno, SMALLUNSGN flags, FILE *file, VFS_t *vfsp);
static inline VFS_t *vfs_owner(const char *fname) { static inline VFS_t *vfs_owner(const char *fname) {
VFS_t *me = GLOBAL_VFS; VFS_t *me = GLOBAL_VFS;
int d; int d;

View File

@ -89,12 +89,12 @@ list(APPEND YAP_SYSTEM_OPTIONS "thread support")
# we use the nice UTF-8 package # we use the nice UTF-8 package
#available at the Julia project #available at the Julia project
MY_ADD_SUBDIRECTORY ( os ) ADD_SUBDIRECTORY ( os )
MY_ADD_SUBDIRECTORY ( OPTYap ) ADD_SUBDIRECTORY ( OPTYap )
MY_ADD_SUBDIRECTORY ( packages/myddas ) ADD_SUBDIRECTORY ( packages/myddas )
MY_ADD_SUBDIRECTORY ( utf8proc ) ADD_SUBDIRECTORY ( utf8proc )
MY_ADD_SUBDIRECTORY ( library/dialect/swi/fli ) ADD_SUBDIRECTORY ( library/dialect/swi/fli )
MY_ADD_SUBDIRECTORY ( CXX ) ADD_SUBDIRECTORY ( CXX )
if (READLINE_LIBS) if (READLINE_LIBS)
target_link_libraries(libYap ${READLINE_LIBS} ) target_link_libraries(libYap ${READLINE_LIBS} )

View File

@ -33,7 +33,7 @@ static char SccsId[] = "%W% %G%";
// for native asset manager // for native asset manager
#include <sys/types.h> #include <sys/types.h>
#if __ANDROID__ #if __ANDROID__0
static AAssetManager * getMgr(struct vfs *me) static AAssetManager * getMgr(struct vfs *me)
@ -212,7 +212,7 @@ VFS_t *
Yap_InitAssetManager(void) Yap_InitAssetManager(void)
{ {
#if __ANDROID__ #if __ANDROID__O
VFS_t *me; VFS_t *me;
/* init standard VFS */ /* init standard VFS */
me = (VFS_t *)Yap_AllocCodeSpace(sizeof(struct vfs)); me = (VFS_t *)Yap_AllocCodeSpace(sizeof(struct vfs));

View File

@ -288,7 +288,7 @@ static void InitFileIO(StreamDesc *s) {
Yap_DefaultStreamOps(s); Yap_DefaultStreamOps(s);
} }
static void InitStdStream(int sno, SMALLUNSGN flags, FILE *file, void *vfsp) { static void InitStdStream(int sno, SMALLUNSGN flags, FILE *file, VFS_t *vfsp) {
StreamDesc *s = &GLOBAL_Stream[sno]; StreamDesc *s = &GLOBAL_Stream[sno];
s->file = file; s->file = file;
s->status = flags; s->status = flags;
@ -298,7 +298,15 @@ static void InitStdStream(int sno, SMALLUNSGN flags, FILE *file, void *vfsp) {
s->vfs = vfsp; s->vfs = vfsp;
s->encoding = ENC_ISO_UTF8; s->encoding = ENC_ISO_UTF8;
INIT_LOCK(s->streamlock); INIT_LOCK(s->streamlock);
if (vfsp != NULL) {
s->u.private_data = vfsp->open(vfsp->name, (sno == StdInStream ? "read" : "write" ));
if (s->u.private_data == NULL) {
(PlIOError(EXISTENCE_ERROR_SOURCE_SINK, MkIntTerm(sno), "%s", vfsp->name));
return;
}
} else {
unix_upd_stream_info(s); unix_upd_stream_info(s);
}
/* Getting streams to prompt is a mess because we need for cooperation /* Getting streams to prompt is a mess because we need for cooperation
between readers and writers to the stream :-( between readers and writers to the stream :-(
*/ */
@ -329,6 +337,11 @@ static void InitStdStream(int sno, SMALLUNSGN flags, FILE *file, void *vfsp) {
#endif /* HAVE_SETBUF */ #endif /* HAVE_SETBUF */
} }
void Yap_InitStdStream(int sno, SMALLUNSGN flags, FILE *file, VFS_t *vfsp) {
InitStdStream(sno, flags, file, vfsp);
}
Term Yap_StreamUserName(int sno) { Term Yap_StreamUserName(int sno) {
Term atname; Term atname;
StreamDesc *s = &GLOBAL_Stream[sno]; StreamDesc *s = &GLOBAL_Stream[sno];
@ -344,13 +357,13 @@ static void InitStdStreams(void) {
CACHE_REGS CACHE_REGS
if (LOCAL_sockets_io) { if (LOCAL_sockets_io) {
InitStdStream(StdInStream, Input_Stream_f, NULL, NULL); InitStdStream(StdInStream, Input_Stream_f, NULL, NULL);
InitStdStream(StdOutStream, Output_Stream_f, NULL, NULL); InitStdStream(StdOutStream, Output_Stream_f, NULL, NULL);
InitStdStream(StdErrStream, Output_Stream_f, NULL, NULL); InitStdStream(StdErrStream, Output_Stream_f, NULL, NULL);
} else { } else {
InitStdStream(StdInStream, Input_Stream_f, stdin, NULL); InitStdStream(StdInStream, Input_Stream_f, stdin, NULL);
InitStdStream(StdOutStream, Output_Stream_f, stdout, NULL); InitStdStream(StdOutStream, Output_Stream_f, stdout, NULL);
InitStdStream(StdErrStream, Output_Stream_f, stderr, NULL); InitStdStream(StdErrStream, Output_Stream_f, stderr, NULL);
} }
GLOBAL_Stream[StdInStream].name = Yap_LookupAtom("user_input"); GLOBAL_Stream[StdInStream].name = Yap_LookupAtom("user_input");
GLOBAL_Stream[StdOutStream].name = Yap_LookupAtom("user_output"); GLOBAL_Stream[StdOutStream].name = Yap_LookupAtom("user_output");
GLOBAL_Stream[StdErrStream].name = Yap_LookupAtom("user_error"); GLOBAL_Stream[StdErrStream].name = Yap_LookupAtom("user_error");
@ -1073,6 +1086,7 @@ bool Yap_initStream(int sno, FILE *fd, const char *name, Term file_name,
st->encoding = encoding; st->encoding = encoding;
} }
if (name == NULL) { if (name == NULL) {
char buf[YAP_FILENAME_MAX + 1]; char buf[YAP_FILENAME_MAX + 1];
name = Yap_guessFileName(fd, sno, buf, YAP_FILENAME_MAX); name = Yap_guessFileName(fd, sno, buf, YAP_FILENAME_MAX);

View File

@ -300,7 +300,7 @@ has_reposition(int sno,
} }
char *Yap_guessFileName(FILE *file, int sno, char *nameb, size_t max) { char *Yap_guessFileName(FILE *file, int sno, char *nameb, size_t max) {
size_t maxs = max(255, max); size_t maxs = Yap_Max(255, max);
if (!nameb) { if (!nameb) {
nameb = malloc(maxs + 1); nameb = malloc(maxs + 1);
} }

View File

@ -954,16 +954,16 @@ static bool initSysPath(Term tlib, Term tcommons, bool dir_done,
if ((dir = Yap_RegistryGetString("library")) && is_directory(dir)) { if ((dir = Yap_RegistryGetString("library")) && is_directory(dir)) {
dir_done = true; dir_done = true;
if (!Yap_unify(tlib, MkAtomTerm(Yap_LookupAtom(dir)))) if (!Yap_unify(tlib, MkAtomTerm(Yap_LookupAtom(dir))))
return FALSE; return false;
} }
if ((dir = Yap_RegistryGetString("prolog_commons")) && is_directory(dir)) { if ((dir = Yap_RegistryGetString("prolog_commons")) && is_directory(dir)) {
if (!Yap_unify(tcommons, MkAtomTerm(Yap_LookupAtom(dir)))) if (!Yap_unify(tcommons, MkAtomTerm(Yap_LookupAtom(dir))))
return FALSE; return false;
commons_done = true; commons_done = true;
} }
} }
if (dir_done && commons_done) if (dir_done && commons_done)
return TRUE; return true;
#endif #endif
strncpy(LOCAL_FileNameBuf, YAP_SHAREDIR, YAP_FILENAME_MAX); strncpy(LOCAL_FileNameBuf, YAP_SHAREDIR, YAP_FILENAME_MAX);
strncat(LOCAL_FileNameBuf, "/", YAP_FILENAME_MAX); strncat(LOCAL_FileNameBuf, "/", YAP_FILENAME_MAX);
@ -972,7 +972,7 @@ static bool initSysPath(Term tlib, Term tcommons, bool dir_done,
strncat(LOCAL_FileNameBuf, "Yap", YAP_FILENAME_MAX); strncat(LOCAL_FileNameBuf, "Yap", YAP_FILENAME_MAX);
if (is_directory(LOCAL_FileNameBuf)) { if (is_directory(LOCAL_FileNameBuf)) {
if (!Yap_unify(tlib, MkAtomTerm(Yap_LookupAtom(LOCAL_FileNameBuf)))) if (!Yap_unify(tlib, MkAtomTerm(Yap_LookupAtom(LOCAL_FileNameBuf))))
return FALSE; return false;
dir_done = true; dir_done = true;
} }
} }
@ -1035,15 +1035,15 @@ static bool initSysPath(Term tlib, Term tcommons, bool dir_done,
if (!dir_done && is_directory(LOCAL_FileNameBuf)) { if (!dir_done && is_directory(LOCAL_FileNameBuf)) {
if (!Yap_unify(tlib, MkAtomTerm(Yap_LookupAtom(LOCAL_FileNameBuf)))) if (!Yap_unify(tlib, MkAtomTerm(Yap_LookupAtom(LOCAL_FileNameBuf))))
return FALSE; return FALSE;
dir_done = true;
} }
dir_done = true;
LOCAL_FileNameBuf[len] = '\0'; LOCAL_FileNameBuf[len] = '\0';
strncat(LOCAL_FileNameBuf, "PrologCommons", YAP_FILENAME_MAX); strncat(LOCAL_FileNameBuf, "PrologCommons", YAP_FILENAME_MAX);
if (!commons_done && is_directory(LOCAL_FileNameBuf)) { if (!commons_done && is_directory(LOCAL_FileNameBuf)) {
if (!Yap_unify(tcommons, MkAtomTerm(Yap_LookupAtom(LOCAL_FileNameBuf)))) if (!Yap_unify(tcommons, MkAtomTerm(Yap_LookupAtom(LOCAL_FileNameBuf))))
return FALSE; return FALSE;
}
commons_done = true; commons_done = true;
}
#endif #endif
return dir_done && commons_done; return dir_done && commons_done;
} }

View File

@ -685,7 +685,7 @@ void init_myddas(void) {
#if defined MYDDAS_ODBC #if defined MYDDAS_ODBC
Yap_InitBackMYDDAS_ODBCPreds(); Yap_InitBackMYDDAS_ODBCPreds();
#endif #endif
#if defined MYDDAS_SQLITE3 #if WIN32
Yap_InitBackMYDDAS_SQLITE3Preds(); Yap_InitBackMYDDAS_SQLITE3Preds();
#endif #endif
#if defined USE_MYDDAS #if defined USE_MYDDAS
@ -697,7 +697,7 @@ void init_myddas(void) {
#if defined MYDDAS_ODBC #if defined MYDDAS_ODBC
Yap_InitMYDDAS_ODBCPreds(); Yap_InitMYDDAS_ODBCPreds();
#endif #endif
#if defined MYDDAS_SQLITE3 #if WIN32
Yap_InitMYDDAS_SQLITE3Preds(); Yap_InitMYDDAS_SQLITE3Preds();
#endif #endif
#if defined USE_MYDDAS #if defined USE_MYDDAS

View File

@ -39,11 +39,17 @@ function(cpp_compile output filename)
set_source_files_properties(${outfile} PROPERTIES GENERATED TRUE) set_source_files_properties(${outfile} PROPERTIES GENERATED TRUE)
endfunction() endfunction()
if (ANDROID)
set (MYDDAS_PL_OUTDIR ${YAP_APP_DIR}/src/generated/assets/Yap} )
else()
set (MYDDAS_PL_OUTDIR ${CMAKE_CURRENT_BINARY_DIR} )
endif()
function(cpp_driver output dbms filename) function(cpp_driver output dbms filename)
if (0) if (0)
set(outfile ${libpl}/myddas_${dbms}.yap) set(outfile ${MYDDAS_PL_OUTDIR}/myddas_${dbms}.yap)
else() else()
set(outfile ${CMAKE_CURRENT_BINARY_DIR}/myddas_${dbms}.yap) set(outfile ${MYDDAS_PL_OUTDIR}/myddas_${dbms}.yap)
endif() endif()
set(${output} ${${output}} ${outfile} PARENT_SCOPE) set(${output} ${${output}} ${outfile} PARENT_SCOPE)
IF (MSVC) IF (MSVC)
@ -74,3 +80,4 @@ add_custom_target(plmyddas ALL DEPENDS ${MYDDAS_YAP} )
install(FILES ${MYDDAS_YAP} install(FILES ${MYDDAS_YAP}
DESTINATION ${libpl} DESTINATION ${libpl}
) )

View File

@ -40,14 +40,14 @@ src/Android/jni/sqlite/android_database_SQLiteConnection.cpp
src/Android/jni/sqlite/android_database_SQLiteDebug.cpp src/Android/jni/sqlite/android_database_SQLiteDebug.cpp
src/Android/jni/sqlite/android_database_SQLiteGlobal.cpp src/Android/jni/sqlite/android_database_SQLiteGlobal.cpp
src/Android/jni/sqlite/nativehelper/jni.h src/Android/jni/sqlite/nativehelper/jni.h
src/Android/jni/sqlite/nativehelper/jniConstants.h src/Android/jni/sqlite/nativehelper/JniConstants.h
src/Android/jni/sqlite/nativehelper/JNIHelp.h src/Android/jni/sqlite/nativehelper/JNIHelp.h
src/Android/jni/sqlite/nativehelper/ScopedLocalRef.h src/Android/jni/sqlite/nativehelper/ScopedLocalRef.h
) )
endif (ANDROID) endif (ANDROID)
add_component( Yapsqlite3 add_library( Yapsqlite3 SHARED
${YAPSQLITE3_SOURCES} ) ${YAPSQLITE3_SOURCES} )
MY_set_target_properties(Yapsqlite3 MY_set_target_properties(Yapsqlite3
@ -56,3 +56,9 @@ add_component( Yapsqlite3
# SOVERSION ${LIBYAPTAI_MAJOR_VERSION}.${LIBYAPTAI_MINOR_VERSION} # SOVERSION ${LIBYAPTAI_MAJOR_VERSION}.${LIBYAPTAI_MINOR_VERSION}
POSITION_INDEPENDENT_CODE TRUE POSITION_INDEPENDENT_CODE TRUE
) )
if (ANDROID)
target_link_libraries(Yapsqlite3 android log)
endif ()

View File

@ -676,6 +676,17 @@ void init_sqlite3( void )
Yap_InitBackMYDDAS_SQLITE3Preds(); Yap_InitBackMYDDAS_SQLITE3Preds();
} }
#if _ANDROID_
JNIEXPORT void JNICALL
lib_yap_up_pt_init_sqlite(JNIEnv *env);
JNIEXPORT void JNICALL
lib_yap_up_pt_init_sqlite(JNIEnv *env)
{
init_sqlite3();
}
#endif
#ifdef _WIN32 #ifdef _WIN32

View File

@ -360,23 +360,22 @@ static jlong nativePrepareStatement(JNIEnv *env, jclass clazz,
int err = sqlite3_prepare16_v2(connection->db, sql, sqlLength * sizeof(jchar), int err = sqlite3_prepare16_v2(connection->db, sql, sqlLength * sizeof(jchar),
&statement, NULL); &statement, NULL);
env->ReleaseStringCritical(sqlString, sql); env->ReleaseStringCritical(sqlString, sql);
#if 0
if (err != SQLITE_OK) { if (err != SQLITE_OK) {
// Error messages like 'near ")": syntax error' are not // Error messages like 'near ")": syntax error' are not
// always helpful enough, so construct an error string that // always helpful enough, so construct an error string that
// includes the query itself. // includes the query itself.
const char *query = env->GetStringUTFChars(sqlString, NULL); const char *query = env->GetStringUTFChars(sqlString, NULL);
char *message = (char *)malloc(strlen(query) + 50); char *message[512];
if (message) { if (message) {
strcpy(message, ", while compiling: "); // less than 50 chars strcpy(message, ", while compiling: "); // less than 50 chars
strcat(message, query); strcat(message, query);
} }
env->ReleaseStringUTFChars(sqlString, query); env->ReleaseStringUTFChars(sqlString, query);
throw_sqlite3_exception(env, connection->db, message); throw_sqlite3_exception(env, connection->db, message);
free(message);
return 0; return 0;
} }
#endif
ALOGV("Prepared statement %p on connection %p", statement, connection->db); ALOGV("Prepared statement %p on connection %p", statement, connection->db);
return reinterpret_cast<jlong>(statement); return reinterpret_cast<jlong>(statement);
} }

View File

@ -14,6 +14,8 @@ add_library (YAPPython SHARED pyload.c ${PYTHON_HEADERS} )
if (WIN32) if (WIN32)
add_library (Py4YAP OBJECT ${PYTHON_SOURCES} ${PYTHON_HEADERS}) add_library (Py4YAP OBJECT ${PYTHON_SOURCES} ${PYTHON_HEADERS})
target_link_libraries(YAPPython libYap ${PYTHON_LIBRARIES})
else() else()
add_library (Py4YAP SHARED ${PYTHON_SOURCES} ${PYTHON_HEADERS}) add_library (Py4YAP SHARED ${PYTHON_SOURCES} ${PYTHON_HEADERS})
@ -21,7 +23,6 @@ add_library (Py4YAP SHARED ${PYTHON_SOURCES} ${PYTHON_HEADERS})
set_property(TARGET Py4YAP PROPERTY CXX_STANDARD_REQUIRED ON) set_property(TARGET Py4YAP PROPERTY CXX_STANDARD_REQUIRED ON)
target_link_libraries(Py4YAP libYap ${PYTHON_LIBRARIES}) target_link_libraries(Py4YAP libYap ${PYTHON_LIBRARIES})
target_link_libraries(YAPPython Py4YAP)
MY_install(TARGETS Py4YAP MY_install(TARGETS Py4YAP
LIBRARY DESTINATION ${libdir} LIBRARY DESTINATION ${libdir}
@ -33,7 +34,6 @@ endif()
# arithmetic hassle. # arithmetic hassle.
set_property(TARGET YAPPython PROPERTY CXX_STANDARD_REQUIRED ON) set_property(TARGET YAPPython PROPERTY CXX_STANDARD_REQUIRED ON)
target_link_libraries(YAPPython libYap ${PYTHON_LIBRARIES})
set_property( SOURCE ${PYTHON_SOURCES} APPEND PROPERTY COMPILE_DEFINITIONS YAP_KERNEL=1 _GNU_SOURCE=1) set_property( SOURCE ${PYTHON_SOURCES} APPEND PROPERTY COMPILE_DEFINITIONS YAP_KERNEL=1 _GNU_SOURCE=1)

View File

@ -114,3 +114,142 @@ install(FILES ${PROLOG_SOURCES} DESTINATION ${libpl})
add_dependencies(${SWIG_MODULE_ftdi1_REAL_NAME} doc_i) add_dependencies(${SWIG_MODULE_ftdi1_REAL_NAME} doc_i)
ENDIF () ENDIF ()
# This is a CMake example for Python
#INCLUDE(NewUseSWIG)
include(FindPythonModule)
set (PROLOG_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/yapi.yap
${CMAKE_CURRENT_SOURCE_DIR}/jupyter.yap)
set (PYTHON_SOURCES
${CMAKE_CURRENT_SOURCE_DIR}/yap4py/yapi.py
${CMAKE_CURRENT_SOURCE_DIR}/yap4py/__init__.py
${CMAKE_CURRENT_SOURCE_DIR}/yap4py/__main__.py
)
set (PL ${pl_library} ${PROLOG_SOURCES} )
set (python_dlls
$<TARGET_FILE:libYap>
$<TARGET_FILE:YAPPython>
$<TARGET_FILE:matrix>
$<TARGET_FILE:regexp>
$<TARGET_FILE:yap_rl>
$<TARGET_FILE:tries>
$<TARGET_FILE:itries>
$<TARGET_FILE:sys>
$<TARGET_FILE:yap_random>
)
if (TARGET real)
list(APPEND python_dlls $<TARGET_FILE:real>
)
endif()
if (NOT WIN32)
list(APPEND python_dlls $<TARGET_FILE:YAP++>
)
endif()
file(RELATIVE_PATH RELATIVE_SOURCE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR})
configure_file("setup.py.in" ${CMAKE_CURRENT_BINARY_DIR}/setup.py)
configure_file("MANIFEST.in" ${CMAKE_CURRENT_BINARY_DIR}/MANIFEST.in)
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/YAP4PY.md" ${CMAKE_CURRENT_BINARY_DIR}/README)
INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_PATH})
INCLUDE_DIRECTORIES("${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_SOURCE_DIR}/CXX")
SET_SOURCE_FILES_PROPERTIES(../../swig/yap.i PROPERTIES CPLUSPLUS ON)
SET_SOURCE_FILES_PROPERTIES(../../swig/yap.i PROPERTIES SWIG_FLAGS "-O;-py3")
SET_SOURCE_FILES_PROPERTIES(../../swig/yap.i PROPERTIES SWIG_MODULE_NAME yap)
if (WIN32)
#set (SYS_DLLS ${GMP_LIBRARIES} c:/msys64/mingw64/bin/libgmp-10.dll)
endif()
# inform we are compiling YAP
# s used in MSYS
#
#
# INSTALL ( TARGETS ${SWIG_MODULE_Py2YAP_REAL_NAME}
# RUNTIME DESTINATION ${PYTHON_MODULE_PATH}
# ARCHIVE DESTINATION ${PYTHON_MODULE_PATH}
# LIBRARY DESTINATION ${PYTHON_MODULE_PATH}
# )
add_custom_target( YAP4PY_SETUP_DIRS
COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/yap4py
COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/yap4py/prolog
COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/yap4py/prolog/pl
COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/yap4py/prolog/os
)
add_custom_COMMAND( OUTPUT yap4py/prolog/lists,yap
COMMAND ${CMAKE_COMMAND} -E copy ${PL} yap4py/prolog
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
DEPENDS YAP4PY_SETUP_DIRS ${PL} )
add_custom_COMMAND( OUTPUT yap4py/prolog/pl/boot.yap
COMMAND ${CMAKE_COMMAND} -E copy ${pl_boot_library} yap4py/prolog/pl
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
DEPENDS YAP4PY_SETUP_DIRS ${pl_boot_library} )
add_custom_COMMAND( OUTPUT yap4py/prolog/os/yio.yap
COMMAND ${CMAKE_COMMAND} -E copy ${pl_os_library} yap4py/prolog/os
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
DEPENDS YAP4PY_SETUP_DIRS ${pl_os_library} )
add_custom_COMMAND( OUTPUT yap4py/startup.yss
COMMAND ${CMAKE_COMMAND} -E copy ${PYTHON_SOURCES} ${python_dlls} ${CMAKE_BINARY_DIR}/startup.yss yap4py
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
DEPENDS YAP4PY_SETUP_DIRS STARTUP )
add_custom_target( YAP4PY ALL
COMMAND ${SWIG_EXECUTABLE} -python -modern -c++ -py3 -DX_API -I${CMAKE_SOURCE_DIR}/CXX -I${CMAKE_SOURCE_DIR}/include -I${CMAKE_SOURCE_DIR}/H -I${CMAKE_SOURCE_DIR}/H/generated -I${CMAKE_SOURCE_DIR}/OPTYap -I../../.. -o yap_wrap.cpp yap.i
COMMAND ${PYTHON_EXECUTABLE} setup.py sdist bdist_conda
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
DEPENDS yap4py/yapi.py yap4py/prolog/lists,yap yap4py/prolog/pl/boot.yap yap4py/startup.yss yap4py/prolog/os/yio.yap )
install(CODE "execute_process"
COMMAND ${PYTHON_EXECUTABLE} -m pip install --force --no-index -f packages/python/swig/dist YAP4PY
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
DEPENDS YAP4PY ${CMAKE_BINARY_DIR}/${YAP_STARTUP} ${dlls} )
install(FILES ${PROLOG_SOURCES} DESTINATION ${libpl})
if (WITH_DOCS AND DOXYGEN_FOUND)
set(CMAKE_SWIG_FLAGS -DDOXYGEN=${DOXYGEN_FOUND})
# Run doxygen to only generate the xml
add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/doc/xml/ftdi_8c.xml
COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/doc
COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_BINARY_DIR}/Doxyfile.xml
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
DEPENDS ${c_headers};${c_sources};${cpp_sources};${cpp_headers}
)
# generate .i from doxygen .xml
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/ftdi1_doc.i
COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/doxy2swig.py -n
${CMAKE_BINARY_DIR}/doc/xm11l/ftdi_8c.xml
${CMAKE_CURRENT_BINARY_DIR}/ftdi1_doc.i
DEPENDS ${CMAKE_BINARY_DIR}/doc/xml/ftdi_8c.xml
)
add_custom_target(doc_i DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/ftdi1_doc.i)
add_dependencies(${SWIG_MODULE_ftdi1_REAL_NAME} doc_i)
ENDIF ()
>>>>>>> 11e81b457dcc145e07b457482698a90e0ec350a2

View File

@ -1,8 +1,9 @@
# include COPYING.md
# include CONTRIBUTING.md # include CONTRIBUTING.md
include README.md include README.md
recursive-include * *.* recursive-include yap4py/prolog *.*
recursive-include html *.*
recursive-include docs *.*
# Documentation # Documentation
graft docs graft docs

View File

@ -20,6 +20,7 @@ else:
dll = glob.glob(os.path.join(yap_lib_path,dll))[0] dll = glob.glob(os.path.join(yap_lib_path,dll))[0]
dll = os.path.abspath(dll) dll = os.path.abspath(dll)
ctypes.CDLL(dll, mode=ctypes.RTLD_GLOBAL) ctypes.CDLL(dll, mode=ctypes.RTLD_GLOBAL)
load('libYap*') if platform.system() == 'Apple'::
load('libYAP+*') load('libYap*')
load('libPy4YAP*') load('libYAP+*')
load('libPy4YAP*')

View File

@ -1,10 +0,0 @@
"""The main routine of the yap python project."""
import sys
import yapi
"""The main routine."""
if args is None:
args = sys.argv[1:]
yap4pi.yapi.live(args)

View File

@ -0,0 +1,6 @@
[build]
compiler=mingw32
[build_ext]
compiler=mingw32

View File

@ -1,163 +1,171 @@
#!/usr/bin/env python #!/usr/bin/env python
# coding: utf-8 # coding: utf-8
# Copyright (c) IPython Development Team. # Copyright (c) IPython Development Team.
# Distributed under the terms of the Modified BSD License. # Distributed under the terms of the Modified BSD License.
from __future__ import print_function from __future__ import print_function
from setuptools import setup from setuptools import setup
from setuptools.extension import Extension from setuptools.extension import Extension
from codecs import open from codecs import open
from os import path, makedirs, walk from os import path, makedirs, walk
from shutil import copytree, rmtree, copy2, move from shutil import copytree, rmtree, copy2, move
from glob import glob from glob import glob
from pathlib import Path from pathlib import Path
import platform import platform
import os.path import os.path
# the name of the package # the name of the package
name = 'YAP4PY' name = 'YAP4PY'
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
# Minimal Python version sanity check # Minimal Python version sanity check
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
import sys import sys
v = sys.version_info v = sys.version_info
if v[:2] < (2, 7) or (v[0] >= 3 and v[:2] < (3, 3)): if v[:2] < (2, 7) or (v[0] >= 3 and v[:2] < (3, 3)):
error = "ERROR: %s requires Python version 2.7 or 3.3 or above." % name error = "ERROR: %s requires Python version 2.7 or 3.3 or above." % name
print(error, file=sys.stderr) print(error, file=sys.stderr)
sys.exit(1) sys.exit(1)
PY3 = (sys.version_info[0] >= 3) PY3 = (sys.version_info[0] >= 3)
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
# get on with it # get on with it
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
from codecs import open from codecs import open
from os import path, makedirs, walk from os import path, makedirs, walk
from shutil import copytree, rmtree, copy2, move from shutil import copytree, rmtree, copy2, move
from glob import glob from glob import glob
from pathlib import Path from pathlib import Path
import platform import platform
import os.path import os.path
import os import os
import shutil import shutil
from distutils.core import setup from distutils.core import setup
pjoin = os.path.join pjoin = os.path.join
here = os.path.abspath(os.path.dirname(__file__)) here = os.path.abspath(os.path.dirname(__file__))
pkg_root = pjoin(here, name) pkg_root = pjoin(here, name)
my_extra_link_args = [] my_extra_link_args = []
if platform.system() == 'Windows': if platform.system() == 'Windows':
local_libs = [] local_libs = []
win_libs = ['wsock32','ws2_32'] win_libs = ['wsock32','ws2_32']
my_extra_link_args = ['-Wl,-export-all-symbols'] my_extra_link_args = ['-Wl,-export-all-symbols']
else: else:
# if platform.system() == 'Darwin': # if platform.system() == 'Darwin':
my_extra_link_args = ['-Wl,-rpath', '-Wl,${_ABS_PYTHON_MODULE_PATH}'] my_extra_link_args = ['-Wl,-rpath', '-Wl,${_ABS_PYTHON_MODULE_PATH}']
win_libs = [] win_libs = []
local_libs = ['YAP++','Py4YAP'] local_libs = ['YAP++','Py4YAP']
# or dll in glob('yap/dlls/*'): # or dll in glob('yap/dlls/*'):
# move( dll ,'lib' ) # move( dll ,'lib' )
cplus = [''] cplus = ['']
bpy2yap = [] bpy2yap = []
native_sources = ['yap_wrap.cpp'] native_sources = ['yap_wrap.cpp']
here = path.abspath(path.dirname(__file__)) here = path.abspath(path.dirname(__file__))
gmp_dir = path.abspath(path.dirname("${GMP_LIBRARIES}"))
# Get the long description from the README file python_libdir = path.abspath(path.dirname("${PYTHON_LIBRARIES}"))
# Get the long description from the README file
extensions = [Extension('_yap', native_sources,
define_macros=[('MAJOR_VERSION', '1'),
('MINOR_VERSION', '0'), extensions = [Extension('_yap', native_sources,
('_YAP_NOT_INSTALLED_', '1'), define_macros=[('MAJOR_VERSION', '1'),
('YAP_PYTHON', '1'), ('MINOR_VERSION', '0'),
('_GNU_SOURCE', '1')], ('_YAP_NOT_INSTALLED_', '1'),
runtime_library_dirs=['yap4py', '${libdir}', '${bindir}'], ('YAP_PYTHON', '1'),
swig_opts=['-modern', '-c++', '-py3', ('_GNU_SOURCE', '1')],
'-DX_API', '-I${CMAKE_SOURCE_DIR}/CXX', '-I${CMAKE_SOURCE_DIR}/include', runtime_library_dirs=['yap4py', '${libdir}', '${bindir}', '${gmp_dir}', '${python_libdir}'],
'-I${CMAKE_SOURCE_DIR}/H', '-I${CMAKE_SOURCE_DIR}/H/generated', swig_opts=['-modern', '-c++', '-py3',
'-I${CMAKE_SOURCE_DIR}/os', '-I${CMAKE_SOURCE_DIR}/OPTYap', '-I../../..'], '-DX_API', '-I${CMAKE_SOURCE_DIR}/CXX', '-I${CMAKE_SOURCE_DIR}/include',
library_dirs=['../../..', '../../../CXX', '..', "${dlls}", "${bindir}", '.'], '-I${CMAKE_SOURCE_DIR}/H', '-I${CMAKE_SOURCE_DIR}/H/generated',
extra_link_args=my_extra_link_args, '-I${CMAKE_SOURCE_DIR}/os', '-I${CMAKE_SOURCE_DIR}/OPTYap', '-I../../..'],
libraries=['Yap','${PYTHON_LIBRARIES}','${GMP_LIBRARIES}']+win_libs+local_libs, library_dirs=['../../..', '../../../CXX', '..', "${dlls}", "${bindir}", 'c:/Anaconda3'],
include_dirs=['../../..', extra_link_args=my_extra_link_args,
'${GMP_INCLUDE_DIRS}', libraries=['Yap','gmp']+win_libs+local_libs,
'${CMAKE_SOURCE_DIR}/H', include_dirs=['../../..',
'${CMAKE_SOURCE_DIR}/H/generated', '${GMP_INCLUDE_DIRS}',
'${CMAKE_SOURCE_DIR}/OPTYap', '${CMAKE_SOURCE_DIR}/H',
'${CMAKE_SOURCE_DIR}/os', '${CMAKE_SOURCE_DIR}/H/generated',
'${CMAKE_SOURCE_DIR}/include', '${CMAKE_SOURCE_DIR}/OPTYap',
'${CMAKE_SOURCE_DIR}/CXX', '.'] '${CMAKE_SOURCE_DIR}/os',
)] '${CMAKE_SOURCE_DIR}/include',
'${CMAKE_SOURCE_DIR}/CXX', '.']
packages = ['yap4py'] )]
packages = ['yap4py']
def visit(d0, pls):
for (r, ds, fs) in walk('.'):
for f in fs: def visit(d0, pls):
f0, ext = os.path.splitext(f) for (r, ds, fs) in walk('.'):
if (ext == 'yap' or ext == 'pl' or ext == 'so' or ext == 'dll' or ext == 'yss'): for f in fs:
pls += [os.path.join(r, f)] f0, ext = os.path.splitext(f)
for i in ds: if (ext == 'yap' or ext == 'pl' or ext == 'so' or ext == 'dll' or ext == 'yss'):
pls = visit(os.path.join(d0, i), pls) pls += [os.path.join(r, f)]
return pls for i in ds:
pls = visit(os.path.join(d0, i), pls)
return pls
package_data = {
'': visit('.', [])
} package_data = {
'yap4py.prolog': """${PL}""".split(sep=";")
version_ns = {'__version__': '6.3.5', 'minor-version': '6', 'minor-version': '3', 'patch': '5'} }
setup_args = dict( version_ns = {'__version__': '6.3.5', 'minor-version': '6', 'minor-version': '3', 'patch': '5'}
name=name,
version=version_ns['__version__'], setup_args = dict(
scripts=glob(pjoin('scripts', '*')), name=name,
packages=packages, version=version_ns['__version__'],
py_modules=['yap'], scripts=glob(pjoin('scripts', '*')),
package_data=package_data, packages=packages,
include_package_data=True, py_modules=['yap'],
description="YAP in Python", package_data=package_data,
author='YAP Development Team', include_package_data=True,
author_email='ipython-dev@scipy.org', requirements=[
url='http://ipython.org', 'm2w64-gmp',
license='BSD', 'm2-msys2-keyring',
ext_modules=extensions, 'm2-msys2-launcher-git',
platforms="Linux, Mac OS X, Windows", 'm2-msys2-runtime',
keywords=['Interactive', 'Interpreter', 'Shell', 'Web'], ],
classifiers=[ description="YAP in Python",
'Intended Audience :: Developers', author='YAP Development Team',
'Intended Audience :: System Administrators', author_email='ipython-dev@scipy.org',
'Intended Audience :: Science/Research', url='http://ipython.org',
'License :: OSI Approved :: BSD License', license='BSD',
'Programming Language :: Python', ext_modules=extensions,
'Programming Language :: Python :: 2.7', platforms="Linux, Mac OS X, Windows",
'Programming Language :: Python :: 3', keywords=['Interactive', 'Interpreter', 'Shell', 'Web'],
], classifiers=[
) 'Intended Audience :: Developers',
'Intended Audience :: System Administrators',
if 'develop' in sys.argv or any(a.startswith('bdist') for a in sys.argv): 'Intended Audience :: Science/Research',
import setuptools 'License :: OSI Approved :: BSD License',
'Programming Language :: Python',
setuptools_args = {} 'Programming Language :: Python :: 2.7',
install_requires = setuptools_args['install_requires'] = [ 'Programming Language :: Python :: 3',
] ],
)
extras_require = setuptools_args['extras_require'] = {
'test:python_version=="2.7"': ['mock'], if 'develop' in sys.argv or any(a.startswith('bdist') for a in sys.argv):
'test': ['nose_warnings_filters', 'nose-timer'], import setuptools
}
setuptools_args = {}
if 'setuptools' in sys.modules: install_requires = setuptools_args['install_requires'] = [
setup_args.update(setuptools_args) ]
if __name__ == '__main__': extras_require = setuptools_args['extras_require'] = {
setup(**setup_args) 'test:python_version=="2.7"': ['mock'],
'test': ['nose_warnings_filters', 'nose-timer'],
}
if 'setuptools' in sys.modules:
setup_args.update(setuptools_args)
if __name__ == '__main__':
setup(**setup_args)

View File

@ -1 +1,14 @@
"""The main routine of the yap python project."""
import sys
import yap4py.yapi import yap4py.yapi
def main(**args):
"""The main routine."""
if args is None:
args = sys.argv[1:]
if __name__ == "__main__":
main()
yap4py.yapi.live()

View File

@ -8,12 +8,14 @@
# This is a CMake example for Python and Java # This is a CMake example for Python and Java
set (SOURCES yap.i)
INCLUDE(${SWIG_USE_FILE}) INCLUDE(${SWIG_USE_FILE})
if (ANDROID) if (ANDROID)
add_subdirectory(android) add_subdirectory(android)
else(ANDROID) else(ANDROID)
# add_subdirectory(java) add_subdirectory(java)
endif(ANDROID) endif(ANDROID)
set_property( DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS SWIGYAP=1) set_property( DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS SWIGYAP=1)

View File

@ -1,21 +1,72 @@
# This is a CMake example for Python and Java # This is a CMake file for SWIG and Android
FILE( MAKE_DIRECTORY ${YAP_APP_DIR}/src/generated/java/pt/up/yap/lib )
FILE( MAKE_DIRECTORY ${YAP_APP_DIR}/src/generated/assets)
set(CMAKE_SWIG_OUTDIR ${YAP_APP_DIR}/src/generated/java/pt/up/yap/lib )
set( SWIG_MODULE_NAME pt.up.yap.lib )
set ( pllib ${YAP_APP_DIR}/src/generated/assets/Yap )
set(CMAKE_SWIG_OUTDIR ${YAP_APP_DIR}/app/src/main/java/pt/up/yap/lib ) set ( SWIG_SOURCES ${CMAKE_SOURCE_DIR}/packages/swig/yap.i )
set ( SWIG_SOURCES ../yap.i )
SET_SOURCE_FILES_PROPERTIES(${SWIG_SOURCES} PROPERTIES CPLUSPLUS ON) SET_SOURCE_FILES_PROPERTIES(${SWIG_SOURCES} PROPERTIES CPLUSPLUS ON)
include_directories ( include_directories (
${CMAKE_SOURCE_DIR}/CXX ${CMAKE_SOURCE_DIR}/CXX
) )
set( GMP_ROOT ${CMAKE_SOURCE_DIR}/../gmp/${ANDROID_ABI} )
set (GMP_INCLUDE_DIRS ${GMP_ROOT})
set (GMP_LIBRARIES ${GMP_ROOT}/libgmp.so)
add_custom_command (OUTPUT yap_swig.cpp add_custom_command (OUTPUT yap_swig.cpp
COMMAND ${SWIG} -java -outdir ${CMAKE_SWIG_OUTDIR} -outcurrentdir -addextern -I${CMAKE_SOURCE_DIR}/CXX ${SWIG_SOURCES} -o yap_swig.cpp COMMAND ${CMAKE_COMMAND} -E make_directory ${pllib}
) COMMAND ${CMAKE_COMMAND} -E make_directory ${pllib}/pl
COMMAND ${CMAKE_COMMAND} -E make_directory ${pllib}/os
add_custom_target ( swig ALL COMMAND ${CMAKE_COMMAND} -E copy ${pl_library} ${pllib}
DEPENDS yap_swig.cpp COMMAND ${CMAKE_COMMAND} -E copy ${pl_boot_library} ${pllib}/pl
) COMMAND ${CMAKE_COMMAND} -E copy ${pl_os_library} ${pllib}/os
COMMAND ${SWIG_EXECUTABLE} -c++ -java -package ${SWIG_MODULE_NAME} -outdir ${CMAKE_SWIG_OUTDIR} -outcurrentdir -addextern -I${CMAKE_SOURCE_DIR}/CXX -I${CMAKE_SOURCE_DIR}/include -I${CMAKE_SOURCE_DIR}/H -I${CMAKE_SOURCE_DIR}/os -I${CMAKE_SOURCE_DIR}/OPTYap -I${CMAKE_BINARY_DIR} -I${GMP_INCLUDE_DIRS} -DX_API="" -o yap_swig.cpp ${SWIG_SOURCES}
DEPENDS ${SWIG_SOURCES} YAP++
)
add_custom_command (OUTPUT swig_streamer.cpp
COMMAND ${SWIG_EXECUTABLE} -c++ -java -package ${SWIG_MODULE_NAME} -outdir ${CMAKE_SWIG_OUTDIR} -outcurrentdir -addextern -I${CMAKE_CURRENT_SOURCE_DIR} -o swig_streamer.cpp streamer.i
DEPENDS streamer.i
)
# GMP_FOUND - true if GMP/MPIR was found
# GMP_INCLUDE_DIRS - include search path
# GMP_LIBRARIES - libraries to link with
#config.h needs this (TODO: change in code latter)
include_directories( .;${GMP_INCLUDE_DIRS};${CMAKE_SOURCE_DIR}/include;${CMAKE_SOURCE_DIR}/H;${CMAKE_SOURCE_DIR}/H/generated;${CMAKE_SOURCE_DIR}/os;${CMAKE_SOURCE_DIR}/OPTYap;${CMAKE_BINARY_DIR};${CMAKE_CURRENT_SOURCE_DIR} )
add_library (YAPJava SHARED
yap_swig.cpp swig_streamer.cpp streamer.cpp streamer.h
)
target_link_libraries(YAPJava ${GMP_LIBRARIES} )
target_link_libraries( YAPJava YAP++ libYap android log)
if (FALSE)
set (SWIG_ADD_MODULE YAPJava SHARED CPLUPLUS ${SWIG_SOURCES} )
# Define swig module with given name and specified language
set (SWIG_LINK_LIBRARIES YAPJava YAP++ libYAP )
#- Link libraries to swig module
add_library (YAPJavaTop SHARED
main.cpp main.h
)
target_link_libraries( YAPJavaTop ${SWIG_MODULE_${YAPJava}_REAL_NAME} YAP++ libYap android)
endif()

View File

@ -92,7 +92,10 @@ class JavaYAP {
public static void main(String args[]) public static void main(String args[])
{ {
System.loadLibrary("Native"); System.loadLibrary("gmp");
System.loadLibrary("Yap");
System.loadLibrary("YAP++");
System.loadLibrary("JAVAYap");
JavaYAP y = new JavaYAP(); JavaYAP y = new JavaYAP();

View File

@ -1,10 +1,11 @@
// supports Java and Python
%{ %{
#include <cmath> #include <cmath>
#include <gmpxx.h> #include <gmpxx.h>
extern "C"{ extern "C"{
#ifdef SWIGPYTHON #ifdef SWIGPYTHON
#include <Python.h> #include <Python.h>
@ -22,11 +23,11 @@
%include std_string.i %include std_string.i
%include std_vector.i %include std_vector.i
namespace std {
%template(vectort) vector<Term>;
};
<<<<<<< HEAD
%feature("novaluewrapper") std::vector<Term>; %feature("novaluewrapper") std::vector<Term>;
=======
>>>>>>> 11e81b457dcc145e07b457482698a90e0ec350a2
%ignore *::operator[]; %ignore *::operator[];
@ -255,148 +256,87 @@ case DOMAIN_ERROR_NOT_LESS_THAN_ZERO:
#else #else
// Language independent exception handler %typemap(in) arity_t { (jlong)($input); }
%include exception.i
%exception { %typecheck(2) Int { $1 = PyLong_Check($input); }
try { %typecheck(3) double { $1 = PyFloat_Check($input); }
$action %typecheck(2) const char * { $1 = PyUnicode_Check($input); }
} catch (YAPError e) {
yap_error_number en = e.getID(); %typecheck(1) Term { $1 = !PyUnicode_Check($input); }
LOCAL_Error_TYPE = YAP_NO_ERROR; %typecheck(1) YAP_Term { $1 = PyUnicode_Check($input); }
switch (e.getErrorClass()) {
case YAPC_NO_ERROR: %typecheck(0) YAPTerm { $1 = !PyUnicode_Check($input); }
break;
/// bad domain, "first argument often is the predicate.
case DOMAIN_ERROR: { %typemap(in) jlong %{
switch (en) { $1 = (jlong)$input;
case DOMAIN_ERROR_OUT_OF_RANGE: %}
case DOMAIN_ERROR_NOT_LESS_THAN_ZERO:
SWIG_exception(SWIG_IndexError, e.text()); %typemap(out) arity_t { *(jlong *)&$result = $1; }
break;
case DOMAIN_ERROR_CLOSE_OPTION: // Language independent exception handler
case DOMAIN_ERROR_ENCODING: // simplified version
case DOMAIN_ERROR_PROLOG_FLAG: %include <exception.i>
case DOMAIN_ERROR_ABSOLUTE_FILE_NAME_OPTION:
case DOMAIN_ERROR_READ_OPTION: %exception {
case DOMAIN_ERROR_SET_STREAM_OPTION: try {
SWIG_exception(SWIG_AttributeError, e.text()); $action
break; } catch (const std::out_of_range& e) {
case DOMAIN_ERROR_FILE_ERRORS: SWIG_exception(SWIG_IndexError, e.what());
case DOMAIN_ERROR_FILE_TYPE: } catch (const std::exception& e) {
case DOMAIN_ERROR_IO_MODE: SWIG_exception(SWIG_RuntimeError, e.what());
case DOMAIN_ERROR_SOURCE_SINK: } catch (...) {
case DOMAIN_ERROR_STREAM_POSITION: SWIG_exception(SWIG_RuntimeError, "unknown exception");
SWIG_exception(SWIG_IOError, e.text());
break;
default:
SWIG_exception(SWIG_ValueError, e.text());
}
} break;
/// bad arithmetic
case EVALUATION_ERROR: {
switch (en) {
case EVALUATION_ERROR_FLOAT_OVERFLOW:
case EVALUATION_ERROR_FLOAT_UNDERFLOW:
case EVALUATION_ERROR_INT_OVERFLOW:
case EVALUATION_ERROR_UNDERFLOW:
SWIG_exception(SWIG_OverflowError, e.text());
break;
case EVALUATION_ERROR_ZERO_DIVISOR:
SWIG_exception(SWIG_DivisionByZero, e.text());
break;
default:
SWIG_exception(SWIG_RuntimeError, e.text());
}
} break;
/// missing object (I/O mostly)
case EXISTENCE_ERROR:
SWIG_exception(SWIG_RuntimeError, e.text());
break;
/// should be bound
case INSTANTIATION_ERROR_CLASS:
SWIG_exception(SWIG_RuntimeError, e.text());
break;
/// bad access, I/O
case PERMISSION_ERROR: {
switch (en) {
case PERMISSION_ERROR_INPUT_BINARY_STREAM:
case PERMISSION_ERROR_INPUT_PAST_END_OF_STREAM:
case PERMISSION_ERROR_INPUT_STREAM:
case PERMISSION_ERROR_INPUT_TEXT_STREAM:
case PERMISSION_ERROR_OPEN_SOURCE_SINK:
case PERMISSION_ERROR_OUTPUT_BINARY_STREAM:
case PERMISSION_ERROR_REPOSITION_STREAM:
case PERMISSION_ERROR_OUTPUT_STREAM:
case PERMISSION_ERROR_OUTPUT_TEXT_STREAM:
SWIG_exception(SWIG_OverflowError, e.text());
break;
default:
SWIG_exception(SWIG_RuntimeError, e.text());
}
} break;
/// something that could not be represented into a type
case REPRESENTATION_ERROR:
SWIG_exception(SWIG_RuntimeError, e.text());
break;
/// not enough ....
case RESOURCE_ERROR:
SWIG_exception(SWIG_RuntimeError, e.text());
break;
/// bad text
case SYNTAX_ERROR_CLASS:
SWIG_exception(SWIG_SyntaxError, e.text());
break;
/// OS or internal
case SYSTEM_ERROR_CLASS:
SWIG_exception(SWIG_RuntimeError, e.text());
break;
/// bad typing
case TYPE_ERROR:
SWIG_exception(SWIG_TypeError, e.text());
break;
/// should be unbound
case UNINSTANTIATION_ERROR_CLASS:
SWIG_exception(SWIG_RuntimeError, e.text());
break;
/// escape hatch
default:
break;
}
}
} }
}
#endif #endif
%{ %{
/* Put header files here or function declarations like below */ /* Put header files here or function declarations like below */
extern "C" { extern "C" {
#if THREADS #if THREADS
#define Yap_regp regcache #define Yap_regp regcache
#endif #endif
// we cannot consult YapInterface.h, that conflicts with what we // we cannot consult YapInterface.h, that conflicts with what we
// declare, though // declare, though
// it shouldn't // it shouldn't
} }
%} extern void init_sqlite();
/* turn on director wrapping Callback */ %}
%feature("director") YAPCallback;
%include "yapa.hh"
%include "yapie.hh" /* turn on director wrapping Callback */
//%feature("director") YAPCallback;
%include "yapt.hh" %include "yapa.hh"
%include "yapdb.hh" %include "yapie.hh"
%include "yapq.hh" %include "yapt.hh"
%init %{ %include "yapdb.hh"
%}
%include "yapq.hh"
namespace std {
%template(TermVector) vector<Term>;
%feature("novaluewrapper") vector<Term>;
//%template(YAPTermVector) vector<YAPTerm>;
//%feature("novaluewrapper") vector<YAPTerm>;
};
%init %{
%}

View File

@ -546,7 +546,10 @@ initialize_prolog :-
current_prolog_flag(compiled_at,AT), current_prolog_flag(compiled_at,AT),
current_prolog_flag(version_data, yap(Mj, Mi, Patch, _) ), current_prolog_flag(version_data, yap(Mj, Mi, Patch, _) ),
sub_atom( VersionGit, 0, 8, _, VERSIONGIT ), sub_atom( VersionGit, 0, 8, _, VERSIONGIT ),
current_prolog_flag(version_data, yap(Mj, Mi, Patch, _) ),
current_prolog_flag(resource_database, Saved ),
format(user_error, '% YAP ~d.~d.~d-~a (compiled ~a)~n', [Mj,Mi, Patch, VERSIONGIT, AT]), format(user_error, '% YAP ~d.~d.~d-~a (compiled ~a)~n', [Mj,Mi, Patch, VERSIONGIT, AT]),
format(user_error, '% database loaded from ~a~n', [Saved]),
fail. fail.
'$version'. '$version'.

View File

@ -24,8 +24,6 @@
:- use_system_module( '$_modules', ['$do_import'/3]). :- use_system_module( '$_modules', ['$do_import'/3]).
:- multifile user:system_foreign/1.
/** /**
@ -37,6 +35,11 @@
*/ */
maplist_(_, [], []).
maplist_(Pred, [A1|L1], [A2|L2]) :-
call(Pred, A1, A2),
maplist_(Pred, L1, L2).
/** @pred load_foreign_files( _Files_, _Libs_, _InitRoutine_) /** @pred load_foreign_files( _Files_, _Libs_, _InitRoutine_)
should be used, from inside YAP, to load object files produced by the C should be used, from inside YAP, to load object files produced by the C
@ -58,96 +61,44 @@ if defined, or in the default library.
YAP supports the SWI-Prolog interface to loading foreign code, the shlib package. YAP supports the SWI-Prolog interface to loading foreign code, the shlib package.
*/ */
load_foreign_files(Objs,Libs,Entry) :- load_foreign_files(Objs,Libs,Entry) :-
source_module(M), source_module(M),
'$check_objs_for_load_foreign_files'(Objs,NewObjs,load_foreign_files(Objs,Libs,Entry)), %G = load_foreign_files(Objs,Libs,Entry),
'$check_libs_for_load_foreign_files'(Libs,NewLibs,load_foreign_files(Objs,Libs,Entry)), '$absfs'( Objs, [file_type(executable),
'$check_entry_for_load_foreign_files'(Entry,load_foreign_files(Objs,Libs,Entry)), access(read),
( expand(true),
recordzifnot( '$foreign', M:'$foreign'(Objs,Libs,Entry), _) file_errors(fail)], NewObjs),
-> maplist_( '$load_lib', Libs, NewLibs),
'$load_foreign_files'(NewObjs,NewLibs,Entry),
!,
prolog_load_context(file, F),
ignore( recordzifnot( '$load_foreign_done', [F, M], _) ).
'$load_foreign_files'(NewObjs,NewLibs,Entry), '$absfs'([],_P,[]).
( '$absfs'([F|Fs],P,[NF|NFs]) :-
prolog_load_context(file, F) '$name_object'(F, P, NF),
-> !,
ignore( recordzifnot( '$load_foreign_done', [F, M], _) ) '$absfs'(Fs,P,NFs).
; '$absfs'([F|Fs],P,[F|NFs]) :-
true '$absfs'(Fs,P,NFs).
)
;
true
),
!.
/** @pred load_absolute_foreign_files( _Files_, _Libs_, _InitRoutine_) '$name_object'(I, P, O) :-
atom(I),
!,
absolute_file_name(foreign(I), O, P).
'$name_object'(I, P, O) :-
absolute_file_name(I, O, P).
'$load_lib'(_,L,L).
/** @pred load_absolute_foreign_files( Files, Libs, InitRoutine)
Loads object files produced by the C compiler. It is useful when no search should be performed and instead one has the full paths to the _Files_ and _Libs_. Loads object files produced by the C compiler. It is useful when no search should be performed and instead one has the full paths to the _Files_ and _Libs_.
*/ */
load_absolute_foreign_files(Objs,Libs,Entry) :- load_absolute_foreign_files(_Objs,_Libs,_Entry).
source_module(M),
(
recordzifnot( '$foreign', M:'$foreign'(Objs,Libs,Entry), _)
->
'$load_foreign_files'(Objs,Libs,Entry),
(
prolog_load_context(file, F)
->
ignore( recordzifnot( '$load_foreign_done', [F, M], _) )
;
true
)
;
true
),
!.
'$check_objs_for_load_foreign_files'(V,_,G) :- var(V), !,
'$do_error'(instantiation_error,G).
'$check_objs_for_load_foreign_files'([],[],_) :- !.
'$check_objs_for_load_foreign_files'([Obj|Objs],[NObj|NewObjs],G) :- !,
'$check_obj_for_load_foreign_files'(Obj,NObj,G),
'$check_objs_for_load_foreign_files'(Objs,NewObjs,G).
'$check_objs_for_load_foreign_files'(Objs,_,G) :-
'$do_error'(type_error(list,Objs),G).
'$check_obj_for_load_foreign_files'(V,_,G) :- var(V), !,
'$do_error'(instantiation_error,G).
'$check_obj_for_load_foreign_files'(Obj,NewObj,_) :- atom(Obj), !,
( atom(Obj), Obj1 = foreign(Obj) ; Obj1 = Obj ),
absolute_file_name(foreign(Obj),[file_type(executable),
access(read),
expand(true),
file_errors(fail)
], NewObj).
'$check_obj_for_load_foreign_files'(Obj,_,G) :-
'$do_error'(type_error(atom,Obj),G).
'$check_libs_for_load_foreign_files'(V,_,G) :- var(V), !,
'$do_error'(instantiation_error,G).
'$check_libs_for_load_foreign_files'([],[],_) :- !.
'$check_libs_for_load_foreign_files'([Lib|Libs],[NLib|NLibs],G) :- !,
'$check_lib_for_load_foreign_files'(Lib,NLib,G),
'$check_libs_for_load_foreign_files'(Libs,NLibs,G).
'$check_libs_for_load_foreign_files'(Libs,_,G) :-
'$do_error'(type_error(list,Libs),G).
'$check_lib_for_load_foreign_files'(V,_,G) :- var(V), !,
'$do_error'(instantiation_error,G).
'$check_lib_for_load_foreign_files'(Lib,NLib,_) :- atom(Lib), !,
'$process_obj_suffix'(Lib,NewLib),
'$checklib_prefix'(NewLib,NLib).
'$check_lib_for_load_foreign_files'(Lib,_,G) :-
'$do_error'(type_error(atom,Lib),G).
'$process_obj_suffix'(Obj,Obj) :-
current_prolog_flag(shared_object_extension, ObjSuffix),
sub_atom(Obj, _, _, 0, ObjSuffix), !.
'$process_obj_suffix'(Obj,NewObj) :-
current_prolog_flag(shared_object_extension, ObjSuffix),
atom_concat([Obj,'.',ObjSuffix],NewObj).
'$checklib_prefix'(F,F) :- is_absolute_file_name(F), !. '$checklib_prefix'(F,F) :- is_absolute_file_name(F), !.
'$checklib_prefix'(F, F) :- '$checklib_prefix'(F, F) :-
sub_atom(F, 0, _, _, lib), !. sub_atom(F, 0, _, _, lib), !.
@ -163,12 +114,6 @@ load_absolute_foreign_files(Objs,Libs,Entry) :-
fail. fail.
'$import_foreign'(_F, _M0, _M). '$import_foreign'(_F, _M0, _M).
'$check_entry_for_load_foreign_files'(V,G) :- var(V), !,
'$do_error'(instantiation_error,G).
'$check_entry_for_load_foreign_files'(Entry,_) :- atom(Entry), !.
'$check_entry_for_load_foreign_files'(Entry,G) :-
'$do_error'(type_error(atom,Entry),G).
/** @pred open_shared_object(+ _File_, - _Handle_) /** @pred open_shared_object(+ _File_, - _Handle_)
File is the name of a shared object file (called dynamic load File is the name of a shared object file (called dynamic load

View File

@ -74,10 +74,13 @@ commons_directory( Path ):-
foreign_directory(Home) :- foreign_directory(Home) :-
current_prolog_flag(prolog_foreign_directory, Home), current_prolog_flag(prolog_foreign_directory, Home),
Home \= ''. Home \= ''.
foreign_directory(C) :-
current_prolog_flag(windows, true),
file_search_path(path, C).
foreign_directory( '.'). foreign_directory( '.').
foreign_directory(yap('lib/Yap')). foreign_directory(yap('lib/Yap')).
foreign_directory( Path ):- %foreign_directory( Path ):-
system_foreign( Path ). % system_foreign( Path ).
/** /**
@pred prolog_file_type(?Suffix:atom, ?Handler:atom) is nondet, dynamic @pred prolog_file_type(?Suffix:atom, ?Handler:atom) is nondet, dynamic
@ -118,7 +121,7 @@ prolog_file_type(qly, qly).
prolog_file_type(A, executable) :- prolog_file_type(A, executable) :-
current_prolog_flag(shared_object_extension, A). current_prolog_flag(shared_object_extension, A).
prolog_file_type(pyd, executable). prolog_file_type(pyd, executable).
/** /**
@pred file_search_path(+Name:atom, -Directory:atom) is nondet @pred file_search_path(+Name:atom, -Directory:atom) is nondet

View File

@ -1,48 +1,47 @@
set (LIBRARY_PL set (LIBRARY_PL
aggregate.pl aggregate.pl
base64.pl base64.pl
broadcast.pl broadcast.pl
ctypes.pl ctypes.pl
date.pl date.pl
debug.pl debug.pl
edit.pl edit.pl
error.pl error.pl
main.pl main.pl
menu.pl menu.pl
nb_set.pl nb_set.pl
occurs.yap occurs.yap
operators.pl operators.pl
option.pl option.pl
pairs.pl pairs.pl
plunit.pl plunit.pl
predicate_options.pl predicate_options.pl
predopts.pl predopts.pl
prolog_clause.pl prolog_clause.pl
prolog_colour.pl prolog_colour.pl
prolog_source.pl prolog_source.pl
prolog_xref.pl prolog_xref.pl
pure_input.pl pure_input.pl
quasi_quotations.pl quasi_quotations.pl
quintus.pl quintus.pl
record.pl record.pl
settings.pl settings.pl
shlib.pl shlib.pl
thread_pool.pl thread_pool.pl
unix.pl unix.pl
url.pl url.pl
utf8.pl utf8.pl
win_menu.pl win_menu.pl
www_browser.pl www_browser.pl
dcg/basics.pl dcg/basics.pl
) )
add_to_group( pl_library LIBRARY_PL )
if (ANDROID)
file(INSTALL ${LIBRARY_PL} DESTINATION ${libpl}) if (ANDROID)
else() file(INSTALL ${LIBRARY_PL} DESTINATION ${libpl})
else()
install(FILES ${LIBRARY_PL}
DESTINATION ${libpl} DESTINATION ${libpl}
) )
endif()