/************************************************************************* * * * YAP Prolog * * * * Yap Prolog was developed at NCCUP - Universidade do Porto * * * * Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 * * * ************************************************************************** * * * File: other.c * * Last rev: Dec/90 * * mods: * * comments: extra routines * * * *************************************************************************/ #ifdef SCCS static char SccsId[] = "%W% %G%"; #endif #include "Yap.h" #include "Yatom.h" #include "YapHeap.h" #if HAVE_STRING_H #include #endif /* exile Yap_standard_regs here, otherwise WIN32 linkers may complain */ REGSTORE Yap_standard_regs; #if PUSH_REGS #ifdef THREADS /* PushRegs always on */ pthread_key_t Yap_yaamregs_key; #else REGSTORE *Yap_regp; #endif #else /* !PUSH_REGS */ REGSTORE Yap_REGS; #endif Term Yap_MkNewPairTerm(void) { CACHE_REGS register CELL *p = HR; RESET_VARIABLE(HR); RESET_VARIABLE(HR+1); HR+=2; return (AbsPair(p)); } /** compound term constructor, builds a compound term with functor f and n * args. * * * Room for the new term is allocated from the heap: the functor and arguments are copied there. * */ Term Yap_MkApplTerm(Functor f, arity_t n, const Term *a) { CACHE_REGS CELL *t = HR; if (n == 0) return (MkAtomTerm(NameOfFunctor(f))); if (f == FunctorList) return MkPairTerm(a[0], a[1]); *HR++ = (CELL) f; while (n--) *HR++ = * a++; return (AbsAppl(t)); } Term Yap_MkNewApplTerm(Functor f, arity_t n) /* build compound term with functor f and n * args a */ { CACHE_REGS CELL *t = HR; if (n == 0) return (MkAtomTerm(NameOfFunctor(f))); if (f == FunctorList) { RESET_VARIABLE(HR); RESET_VARIABLE(HR+1); HR+=2; return (AbsPair(t)); } *HR++ = (CELL) f; while (n--) { RESET_VARIABLE(HR); HR++; } return (AbsAppl(t)); } Term Yap_Globalise(Term t) { CACHE_REGS CELL *vt; Term tn; if (!IsVarTerm(t)) return t; vt = VarOfTerm(t); if (vt <= HR && vt > H0) return t; tn = MkVarTerm(); Yap_unify(t, tn); return tn; }