From 33b4a02faefc14ac7705f5d617f30d527de49eb2 Mon Sep 17 00:00:00 2001 From: Vitor Santos Costa Date: Mon, 9 Feb 2009 22:45:50 +0000 Subject: [PATCH] extend C-interface to check if a variable is AttVar and to fetch all the attributes. --- C/c_interface.c | 32 +++++++++++++++++++++++++++++++- include/YapInterface.h | 4 ++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/C/c_interface.c b/C/c_interface.c index 514e5e98f..ee30254ab 100644 --- a/C/c_interface.c +++ b/C/c_interface.c @@ -333,6 +333,7 @@ #include "Yap.h" #include "clause.h" #include "yapio.h" +#include "attvar.h" #if HAVE_STDARG_H #include #endif @@ -355,6 +356,9 @@ #ifdef CUT_C #include "cut_c.h" #endif /* CUT_C */ +#if HAVE_MALLOC_H +#include +#endif #if !HAVE_STRNCPY #define strncpy(X,Y,Z) strcpy(X,Y) @@ -504,6 +508,8 @@ X_API char *STD_PROTO(YAP_cwd,(void)); X_API Term STD_PROTO(YAP_OpenList,(int)); X_API Term STD_PROTO(YAP_ExtendList,(Term, Term)); X_API int STD_PROTO(YAP_CloseList,(Term, Term)); +X_API int STD_PROTO(YAP_IsAttVar,(Term)); +X_API Term STD_PROTO(YAP_AttsOfVar,(Term)); static int (*do_getf)(void); @@ -2430,7 +2436,7 @@ YAP_cwd(void) if (!Yap_getcwd(Yap_FileNameBuf, YAP_FILENAME_MAX)) return FALSE; len = strlen(Yap_FileNameBuf); - buf = malloc(+1); + buf = Yap_AllocCodeSpace(len+1); if (!buf) return NULL; strncpy(buf, Yap_FileNameBuf, len); @@ -2478,3 +2484,27 @@ YAP_CloseList(Term t0, Term tail) return FALSE; return TRUE; } + +X_API Int +YAP_IsAttVar(Term t) +{ + t = Deref(t); + if (!IsVarTerm(t)) + return FALSE; + return (VarOfTerm(t) < H0); +} + +X_API Term +YAP_AttsOfVar(Term t) +{ + attvar_record *attv; + + t = Deref(t); + if (!IsVarTerm(t)) + return TermNil; + if (VarOfTerm(t) >= H0) + return TermNil; + attv = (attvar_record *)VarOfTerm(t); + return attv->Atts; +} + diff --git a/include/YapInterface.h b/include/YapInterface.h index a66a54557..1f987cccb 100644 --- a/include/YapInterface.h +++ b/include/YapInterface.h @@ -476,6 +476,10 @@ extern X_API YAP_Term PROTO(YAP_OpenList,(int)); extern X_API YAP_Term PROTO(YAP_ExtendList,(YAP_Term, YAP_Term)); extern X_API int PROTO(YAP_CloseList,(YAP_Term, YAP_Term)); +/* attributed variables */ +extern X_API int PROTO(YAP_IsAttVar,(YAP_Term)); +extern X_API YAP_Term PROTO(YAP_AttsOfVar,(YAP_Term)); + #define YAP_InitCPred(N,A,F) YAP_UserCPredicate(N,F,A) __END_DECLS