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);
							 | 
						||
| 
								 | 
							
								}
							 |