/*************************************************************************
* *
* YAP Prolog *
* Yap Prolog was developed at NCCUP - Universidade do Porto *
* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 *
**************************************************************************
* File: corout_utils.h *
* Last rev: *
* mods: *
* comments: Co-routining from within YAP *
*************************************************************************/
STATIC_PROTO (Term SDeref, (Term));
STATIC_PROTO (Term SDerefa, (CELL *));
STATIC_PROTO (sus_tag * deref_susp_chain, (sus_tag *));
static inline Term
SDeref (Term a)
{
while (IsVarTerm (a))
Term *b = (Term *) a;
a = *b;
#if YAPOR_SBA
if (a == (0))
return (CELL) b;
#else
if (a == ((Term) b))
return a;
#endif
}
return (a);
SDerefa (CELL * b)
Term a = *b;
b = (Term *) a;
static inline CELL *
SADerefa (CELL * b)
return b;
return (b);
inline EXTERN Term SArgOfTerm (int i, Term t);
inline EXTERN Term
SArgOfTerm (int i, Term t)
return (Term) (SDerefa (RepAppl (t) + (i)));
inline EXTERN Term SHeadOfTerm (Term);
SHeadOfTerm (Term t)
return (Term) (SDerefa (RepPair (t)));
inline EXTERN Term STailOfTerm (Term);
STailOfTerm (Term t)
return (Term) (SDerefa (RepPair (t) + 1));
static inline sus_tag *
deref_susp_chain (sus_tag * susp)
/* we may have bound several suspension chains together. Follow the
reference chain
*/
while (IsVarTerm (susp->ActiveSus)
&& susp->ActiveSus != (CELL) & susp->ActiveSus)
susp =
(sus_tag *) (susp->ActiveSus - (Int) (&(((sus_tag *) (0))->ActiveSus)));
return (susp);