which included commits to RCS files with non-trunk default branches. git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@5 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
		
			
				
	
	
		
			129 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			129 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| /*************************************************************************
 | |
| *									 *
 | |
| *	 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 SBA
 | |
|       if (a == (0))
 | |
| 	return (CELL) b;
 | |
| #else
 | |
|       if (a == ((Term) b))
 | |
| 	return a;
 | |
| #endif
 | |
|     }
 | |
|   return (a);
 | |
| }
 | |
| 
 | |
| static inline Term
 | |
| SDerefa (CELL * b)
 | |
| {
 | |
|   Term a = *b;
 | |
|   while (IsVarTerm (a))
 | |
|     {
 | |
| #if SBA
 | |
|       if (a == (0))
 | |
| 	return (CELL) b;
 | |
| #else
 | |
|       if (a == ((Term) b))
 | |
| 	return a;
 | |
| #endif
 | |
|       b = (Term *) a;
 | |
|       a = *b;
 | |
|     }
 | |
|   return (a);
 | |
| }
 | |
| 
 | |
| static inline CELL *
 | |
| SADerefa (CELL * b)
 | |
| {
 | |
|   Term a = *b;
 | |
|   while (IsVarTerm (a))
 | |
|     {
 | |
| #if SBA
 | |
|       if (a == (0))
 | |
| 	return b;
 | |
| #else
 | |
|       if (a == ((Term) b))
 | |
| 	return b;
 | |
| #endif
 | |
|       b = (Term *) a;
 | |
|       a = *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);
 | |
| 
 | |
| inline EXTERN Term
 | |
| SHeadOfTerm (Term t)
 | |
| {
 | |
|   return (Term) (SDerefa (RepPair (t)));
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| inline EXTERN Term STailOfTerm (Term);
 | |
| 
 | |
| inline EXTERN 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);
 | |
| }
 |