Inp/Out changes, blobs

This commit is contained in:
Vítor Santos Costa 2015-06-18 00:52:31 +01:00
parent e535e16ae3
commit 47c3f64eae
9 changed files with 128 additions and 51 deletions

7
.gitignore vendored
View File

@ -55,5 +55,10 @@ autom4te.cache
#*
#*#
config.h
*.html
packages/gecode/dev
JIT/HPP/bkp
cmake_install.cmake
cmake_clean.cmake
*.build
Makefile

View File

@ -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)

83
CXX/yapdb.cpp Normal file
View File

@ -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;
}

View File

@ -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);

View File

@ -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 */

View File

@ -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
}

View File

@ -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(); }

View File

@ -3,6 +3,8 @@
class YAPAtomTerm;
extern "C" Term YAP_ReadBuffer(const char *s, Term *tp);
/**
* @brief Generic Prolog Term
*/

View File

@ -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