diff --git a/.gitignore b/.gitignore index 5434fc30f..61cbac0e4 100644 --- a/.gitignore +++ b/.gitignore @@ -55,5 +55,10 @@ autom4te.cache #* #*# config.h - *.html +packages/gecode/dev +JIT/HPP/bkp +cmake_install.cmake +cmake_clean.cmake +*.build +Makefile diff --git a/CXX/CMakeLists.txt b/CXX/CMakeLists.txt index 2f747cb0f..cb277c05f 100644 --- a/CXX/CMakeLists.txt +++ b/CXX/CMakeLists.txt @@ -1,7 +1,7 @@ add_library (Yap++ SHARED yapi.cpp) -include_directories (H include os ${CMAKE_BINARY_DIR} ${GMP_INCLUDE_DIR}) +include_directories (H include ${CMAKE_BINARY_DIR} ${GMP_INCLUDE_DIR}) target_link_libraries(Yap++ libYap) diff --git a/CXX/yapdb.cpp b/CXX/yapdb.cpp new file mode 100644 index 000000000..9f8c56db5 --- /dev/null +++ b/CXX/yapdb.cpp @@ -0,0 +1,83 @@ + +#define YAP_CPP_INTERFACE 1 + +#include "yapi.hh" +#include "SWI-Stream.h" + + + +YAPPredicate::YAPPredicate(const char *s, Term &tout, yhandle_t &vnames) throw (int) { + CACHE_REGS + BACKUP_MACHINE_REGS(); + yhandle_t yvnames = Yap_InitSlot(); + Term tout = Yap_StringToTerm(s, strlen(s), Yap_DefaultEncoding(), yvnames, 1200); + if (tout == 0L) + throw YAPError::YAP_SYNTAX_ERROR; + ap = getPred( tout ); + RECOVER_MACHINE_REGS(); +} + +YAPPredicate::YAPPredicate(YAPAtom at) { + CACHE_REGS + ap = RepPredProp(PredPropByAtom(at.a,CurrentModule)); +} + +YAPPredicate::YAPPredicate(YAPAtom at, arity_t arity) { + CACHE_REGS + if (arity) { + Functor f = Yap_MkFunctor(at.a, arity); + ap = RepPredProp(PredPropByFunc(f,CurrentModule)); + } else {LogUpdate + ap = RepPredProp(PredPropByAtom(at.a,CurrentModule)); + } +} + +/// auxiliary routine to find a predicate in the current module. +PredEntry *YAPPredicate::getPred( Term t, Term* &outp ) { + CACHE_REGS + Term m = CurrentModule ; + t = Yap_StripModule(t, &m); + if (IsVarTerm(t) || IsNumTerm(t)) { + ap = (PredEntry *)NULL; + outp = (Term *)NULL; + } + if (IsAtomTerm(t)) { + ap = RepPredProp(PredPropByAtom(AtomOfTerm(t), m)); + if (outp) outp = (Term *)NULL; + } else if (IsPairTerm(t)) { + ap = RepPredProp(PredPropByFunc(FunctorCsult, PROLOG_MODULE)); + outp = HR; + HR[0] = RepPair(t)[0]; + HR[1] = m; + HR+=2; + } else { + Functor f = FunctorOfTerm(t); + if (IsExtensionFunctor(f)) { + ap = (PredEntry *)NULL; + outp = (Term *)NULL; + } else { + ap = RepPredProp(PredPropByFunc(f, m)); + outp = RepAppl(t)+1; + } + } + { REGS_LOG( "done H= %p, outp=%p", HR, outp) ; } + return ap; +} + +YAPPredicate::YAPPredicate(YAPFunctor f) { + CACHE_REGS + ap = RepPredProp(PredPropByFunc(f.f,CurrentModule)); +} + +int YAPPredicate::call(YAPTerm t[]) +{ + YAPQuery q = YAPQuery(*this, t); + int ret; + + BACKUP_MACHINE_REGS(); + ret = q.next(); + q.cut(); + q.close(); + RECOVER_MACHINE_REGS(); + return ret; +} diff --git a/CXX/yapdb.hh b/CXX/yapdb.hh index 7f4e6e663..ef9aef6d3 100644 --- a/CXX/yapdb.hh +++ b/CXX/yapdb.hh @@ -117,13 +117,12 @@ protected: /// It also communicates the array of arguments t[] /// and the array of variables /// back to yapquery - YAPPredicate(const char *s, Term &out, yhandle_t &vnames ) { + YAPPredicate(const char *s, Term &out, Term &vnames ) { CACHE_REGS BACKUP_MACHINE_REGS(); Term *outp; - vnames = Yap_NewSlots(1); - out = Yap_StringToTerm(s, strlen(s)+1, vnames ) ; + out = Yap_StringToTerm(s, strlen(s)+1, LOCAL_encoding, 1200, &vnames ) ; //extern char *s0; //fprintf(stderr,"ap=%p arity=%d text=%s", ap, ap->ArityOfPE, s); // Yap_DebugPlWrite(out); diff --git a/CXX/yapi.cpp b/CXX/yapi.cpp index c95c5616e..5020c81b3 100644 --- a/CXX/yapi.cpp +++ b/CXX/yapi.cpp @@ -2,8 +2,18 @@ #define YAP_CPP_INTERFACE 1 #include "yapi.hh" -#include "SWI-Stream.h" +extern "C" { + +#include "YapInterface.h" +#include "blobs.h" + + char *Yap_TermToString(Term t, char *s, size_t sz, size_t *length, encoding_t encoding, int flags); + + void YAP_UserCPredicate(const char *, YAP_UserCPred, YAP_Arity arity); + void YAP_UserCPredicateWithArgs(const char *, YAP_UserCPred, YAP_Arity, YAP_Term); + void YAP_UserBackCPredicate(const char *, YAP_UserCPred, YAP_UserCPred, YAP_Arity, unsigned int); +} YAPAtomTerm::YAPAtomTerm(char *s) { // build string @@ -283,13 +293,13 @@ intptr_t YAPTerm::hashTerm(size_t sz, size_t depth, bool variant) { } const char *YAPTerm::text() { + CACHE_REGS size_t sze = 4096, length; - char *os; - int enc; + char *os = new char[4097]; + encoding_t enc = LOCAL_encoding; BACKUP_MACHINE_REGS(); - if (!(os = Yap_HandleToString(t, sze, &length, &enc, 0))) { - RECOVER_MACHINE_REGS(); + if (!(os = Yap_TermToString(t, os, sze, &length, enc, 0))) { RECOVER_MACHINE_REGS(); return (char *)NULL; } RECOVER_MACHINE_REGS(); @@ -351,34 +361,9 @@ char *YAPAtom::getName(void) { delete[] s; return os; } else if (IsBlob(a)) { - PL_blob_t *type = RepBlobProp(a->PropsOfAE)->blob_t; - size_t sz = 512; - - if (type->write) { - char *s = new char[sz]; - IOSTREAM *stream = Sopenmem(&s, &sz, "w"); - stream->encoding = ENC_UTF8; - atom_t at = YAP_SWIAtomFromAtom(AbsAtom(a)); - type->write(stream, at, 0); - Sclose(stream); - popOutputContext(); - sz = strlen(s)+1; - char *os = new char[sz]; - memcpy(os, s, sz); - delete s; - return os; - } else { - char *s = new char[sz]; -#if defined(__linux__) || defined(__APPLE__) - snprintf(s, sz, "'%s'(%p)", AtomSWIStream->StrOfAE, a); -#else - snprintf(s, sz, "'%s'(0x%p)", AtomSWIStream->StrOfAE, a); -#endif - char *os = new char[sz]; - memcpy(os, s, sz); - delete[] s; - return os; - } + size_t sz = 1024; + char *s = new char [sz+1]; + return Yap_blob_to_string( RepAtom(a) , s, sz); } else { return a->StrOfAE; } @@ -390,7 +375,7 @@ void YAPQuery::initOpenQ() { LOCAL_execution = this; q_open=1; q_state=0; - q_flags = PL_Q_PASS_EXCEPTION; + q_flags = true ; //PL_Q_PASS_EXCEPTION; q_p = P; q_cp = CP; @@ -499,7 +484,7 @@ void YAPQuery::close() CACHE_REGS RECOVER_MACHINE_REGS(); - if (EX && !(q_flags & (PL_Q_CATCH_EXCEPTION))) { + if (EX /* && !(q_flags & (true PL_Q_CATCH_EXCEPTION)) */) { EX = (struct DB_TERM *)NULL; } /* need to implement backtracking here */ diff --git a/CXX/yapi.hh b/CXX/yapi.hh index c96b947e5..c3424f591 100644 --- a/CXX/yapi.hh +++ b/CXX/yapi.hh @@ -38,8 +38,6 @@ extern "C" { #include "YapHeap.h" -#include "pl-shared.h" - #include "clause.h" #include "yapio.h" @@ -48,8 +46,6 @@ extern "C" { #include "attvar.h" -#include "SWI-Stream.h" - #include "YapText.h" #if HAVE_STDARG_H @@ -70,11 +66,20 @@ extern "C" { // taken from yap_structs.h #include "iopreds.h" + + extern void YAP_UserCPredicate(const char *, YAP_UserCPred, YAP_Arity arity); + + /* void UserCPredicateWithArgs(const char *name, int *fn(), unsigned int arity) */ + extern void YAP_UserCPredicateWithArgs(const char *, YAP_UserCPred, YAP_Arity, YAP_Term); + + /* void UserBackCPredicate(const char *name, int *init(), int *cont(), int + arity, int extra) */ + extern void YAP_UserBackCPredicate(const char *, YAP_UserCPred, YAP_UserCPred, YAP_Arity, unsigned int); + + extern Term Yap_StringToTerm(const char *s, size_t len, encoding_t enc, int prio, Term *bindings_p); + - extern Term Yap_StringToTerm(const char *s, size_t len, term_t bindings); - // we cannot consult YapInterface.h, that conflicts with what we declare, though - // it shouldn't } diff --git a/CXX/yapq.hh b/CXX/yapq.hh index 5ed09121d..16478897f 100644 --- a/CXX/yapq.hh +++ b/CXX/yapq.hh @@ -12,7 +12,7 @@ * uses an SWI-like status info internally. */ class YAPQuery: public YAPPredicate, open_query_struct { - yhandle_t vnames; + Term vnames; YAPTerm goal; Term t; @@ -48,7 +48,7 @@ public: void setFlag(int flag) {q_flags |= flag; } /// reset flags for query execution, currently only for exception handling void resetFlag(int flag) {q_flags &= ~flag; } - /// first query + ///`b first query /// /// actually implemented by calling the next(); inline bool first() { return next(); } diff --git a/CXX/yapt.hh b/CXX/yapt.hh index 5c6eba574..64cb1d760 100644 --- a/CXX/yapt.hh +++ b/CXX/yapt.hh @@ -3,6 +3,8 @@ class YAPAtomTerm; +extern "C" Term YAP_ReadBuffer(const char *s, Term *tp); + /** * @brief Generic Prolog Term */ diff --git a/include/YapInterface.h b/include/YapInterface.h index 289a79d81..17942e831 100755 --- a/include/YapInterface.h +++ b/include/YapInterface.h @@ -1973,8 +1973,6 @@ extern X_API void YAP_CloseAllOpenStreams(void); extern X_API void YAP_FlushAllStreams(void); -#define YAP_INPUT_STREAM 0x01 -#define YAP_OUTPUT_STREAM 0x02 #define YAP_APPEND_STREAM 0x04 #define YAP_PIPE_STREAM 0x08 #define YAP_TTY_STREAM 0x10