103 lines
2.3 KiB
C
103 lines
2.3 KiB
C
/*************************************************************************
|
|
* *
|
|
* YAP Prolog *
|
|
* *
|
|
* Yap Prolog was developed at NCCUP - Universidade do Porto *
|
|
* *
|
|
* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-2014 *
|
|
* *
|
|
*************************************************************************/
|
|
|
|
/**
|
|
@file swi.h
|
|
|
|
@defgroup swi-c-interface SWI-Prolog Foreign Language Interface
|
|
@ingroup ChYInterface
|
|
|
|
*
|
|
* @tableofcontents
|
|
*
|
|
* A reimplementation of Jan Wielemaker's SWI-Prolog C-language interface, it supports
|
|
* most of the functionality in the original implementation. It allows for:
|
|
*
|
|
* - Term Construction, Access, and Unification
|
|
* - Manipulation of Atoms, Strings, Lists of Codes and Lists of Atoms
|
|
* - Query evaluation
|
|
* - Thread and Prolog engine management
|
|
* - Data-Base Access
|
|
*
|
|
* In this interface, all Prolog data known by C is referenced through term references (term_t), hence
|
|
* Prolog has all the information necessary to perform its memory management without special precautions
|
|
* from the C programmer.
|
|
|
|
@{
|
|
|
|
*/
|
|
void Yap_swi_install(void);
|
|
void Yap_install_blobs(void);
|
|
|
|
typedef struct open_query_struct {
|
|
int q_open;
|
|
int q_state;
|
|
YAP_Term *q_g;
|
|
PredEntry *q_pe;
|
|
yamop *q_p, *q_cp;
|
|
jmp_buf q_env;
|
|
int q_flags;
|
|
YAP_dogoalinfo q_h;
|
|
struct open_query_struct *oq;
|
|
} open_query;
|
|
|
|
#define addr_hash(V) (((CELL) (V)) >> 4 & (N_SWI_HASH-1))
|
|
|
|
static inline void
|
|
add_to_hash(Int i, ADDR key)
|
|
{
|
|
|
|
UInt h = addr_hash(key);
|
|
while (SWI_ReverseHash[h].key) {
|
|
h = (h+1)%N_SWI_HASH;
|
|
}
|
|
SWI_ReverseHash[h].key = key;
|
|
SWI_ReverseHash[h].pos = i;
|
|
}
|
|
|
|
static atom_t
|
|
in_hash(ADDR key)
|
|
{
|
|
UInt h = addr_hash(key);
|
|
while (SWI_ReverseHash[h].key) {
|
|
if (SWI_ReverseHash[h].key == key)
|
|
return SWI_ReverseHash[h].pos;
|
|
h = (h+1)%N_SWI_HASH;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
static inline Term
|
|
SWIModuleToModule(module_t m)
|
|
{
|
|
CACHE_REGS
|
|
if (m)
|
|
return MkAtomTerm(m->AtomOfME);
|
|
if (CurrentModule)
|
|
return CurrentModule;
|
|
return USER_MODULE;
|
|
}
|
|
|
|
static inline functor_t
|
|
FunctorToSWIFunctor(Functor at)
|
|
{
|
|
atom_t ats;
|
|
if ((ats = in_hash((ADDR)at)))
|
|
return (functor_t)((CELL)ats*4+2);
|
|
return (functor_t)at;
|
|
}
|
|
|
|
#define isDefinedProcedure(pred) TRUE // TBD
|
|
|
|
/**
|
|
@}
|
|
*/
|