| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | /*************************************************************************
 | 
					
						
							|  |  |  | *									 * | 
					
						
							|  |  |  | *	 YAP Prolog 							 * | 
					
						
							|  |  |  | *									 * | 
					
						
							|  |  |  | *	Yap Prolog was developed at NCCUP - Universidade do Porto	 * | 
					
						
							|  |  |  | *									 * | 
					
						
							|  |  |  | * Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997	 * | 
					
						
							|  |  |  | *									 * | 
					
						
							|  |  |  | ************************************************************************** | 
					
						
							|  |  |  | *									 * | 
					
						
							|  |  |  | * File:		attvar.c						 * | 
					
						
							|  |  |  | * Last rev:								 * | 
					
						
							|  |  |  | * mods:									 * | 
					
						
							|  |  |  | * comments:	YAP support for attributed vars				 * | 
					
						
							|  |  |  | *									 * | 
					
						
							|  |  |  | *************************************************************************/ | 
					
						
							|  |  |  | #ifdef SCCS
 | 
					
						
							|  |  |  | static char SccsId[]="%W% %G%"; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "Yap.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "Yatom.h"
 | 
					
						
							| 
									
										
										
										
											2009-10-23 14:22:17 +01:00
										 |  |  | #include "YapHeap.h"
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #include "heapgc.h"
 | 
					
						
							|  |  |  | #include "attvar.h"
 | 
					
						
							|  |  |  | #ifndef NULL
 | 
					
						
							|  |  |  | #define NULL (void *)0
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-06-23 17:24:20 +00:00
										 |  |  | #ifdef COROUTINING
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-01-07 02:12:32 +00:00
										 |  |  | #define TermVoidAtt TermFoundVar
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | static CELL * | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | AddToQueue(attvar_record *attv USES_REGS) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   Term t[2]; | 
					
						
							| 
									
										
										
										
											2004-06-05 03:37:01 +00:00
										 |  |  |   Term WGs, ng; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   t[0] = (CELL)&(attv->Done); | 
					
						
							|  |  |  |   t[1] = attv->Value; | 
					
						
							|  |  |  |   /* follow the chain */ | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |   WGs = Yap_ReadTimedVar(LOCAL_WokenGoals); | 
					
						
							| 
									
										
										
										
											2004-06-05 03:37:01 +00:00
										 |  |  |   ng = Yap_MkApplTerm(FunctorAttGoal, 2, t); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |   Yap_UpdateTimedVar(LOCAL_WokenGoals, MkPairTerm(ng, WGs)); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   if ((Term)WGs == TermNil) { | 
					
						
							|  |  |  |     /* from now on, we have to start waking up goals */ | 
					
						
							| 
									
										
										
										
											2004-01-23 02:23:51 +00:00
										 |  |  |     Yap_signal(YAP_WAKEUP_SIGNAL); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2004-06-05 03:37:01 +00:00
										 |  |  |   return(RepAppl(ng)+2); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-06-05 03:37:01 +00:00
										 |  |  | static void | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | AddFailToQueue( USES_REGS1 ) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2004-06-05 03:37:01 +00:00
										 |  |  |   Term WGs; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   /* follow the chain */ | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |   WGs = Yap_ReadTimedVar(LOCAL_WokenGoals); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |   Yap_UpdateTimedVar(LOCAL_WokenGoals, MkPairTerm(MkAtomTerm(AtomFail), WGs)); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   if ((Term)WGs == TermNil) { | 
					
						
							|  |  |  |     /* from now on, we have to start waking up goals */ | 
					
						
							| 
									
										
										
										
											2004-01-23 02:23:51 +00:00
										 |  |  |     Yap_signal(YAP_WAKEUP_SIGNAL); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 09:18:52 +00:00
										 |  |  | static attvar_record * | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | BuildNewAttVar( USES_REGS1 ) | 
					
						
							| 
									
										
										
										
											2010-03-08 09:18:52 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   attvar_record *newv; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* add a new attributed variable */ | 
					
						
							| 
									
										
										
										
											2011-03-18 19:34:58 +00:00
										 |  |  |   newv = (attvar_record *)H; | 
					
						
							|  |  |  |   H = (CELL *)(newv+1); | 
					
						
							| 
									
										
										
										
											2010-03-08 09:18:52 +00:00
										 |  |  |   newv->AttFunc = FunctorAttVar; | 
					
						
							|  |  |  |   RESET_VARIABLE(&(newv->Value)); | 
					
						
							|  |  |  |   RESET_VARIABLE(&(newv->Done)); | 
					
						
							|  |  |  |   RESET_VARIABLE(&(newv->Atts)); | 
					
						
							|  |  |  |   return newv; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | static int | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | CopyAttVar(CELL *orig, struct cp_frame **to_visit_ptr, CELL *res USES_REGS) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-03-08 09:18:52 +00:00
										 |  |  |   register attvar_record *attv = RepAttVar(orig); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   register attvar_record *newv; | 
					
						
							| 
									
										
										
										
											2007-09-21 13:52:52 +00:00
										 |  |  |   struct cp_frame *to_visit = *to_visit_ptr; | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |   CELL *vt; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-18 19:34:58 +00:00
										 |  |  |    | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   if (!(newv = BuildNewAttVar( PASS_REGS1 ))) | 
					
						
							| 
									
										
										
										
											2004-09-09 20:00:59 +00:00
										 |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |   vt = &(attv->Atts); | 
					
						
							| 
									
										
										
										
											2007-09-21 13:52:52 +00:00
										 |  |  |   to_visit->start_cp = vt-1; | 
					
						
							|  |  |  |   to_visit->end_cp = vt; | 
					
						
							| 
									
										
										
										
											2005-10-28 17:38:50 +00:00
										 |  |  |   if (IsVarTerm(attv->Atts)) { | 
					
						
							| 
									
										
										
										
											2011-03-18 19:34:58 +00:00
										 |  |  |     Bind_Global_NonAtt(&newv->Atts, (CELL)H); | 
					
						
							| 
									
										
										
										
											2007-09-21 13:52:52 +00:00
										 |  |  |     to_visit->to = H; | 
					
						
							| 
									
										
										
										
											2005-10-28 17:38:50 +00:00
										 |  |  |     H++; | 
					
						
							|  |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2007-09-21 13:52:52 +00:00
										 |  |  |     to_visit->to = &(newv->Atts); | 
					
						
							| 
									
										
										
										
											2005-10-28 17:38:50 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2007-09-21 13:52:52 +00:00
										 |  |  |   to_visit->oldv = vt[-1]; | 
					
						
							|  |  |  |   to_visit->ground = FALSE; | 
					
						
							|  |  |  |   *to_visit_ptr = to_visit+1; | 
					
						
							| 
									
										
										
										
											2001-12-11 03:34:03 +00:00
										 |  |  |   *res = (CELL)&(newv->Done); | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |   return TRUE; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-12-17 18:31:11 +00:00
										 |  |  | static Term | 
					
						
							|  |  |  | AttVarToTerm(CELL *orig) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-03-08 09:18:52 +00:00
										 |  |  |   attvar_record *attv = RepAttVar(orig); | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   return attv->Atts; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-12-17 18:31:11 +00:00
										 |  |  | static int | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | TermToAttVar(Term attvar, Term to USES_REGS) | 
					
						
							| 
									
										
										
										
											2001-12-17 18:31:11 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   attvar_record *attv = BuildNewAttVar( PASS_REGS1 ); | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |   if (!attv) | 
					
						
							|  |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2011-03-18 19:34:58 +00:00
										 |  |  |   Bind_Global_NonAtt(&attv->Atts, attvar); | 
					
						
							| 
									
										
										
										
											2010-03-08 09:18:52 +00:00
										 |  |  |   *VarOfTerm(to) = AbsAttVar(attv); | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |   return TRUE; | 
					
						
							| 
									
										
										
										
											2001-12-17 18:31:11 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | static void | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | WakeAttVar(CELL* pt1, CELL reg2 USES_REGS) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							|  |  |  |    | 
					
						
							|  |  |  |   /* if bound to someone else, follow until we find the last one */ | 
					
						
							| 
									
										
										
										
											2010-03-08 09:18:52 +00:00
										 |  |  |   attvar_record *attv = RepAttVar(pt1); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   CELL *myH = H; | 
					
						
							|  |  |  |   CELL *bind_ptr; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-15 14:17:30 +00:00
										 |  |  |   if (IsVarTerm(Deref(attv->Atts))) { | 
					
						
							|  |  |  |     /* no attributes to wake */ | 
					
						
							|  |  |  |     return; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   if (IsVarTerm(reg2)) { | 
					
						
							| 
									
										
										
										
											2004-09-10 20:18:01 +00:00
										 |  |  |     if (pt1 == VarOfTerm(reg2)) | 
					
						
							|  |  |  |       return; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     if (IsAttachedTerm(reg2)) { | 
					
						
							| 
									
										
										
										
											2010-03-08 09:18:52 +00:00
										 |  |  |       attvar_record *susp2 = RepAttVar(VarOfTerm(reg2)); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |       /* binding two suspended variables, be careful */ | 
					
						
							|  |  |  |       if (susp2 >= attv) { | 
					
						
							| 
									
										
										
										
											2004-09-18 14:03:42 +00:00
										 |  |  | 	if (!IsVarTerm(susp2->Value) || !IsUnboundVar(&susp2->Value)) { | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 	  /* oops, our goal is on the queue to be woken */ | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  | 	  if (!Yap_unify(susp2->Value, (CELL)pt1)) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | 	    AddFailToQueue( PASS_REGS1 ); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 	  } | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2011-03-18 19:34:58 +00:00
										 |  |  | 	Bind_Global_NonAtt(&(susp2->Value), (CELL)pt1); | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | 	AddToQueue(susp2 PASS_REGS); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 	return; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2011-03-18 19:34:58 +00:00
										 |  |  |       Bind_NonAtt(VarOfTerm(reg2), (CELL)pt1); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2004-09-18 14:03:42 +00:00
										 |  |  |   if (!IsVarTerm(attv->Value) || !IsUnboundVar(&attv->Value)) { | 
					
						
							| 
									
										
										
										
											2002-04-13 04:39:03 +00:00
										 |  |  |     /* oops, our goal is on the queue to be woken */ | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     if (!Yap_unify(attv->Value, reg2)) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       AddFailToQueue( PASS_REGS1 ); | 
					
						
							| 
									
										
										
										
											2002-04-13 04:39:03 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |     return; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   bind_ptr = AddToQueue(attv PASS_REGS); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   if (IsNonVarTerm(reg2)) { | 
					
						
							|  |  |  |     if (IsPairTerm(reg2) && RepPair(reg2) == myH) | 
					
						
							|  |  |  |       reg2 = AbsPair(H); | 
					
						
							|  |  |  |     else if (IsApplTerm(reg2) && RepAppl(reg2) == myH) | 
					
						
							|  |  |  |       reg2 = AbsAppl(H); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   *bind_ptr = reg2; | 
					
						
							| 
									
										
										
										
											2011-03-18 19:34:58 +00:00
										 |  |  |   Bind_Global_NonAtt(&(attv->Value), reg2); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-06-05 03:37:01 +00:00
										 |  |  | void | 
					
						
							|  |  |  | Yap_WakeUp(CELL *pt0) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2004-06-05 03:37:01 +00:00
										 |  |  |   CELL d0 = *pt0; | 
					
						
							|  |  |  |   RESET_VARIABLE(pt0); | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   WakeAttVar(pt0, d0 PASS_REGS); | 
					
						
							| 
									
										
										
										
											2004-06-05 03:37:01 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | static void | 
					
						
							|  |  |  | mark_attvar(CELL *orig) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-03-08 09:18:52 +00:00
										 |  |  |   return; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-04 16:48:54 +00:00
										 |  |  | static Term | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | BuildAttTerm(Functor mfun, UInt ar USES_REGS) | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   CELL *h0 = H; | 
					
						
							|  |  |  |   UInt i; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |   if (H+(1024+ar) > ASP) { | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |     LOCAL_Error_Size=ar*sizeof(CELL); | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |     return 0L; | 
					
						
							| 
									
										
										
										
											2001-07-04 16:48:54 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |   H[0] = (CELL)mfun; | 
					
						
							|  |  |  |   RESET_VARIABLE(H+1); | 
					
						
							|  |  |  |   H += 2; | 
					
						
							|  |  |  |   for (i = 1; i< ar; i++) { | 
					
						
							| 
									
										
										
										
											2006-01-07 02:12:32 +00:00
										 |  |  |     *H = TermVoidAtt; | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |     H++; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |   return AbsAppl(h0); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  | static Term  | 
					
						
							|  |  |  | SearchAttsForModule(Term start, Functor mfun) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   do { | 
					
						
							|  |  |  |     if (IsVarTerm(start) || | 
					
						
							|  |  |  | 	FunctorOfTerm(start) == mfun) | 
					
						
							|  |  |  |       return start; | 
					
						
							|  |  |  |     start = ArgOfTerm(1,start); | 
					
						
							|  |  |  |   } while (TRUE); | 
					
						
							| 
									
										
										
										
											2004-06-05 03:37:01 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  | static Term  | 
					
						
							|  |  |  | SearchAttsForModuleName(Term start, Atom mname) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   do { | 
					
						
							|  |  |  |     if (IsVarTerm(start) || | 
					
						
							|  |  |  | 	NameOfFunctor(FunctorOfTerm(start)) == mname) | 
					
						
							|  |  |  |       return start; | 
					
						
							|  |  |  |     start = ArgOfTerm(1,start); | 
					
						
							|  |  |  |   } while (TRUE); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void  | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | AddNewModule(attvar_record *attv, Term t, int new, int do_it USES_REGS) | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2006-01-07 02:12:32 +00:00
										 |  |  |   CELL *newp = RepAppl(t)+2; | 
					
						
							|  |  |  |   UInt i, ar = ArityOfFunctor((Functor)newp[-2]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   for (i=1; i< ar; i++) { | 
					
						
							|  |  |  |     Term n = Deref(*newp); | 
					
						
							|  |  |  |     if (n == TermFreeTerm) { | 
					
						
							|  |  |  |       *newp = TermVoidAtt; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       if (n != TermVoidAtt) | 
					
						
							|  |  |  | 	do_it = TRUE; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     newp++; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (!do_it) | 
					
						
							|  |  |  |     return; | 
					
						
							| 
									
										
										
										
											2011-03-18 19:34:58 +00:00
										 |  |  |   if (new) { | 
					
						
							|  |  |  |     attv->Atts = t; | 
					
						
							|  |  |  |   } else if (IsVarTerm(attv->Atts)) { | 
					
						
							|  |  |  |     MaBind(&(attv->Atts),t); | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |   } else { | 
					
						
							|  |  |  |     Term *wherep = &attv->Atts; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     do { | 
					
						
							|  |  |  |       if (IsVarTerm(*wherep)) { | 
					
						
							| 
									
										
										
										
											2011-03-18 19:34:58 +00:00
										 |  |  | 	Bind_Global_NonAtt(wherep,t);       | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  | 	return; | 
					
						
							|  |  |  |       } else { | 
					
						
							|  |  |  | 	wherep = RepAppl(Deref(*wherep))+1; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } while (TRUE); | 
					
						
							| 
									
										
										
										
											2003-02-14 10:52:00 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  | static void  | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | ReplaceAtts(attvar_record *attv, Term oatt, Term att USES_REGS) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |   UInt ar = ArityOfFunctor(FunctorOfTerm(oatt)), i; | 
					
						
							|  |  |  |   CELL *oldp = RepAppl(oatt)+1; | 
					
						
							| 
									
										
										
										
											2006-01-02 02:16:19 +00:00
										 |  |  |   CELL *newp; | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-01-02 02:16:19 +00:00
										 |  |  |   if (oldp > HB) { | 
					
						
							|  |  |  |     oldp++; | 
					
						
							|  |  |  |     newp = RepAppl(att)+2; | 
					
						
							|  |  |  |     /* if deterministic */ | 
					
						
							| 
									
										
										
										
											2006-01-07 02:12:32 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-01-02 02:16:19 +00:00
										 |  |  |     for (i=1; i< ar; i++) { | 
					
						
							| 
									
										
										
										
											2006-01-07 02:12:32 +00:00
										 |  |  |       Term n = Deref(*newp); | 
					
						
							|  |  |  |       if (n != TermFreeTerm) { | 
					
						
							|  |  |  | 	*oldp = n; | 
					
						
							| 
									
										
										
										
											2006-01-02 02:16:19 +00:00
										 |  |  |       } | 
					
						
							|  |  |  |       oldp++; | 
					
						
							|  |  |  |       newp++; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   newp = RepAppl(att)+1; | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |   *newp++ = *oldp++; | 
					
						
							|  |  |  |   for (i=1; i< ar; i++) { | 
					
						
							| 
									
										
										
										
											2006-01-07 02:12:32 +00:00
										 |  |  |     Term n = Deref(*newp); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (n == TermFreeTerm) { | 
					
						
							|  |  |  |       *newp = Deref(*oldp); | 
					
						
							| 
									
										
										
										
											2002-04-06 03:54:18 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |     oldp++; | 
					
						
							|  |  |  |     newp++; | 
					
						
							| 
									
										
										
										
											2002-04-06 03:54:18 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |   if (attv->Atts == oatt) { | 
					
						
							|  |  |  |     if (RepAppl(attv->Atts) >= HB) | 
					
						
							|  |  |  |       attv->Atts = att; | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       MaBind(&(attv->Atts), att); | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     Term *wherep = &attv->Atts; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |     do { | 
					
						
							|  |  |  |       if (*wherep == oatt) { | 
					
						
							|  |  |  | 	MaBind(wherep, att); | 
					
						
							|  |  |  | 	return; | 
					
						
							|  |  |  |       } else { | 
					
						
							|  |  |  | 	wherep = RepAppl(Deref(*wherep))+1; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } while (TRUE); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-27 10:57:21 +00:00
										 |  |  | static void  | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | DelAllAtts(attvar_record *attv USES_REGS) | 
					
						
							| 
									
										
										
										
											2010-03-27 10:57:21 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   MaBind(&(attv->Done), attv->Value); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-10-18 17:04:43 +00:00
										 |  |  | static void  | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | DelAtts(attvar_record *attv, Term oatt USES_REGS) | 
					
						
							| 
									
										
										
										
											2005-10-18 17:04:43 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-03-27 10:57:21 +00:00
										 |  |  |   Term t = ArgOfTerm(1,oatt); | 
					
						
							| 
									
										
										
										
											2005-10-18 17:04:43 +00:00
										 |  |  |   if (attv->Atts == oatt) { | 
					
						
							| 
									
										
										
										
											2010-03-27 10:57:21 +00:00
										 |  |  |     if (IsVarTerm(t)) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       DelAllAtts(attv PASS_REGS); | 
					
						
							| 
									
										
										
										
											2010-03-27 10:57:21 +00:00
										 |  |  |       return; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2005-10-18 17:04:43 +00:00
										 |  |  |     if (RepAppl(attv->Atts) >= HB) | 
					
						
							| 
									
										
										
										
											2010-03-27 10:57:21 +00:00
										 |  |  |       attv->Atts = t; | 
					
						
							| 
									
										
										
										
											2005-10-18 17:04:43 +00:00
										 |  |  |     else | 
					
						
							| 
									
										
										
										
											2010-03-27 10:57:21 +00:00
										 |  |  |       MaBind(&(attv->Atts), t); | 
					
						
							| 
									
										
										
										
											2005-10-18 17:04:43 +00:00
										 |  |  |   } else { | 
					
						
							|  |  |  |     Term *wherep = &attv->Atts; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     do { | 
					
						
							|  |  |  |       if (*wherep == oatt) { | 
					
						
							| 
									
										
										
										
											2010-03-27 10:57:21 +00:00
										 |  |  | 	MaBind(wherep, t); | 
					
						
							| 
									
										
										
										
											2005-10-18 17:04:43 +00:00
										 |  |  | 	return; | 
					
						
							|  |  |  |       } else { | 
					
						
							|  |  |  | 	wherep = RepAppl(Deref(*wherep))+1; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } while (TRUE); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  | static void  | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | PutAtt(Int pos, Term atts, Term att USES_REGS) | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   if (IsVarTerm(att) && (CELL *)att > H && (CELL *)att < LCL0) { | 
					
						
							|  |  |  |     /* globalise locals */ | 
					
						
							|  |  |  |     Term tnew = MkVarTerm(); | 
					
						
							| 
									
										
										
										
											2011-03-18 19:34:58 +00:00
										 |  |  |     Bind_NonAtt((CELL *)att, tnew); | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |     att = tnew; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   MaBind(RepAppl(atts)+pos, att); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static Int | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | BindAttVar(attvar_record *attv USES_REGS) { | 
					
						
							| 
									
										
										
										
											2004-09-18 14:03:42 +00:00
										 |  |  |   if (IsVarTerm(attv->Done) && IsUnboundVar(&attv->Done)) { | 
					
						
							| 
									
										
										
										
											2003-02-14 10:52:00 +00:00
										 |  |  |     /* make sure we are not trying to bind a variable against itself */ | 
					
						
							|  |  |  |     if (!IsVarTerm(attv->Value)) { | 
					
						
							| 
									
										
										
										
											2011-03-18 19:34:58 +00:00
										 |  |  |       Bind_Global_NonAtt(&(attv->Done), attv->Value); | 
					
						
							| 
									
										
										
										
											2003-02-14 10:52:00 +00:00
										 |  |  |     } else if (IsVarTerm(attv->Value)) { | 
					
						
							|  |  |  |       Term t = Deref(attv->Value); | 
					
						
							|  |  |  |       if (IsVarTerm(t)) { | 
					
						
							|  |  |  | 	if (IsAttachedTerm(t)) { | 
					
						
							| 
									
										
										
										
											2010-03-08 09:18:52 +00:00
										 |  |  | 	  attvar_record *attv2 = RepAttVar(VarOfTerm(t)); | 
					
						
							| 
									
										
										
										
											2003-02-14 10:52:00 +00:00
										 |  |  | 	  if (attv2 < attv) { | 
					
						
							| 
									
										
										
										
											2011-03-18 19:34:58 +00:00
										 |  |  | 	    Bind_Global_NonAtt(&(attv->Done), t); | 
					
						
							| 
									
										
										
										
											2003-02-14 10:52:00 +00:00
										 |  |  | 	  } else { | 
					
						
							| 
									
										
										
										
											2011-03-18 19:34:58 +00:00
										 |  |  | 	    Bind_Global_NonAtt(&(attv2->Done), AbsAttVar(attv)); | 
					
						
							| 
									
										
										
										
											2003-02-14 10:52:00 +00:00
										 |  |  | 	  } | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 	  Yap_Error(SYSTEM_ERROR,(CELL)&(attv->Done),"attvar was bound when unset"); | 
					
						
							|  |  |  | 	  return(FALSE); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  |       } else { | 
					
						
							| 
									
										
										
										
											2011-03-18 19:34:58 +00:00
										 |  |  | 	Bind_Global_NonAtt(&(attv->Done), t); | 
					
						
							| 
									
										
										
										
											2003-02-14 10:52:00 +00:00
										 |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     return(TRUE); | 
					
						
							|  |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     Yap_Error(SYSTEM_ERROR,(CELL)&(attv->Done),"attvar was bound when set"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     return(FALSE); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-09 17:59:25 -05:00
										 |  |  | static Int | 
					
						
							|  |  |  | UnBindAttVar(attvar_record *attv) { | 
					
						
							|  |  |  |   RESET_VARIABLE(&(attv->Value)); | 
					
						
							|  |  |  |   return(TRUE); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | static Term | 
					
						
							|  |  |  | GetAllAtts(attvar_record *attv) { | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |   /* check if we are already there */ | 
					
						
							|  |  |  |   return attv->Atts; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static Int | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | p_put_att( USES_REGS1 ) { | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   /* receive a variable in ARG1 */ | 
					
						
							|  |  |  |   Term inp = Deref(ARG1); | 
					
						
							|  |  |  |   /* if this is unbound, ok */ | 
					
						
							|  |  |  |   if (IsVarTerm(inp)) { | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |     attvar_record *attv; | 
					
						
							|  |  |  |     Atom modname = AtomOfTerm(Deref(ARG2)); | 
					
						
							|  |  |  |     UInt ar = IntegerOfTerm(Deref(ARG3)); | 
					
						
							|  |  |  |     Functor mfun; | 
					
						
							|  |  |  |     Term tatts; | 
					
						
							|  |  |  |     int new = FALSE; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |     if (IsAttachedTerm(inp)) { | 
					
						
							| 
									
										
										
										
											2010-03-08 09:18:52 +00:00
										 |  |  |       attv = RepAttVar(VarOfTerm(inp)); | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       while (!(attv = BuildNewAttVar( PASS_REGS1 ))) { | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  | 	LOCAL_Error_Size = sizeof(attvar_record); | 
					
						
							|  |  |  | 	if (!Yap_gcl(LOCAL_Error_Size, 5, ENV, gc_P(P,CP))) { | 
					
						
							|  |  |  | 	  Yap_Error(OUT_OF_STACK_ERROR, TermNil, LOCAL_ErrorMessage); | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  | 	  return FALSE; | 
					
						
							| 
									
										
										
										
											2010-03-08 09:18:52 +00:00
										 |  |  | 	}     | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  | 	inp = Deref(ARG1); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |       new = TRUE; | 
					
						
							| 
									
										
										
										
											2004-09-27 20:45:04 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |     mfun= Yap_MkFunctor(modname,ar); | 
					
						
							|  |  |  |     if (IsVarTerm(tatts = SearchAttsForModule(attv->Atts,mfun))) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       while (!(tatts = BuildAttTerm(mfun,ar PASS_REGS))) { | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  | 	if (!Yap_gcl(LOCAL_Error_Size, 5, ENV, gc_P(P,CP))) { | 
					
						
							|  |  |  | 	  Yap_Error(OUT_OF_STACK_ERROR, TermNil, LOCAL_ErrorMessage); | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  | 	  return FALSE; | 
					
						
							|  |  |  | 	}     | 
					
						
							| 
									
										
										
										
											2004-09-27 20:45:04 +00:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2012-08-14 16:07:26 -05:00
										 |  |  |       { | 
					
						
							|  |  |  | 	CELL *ptr = VarOfTerm(Deref(ARG1)); | 
					
						
							|  |  |  | 	CELL d0 = AbsAttVar(attv); | 
					
						
							|  |  |  | 	Bind_NonAtt(ptr, d0); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       AddNewModule(attv, tatts, new, TRUE PASS_REGS); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |     PutAtt(IntegerOfTerm(Deref(ARG4)), tatts, Deref(ARG5) PASS_REGS); | 
					
						
							| 
									
										
										
										
											2004-09-27 20:45:04 +00:00
										 |  |  |     return TRUE; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2009-05-22 21:51:48 -05:00
										 |  |  |     Yap_Error(REPRESENTATION_ERROR_VARIABLE,inp,"first argument of put_attributes/2"); | 
					
						
							|  |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-10-31 18:12:51 +00:00
										 |  |  | static Int | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | p_put_att_term( USES_REGS1 ) { | 
					
						
							| 
									
										
										
										
											2005-10-31 18:12:51 +00:00
										 |  |  |   /* receive a variable in ARG1 */ | 
					
						
							|  |  |  |   Term inp = Deref(ARG1); | 
					
						
							|  |  |  |   /* if this is unbound, ok */ | 
					
						
							|  |  |  |   if (IsVarTerm(inp)) { | 
					
						
							|  |  |  |     attvar_record *attv; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (IsAttachedTerm(inp)) { | 
					
						
							| 
									
										
										
										
											2010-03-08 09:18:52 +00:00
										 |  |  |       attv = RepAttVar(VarOfTerm(inp)); | 
					
						
							| 
									
										
										
										
											2011-03-18 19:34:58 +00:00
										 |  |  |       MaBind(&(attv->Atts), Deref(ARG2)); | 
					
						
							| 
									
										
										
										
											2005-10-31 18:12:51 +00:00
										 |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       while (!(attv = BuildNewAttVar( PASS_REGS1 ))) { | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  | 	LOCAL_Error_Size = sizeof(attvar_record); | 
					
						
							|  |  |  | 	if (!Yap_gcl(LOCAL_Error_Size, 5, ENV, gc_P(P,CP))) { | 
					
						
							|  |  |  | 	  Yap_Error(OUT_OF_STACK_ERROR, TermNil, LOCAL_ErrorMessage); | 
					
						
							| 
									
										
										
										
											2005-10-31 18:12:51 +00:00
										 |  |  | 	  return FALSE; | 
					
						
							| 
									
										
										
										
											2010-03-08 09:18:52 +00:00
										 |  |  | 	}     | 
					
						
							| 
									
										
										
										
											2005-10-31 18:12:51 +00:00
										 |  |  | 	inp = Deref(ARG1); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2011-03-18 19:34:58 +00:00
										 |  |  |       Bind_NonAtt(VarOfTerm(inp), AbsAttVar(attv)); | 
					
						
							|  |  |  |       attv->Atts = Deref(ARG2); | 
					
						
							| 
									
										
										
										
											2005-10-31 18:12:51 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |     return TRUE; | 
					
						
							|  |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2009-05-22 21:51:48 -05:00
										 |  |  |     Yap_Error(REPRESENTATION_ERROR_VARIABLE,inp,"first argument of put_att_term/2"); | 
					
						
							| 
									
										
										
										
											2005-10-31 18:12:51 +00:00
										 |  |  |     return(FALSE); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-06-05 03:37:01 +00:00
										 |  |  | static Int | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | p_rm_att( USES_REGS1 ) { | 
					
						
							| 
									
										
										
										
											2004-06-05 03:37:01 +00:00
										 |  |  |   /* receive a variable in ARG1 */ | 
					
						
							|  |  |  |   Term inp = Deref(ARG1); | 
					
						
							|  |  |  |   /* if this is unbound, ok */ | 
					
						
							|  |  |  |   if (IsVarTerm(inp)) { | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |     attvar_record *attv; | 
					
						
							|  |  |  |     Atom modname = AtomOfTerm(Deref(ARG2)); | 
					
						
							|  |  |  |     UInt ar = IntegerOfTerm(Deref(ARG3)); | 
					
						
							|  |  |  |     Functor mfun; | 
					
						
							|  |  |  |     Term tatts; | 
					
						
							|  |  |  |     int new = FALSE; | 
					
						
							| 
									
										
										
										
											2004-06-05 03:37:01 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |     if (IsAttachedTerm(inp)) { | 
					
						
							| 
									
										
										
										
											2010-03-08 09:18:52 +00:00
										 |  |  |       attv = RepAttVar(VarOfTerm(inp)); | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       while (!(attv = BuildNewAttVar( PASS_REGS1 ))) { | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  | 	LOCAL_Error_Size = sizeof(attvar_record); | 
					
						
							|  |  |  | 	if (!Yap_gcl(LOCAL_Error_Size, 5, ENV, gc_P(P,CP))) { | 
					
						
							|  |  |  | 	  Yap_Error(OUT_OF_STACK_ERROR, TermNil, LOCAL_ErrorMessage); | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  | 	  return FALSE; | 
					
						
							| 
									
										
										
										
											2010-03-08 09:18:52 +00:00
										 |  |  | 	}     | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  | 	inp = Deref(ARG1); | 
					
						
							| 
									
										
										
										
											2004-06-05 03:37:01 +00:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |       new = TRUE; | 
					
						
							| 
									
										
										
										
											2010-03-08 09:18:52 +00:00
										 |  |  |       Yap_unify(ARG1, AbsAttVar(attv)); | 
					
						
							| 
									
										
										
										
											2004-06-05 03:37:01 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |     mfun= Yap_MkFunctor(modname,ar); | 
					
						
							|  |  |  |     if (IsVarTerm(tatts = SearchAttsForModule(attv->Atts,mfun))) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       while (!(tatts = BuildAttTerm(mfun, ar PASS_REGS))) { | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  | 	if (!Yap_gcl(LOCAL_Error_Size, 4, ENV, gc_P(P,CP))) { | 
					
						
							|  |  |  | 	  Yap_Error(OUT_OF_STACK_ERROR, TermNil, LOCAL_ErrorMessage); | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  | 	  return FALSE; | 
					
						
							|  |  |  | 	}     | 
					
						
							| 
									
										
										
										
											2004-09-27 20:45:04 +00:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       AddNewModule(attv,tatts,new, FALSE PASS_REGS); | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       PutAtt(IntegerOfTerm(Deref(ARG4)), tatts, TermVoidAtt PASS_REGS); | 
					
						
							| 
									
										
										
										
											2004-09-27 20:45:04 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |     return TRUE; | 
					
						
							| 
									
										
										
										
											2004-06-05 03:37:01 +00:00
										 |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2009-05-22 21:51:48 -05:00
										 |  |  |     Yap_Error(REPRESENTATION_ERROR_VARIABLE,inp,"first argument of rm_att/2"); | 
					
						
							| 
									
										
										
										
											2004-06-05 03:37:01 +00:00
										 |  |  |     return(FALSE); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | static Int | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | p_put_atts( USES_REGS1 ) { | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   /* receive a variable in ARG1 */ | 
					
						
							|  |  |  |   Term inp = Deref(ARG1); | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   /* if this is unbound, ok */ | 
					
						
							|  |  |  |   if (IsVarTerm(inp)) { | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |     attvar_record *attv; | 
					
						
							| 
									
										
										
										
											2010-03-30 12:45:32 +01:00
										 |  |  |     Term otatts; | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |     Term tatts = Deref(ARG2); | 
					
						
							|  |  |  |     Functor mfun = FunctorOfTerm(tatts); | 
					
						
							|  |  |  |     int new = FALSE; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-30 12:45:32 +01:00
										 |  |  |     tatts = Deref(ARG2); | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |     if (IsAttachedTerm(inp)) { | 
					
						
							| 
									
										
										
										
											2010-03-08 09:18:52 +00:00
										 |  |  |       attv = RepAttVar(VarOfTerm(inp)); | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       while (!(attv = BuildNewAttVar( PASS_REGS1 ))) { | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  | 	LOCAL_Error_Size = sizeof(attvar_record); | 
					
						
							|  |  |  | 	if (!Yap_gcl(LOCAL_Error_Size, 2, ENV, gc_P(P,CP))) { | 
					
						
							|  |  |  | 	  Yap_Error(OUT_OF_STACK_ERROR, TermNil, LOCAL_ErrorMessage); | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  | 	  return FALSE; | 
					
						
							| 
									
										
										
										
											2010-03-08 09:18:52 +00:00
										 |  |  | 	}     | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  | 	tatts = Deref(ARG2); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |       new = TRUE; | 
					
						
							| 
									
										
										
										
											2010-03-08 09:18:52 +00:00
										 |  |  |       Yap_unify(ARG1, AbsAttVar(attv)); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-03-30 12:45:32 +01:00
										 |  |  |     /* we may have a stack shift meanwhile!! */  | 
					
						
							|  |  |  |     tatts = Deref(ARG2); | 
					
						
							| 
									
										
										
										
											2011-02-02 20:14:36 +00:00
										 |  |  |     if (IsVarTerm(tatts)) { | 
					
						
							|  |  |  |       Yap_Error(INSTANTIATION_ERROR,tatts,"second argument of put_att/2"); | 
					
						
							|  |  |  |       return FALSE; | 
					
						
							|  |  |  |     } else if (!IsApplTerm(tatts)) { | 
					
						
							|  |  |  |       Yap_Error(TYPE_ERROR_COMPOUND,tatts,"second argument of put_att/2"); | 
					
						
							|  |  |  |       return FALSE; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |     if (IsVarTerm(otatts = SearchAttsForModule(attv->Atts,mfun))) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       AddNewModule(attv, tatts, new, FALSE PASS_REGS); | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       ReplaceAtts(attv, otatts, tatts PASS_REGS); | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |     return TRUE; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2009-05-22 21:51:48 -05:00
										 |  |  |     Yap_Error(REPRESENTATION_ERROR_VARIABLE,inp,"first argument of put_att/2"); | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-10-18 17:04:43 +00:00
										 |  |  | static Int | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | p_del_atts( USES_REGS1 ) { | 
					
						
							| 
									
										
										
										
											2005-10-18 17:04:43 +00:00
										 |  |  |   /* receive a variable in ARG1 */ | 
					
						
							|  |  |  |   Term inp = Deref(ARG1); | 
					
						
							|  |  |  |   Term otatts; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* if this is unbound, ok */ | 
					
						
							|  |  |  |   if (IsVarTerm(inp)) { | 
					
						
							|  |  |  |     attvar_record *attv; | 
					
						
							|  |  |  |     Term tatts = Deref(ARG2); | 
					
						
							|  |  |  |     Functor mfun = FunctorOfTerm(tatts); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (IsAttachedTerm(inp)) { | 
					
						
							| 
									
										
										
										
											2010-03-08 09:18:52 +00:00
										 |  |  |       attv = RepAttVar(VarOfTerm(inp)); | 
					
						
							| 
									
										
										
										
											2005-10-18 17:04:43 +00:00
										 |  |  |     } else { | 
					
						
							|  |  |  |       return TRUE; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if (IsVarTerm(otatts = SearchAttsForModule(attv->Atts,mfun))) { | 
					
						
							|  |  |  |       return TRUE; | 
					
						
							|  |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       DelAtts(attv, otatts PASS_REGS); | 
					
						
							| 
									
										
										
										
											2005-10-18 17:04:43 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |     return TRUE; | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     return TRUE; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-03 19:08:17 +00:00
										 |  |  | static Int | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | p_del_all_atts( USES_REGS1 ) { | 
					
						
							| 
									
										
										
										
											2010-03-03 19:08:17 +00:00
										 |  |  |   /* receive a variable in ARG1 */ | 
					
						
							|  |  |  |   Term inp = Deref(ARG1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* if this is unbound, ok */ | 
					
						
							|  |  |  |   if (IsVarTerm(inp) && IsAttachedTerm(inp)) { | 
					
						
							|  |  |  |     attvar_record *attv; | 
					
						
							|  |  |  |        | 
					
						
							| 
									
										
										
										
											2010-03-08 09:18:52 +00:00
										 |  |  |     attv = RepAttVar(VarOfTerm(inp)); | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |     DelAllAtts(attv PASS_REGS); | 
					
						
							| 
									
										
										
										
											2010-03-03 19:08:17 +00:00
										 |  |  |   }  | 
					
						
							|  |  |  |   return TRUE; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | static Int | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | p_get_att( USES_REGS1 ) { | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   /* receive a variable in ARG1 */ | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |   Term inp = Deref(ARG1); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   /* if this is unbound, ok */ | 
					
						
							|  |  |  |   if (IsVarTerm(inp)) { | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |     Atom modname = AtomOfTerm(Deref(ARG2)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     if (IsAttachedTerm(inp)) { | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |       attvar_record *attv; | 
					
						
							|  |  |  |       Term tout, tatts; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 09:18:52 +00:00
										 |  |  |       attv = RepAttVar(VarOfTerm(inp)); | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |       if (IsVarTerm(tatts = SearchAttsForModuleName(attv->Atts,modname))) | 
					
						
							| 
									
										
										
										
											2004-12-07 06:01:55 +00:00
										 |  |  | 	return FALSE; | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |       tout = ArgOfTerm(IntegerOfTerm(Deref(ARG3)),tatts); | 
					
						
							| 
									
										
										
										
											2006-01-07 02:12:32 +00:00
										 |  |  |       if (tout == TermVoidAtt) return FALSE; | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |       return Yap_unify(tout, ARG4);       | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       /* Yap_Error(INSTANTIATION_ERROR,inp,"get_att/2"); */ | 
					
						
							|  |  |  |       return FALSE; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2009-05-22 21:51:48 -05:00
										 |  |  |     Yap_Error(REPRESENTATION_ERROR_VARIABLE,inp,"first argument of get_att/2"); | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |     return(FALSE); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static Int | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | p_free_att( USES_REGS1 ) { | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   /* receive a variable in ARG1 */ | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |   Term inp = Deref(ARG1); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   /* if this is unbound, ok */ | 
					
						
							|  |  |  |   if (IsVarTerm(inp)) { | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |     Atom modname = AtomOfTerm(Deref(ARG2)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     if (IsAttachedTerm(inp)) { | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |       attvar_record *attv; | 
					
						
							|  |  |  |       Term tout, tatts; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 09:18:52 +00:00
										 |  |  |       attv = RepAttVar(VarOfTerm(inp)); | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |       if (IsVarTerm(tatts = SearchAttsForModuleName(attv->Atts,modname))) | 
					
						
							|  |  |  | 	return TRUE; | 
					
						
							|  |  |  |       tout = ArgOfTerm(IntegerOfTerm(Deref(ARG3)),tatts); | 
					
						
							| 
									
										
										
										
											2006-01-07 02:12:32 +00:00
										 |  |  |       return (tout == TermVoidAtt); | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |     } else { | 
					
						
							|  |  |  |       /* Yap_Error(INSTANTIATION_ERROR,inp,"get_att/2"); */ | 
					
						
							|  |  |  |       return TRUE; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2009-05-22 21:51:48 -05:00
										 |  |  |     Yap_Error(REPRESENTATION_ERROR_VARIABLE,inp,"first argument of free_att/2"); | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |     return(FALSE); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  | static Int | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | p_get_atts( USES_REGS1 ) { | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |   /* receive a variable in ARG1 */ | 
					
						
							|  |  |  |   Term inp = Deref(ARG1); | 
					
						
							|  |  |  |   /* if this is unbound, ok */ | 
					
						
							|  |  |  |   if (IsVarTerm(inp)) { | 
					
						
							|  |  |  |     if (IsAttachedTerm(inp)) { | 
					
						
							|  |  |  |       attvar_record *attv; | 
					
						
							|  |  |  |       Term tatts; | 
					
						
							|  |  |  |       Term access = Deref(ARG2); | 
					
						
							|  |  |  |       Functor mfun = FunctorOfTerm(access); | 
					
						
							|  |  |  |       UInt ar, i; | 
					
						
							|  |  |  |       CELL *old, *new; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 09:18:52 +00:00
										 |  |  |       attv = RepAttVar(VarOfTerm(inp)); | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |       if (IsVarTerm(tatts = SearchAttsForModule(attv->Atts,mfun))) | 
					
						
							|  |  |  | 	return FALSE; | 
					
						
							|  |  |  |        | 
					
						
							|  |  |  |       ar = ArityOfFunctor(mfun); | 
					
						
							|  |  |  |       new = RepAppl(access)+2; | 
					
						
							|  |  |  |       old = RepAppl(tatts)+2; | 
					
						
							|  |  |  |       for (i = 1; i < ar; i++,new++,old++) { | 
					
						
							|  |  |  | 	if (*new != TermFreeTerm) { | 
					
						
							| 
									
										
										
										
											2006-01-07 02:12:32 +00:00
										 |  |  | 	  if (*old == TermVoidAtt && *new != TermVoidAtt) | 
					
						
							|  |  |  | 	    return FALSE; | 
					
						
							|  |  |  | 	  if (*new == TermVoidAtt && *old != TermVoidAtt) | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  | 	    return FALSE; | 
					
						
							|  |  |  | 	  if (!Yap_unify(*new,*old)) return FALSE; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |       return TRUE; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       /* Yap_Error(INSTANTIATION_ERROR,inp,"get_att/2"); */ | 
					
						
							|  |  |  |       return FALSE; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     return(FALSE); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static Int | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | p_has_atts( USES_REGS1 ) { | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |   /* receive a variable in ARG1 */ | 
					
						
							|  |  |  |   Term inp = Deref(ARG1); | 
					
						
							|  |  |  |   /* if this is unbound, ok */ | 
					
						
							|  |  |  |   if (IsVarTerm(inp)) { | 
					
						
							|  |  |  |     if (IsAttachedTerm(inp)) { | 
					
						
							|  |  |  |       attvar_record *attv; | 
					
						
							|  |  |  |       Term tatts; | 
					
						
							|  |  |  |       Term access = Deref(ARG2); | 
					
						
							|  |  |  |       Functor mfun = FunctorOfTerm(access); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 09:18:52 +00:00
										 |  |  |       attv = RepAttVar(VarOfTerm(inp)); | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |       return !IsVarTerm(tatts = SearchAttsForModule(attv->Atts,mfun)); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       /* Yap_Error(INSTANTIATION_ERROR,inp,"get_att/2"); */ | 
					
						
							|  |  |  |       return FALSE; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2009-05-22 21:51:48 -05:00
										 |  |  |     Yap_Error(REPRESENTATION_ERROR_VARIABLE,inp,"first argument of has_atts/2"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     return(FALSE); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static Int | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | p_bind_attvar( USES_REGS1 ) { | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   /* receive a variable in ARG1 */ | 
					
						
							|  |  |  |   Term  inp = Deref(ARG1); | 
					
						
							|  |  |  |   /* if this is unbound, ok */ | 
					
						
							|  |  |  |   if (IsVarTerm(inp)) { | 
					
						
							|  |  |  |     if (IsAttachedTerm(inp)) { | 
					
						
							| 
									
										
										
										
											2010-03-08 09:18:52 +00:00
										 |  |  |       attvar_record *attv = RepAttVar(VarOfTerm(inp)); | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       return(BindAttVar(attv PASS_REGS)); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |     return(TRUE); | 
					
						
							|  |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2009-05-22 21:51:48 -05:00
										 |  |  |     Yap_Error(REPRESENTATION_ERROR_VARIABLE,inp,"first argument of bind_attvar/2"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     return(FALSE); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-09 17:59:25 -05:00
										 |  |  | static Int | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | p_unbind_attvar( USES_REGS1 ) { | 
					
						
							| 
									
										
										
										
											2009-09-09 17:59:25 -05:00
										 |  |  |   /* receive a variable in ARG1 */ | 
					
						
							|  |  |  |   Term  inp = Deref(ARG1); | 
					
						
							|  |  |  |   /* if this is unbound, ok */ | 
					
						
							|  |  |  |   if (IsVarTerm(inp)) { | 
					
						
							|  |  |  |     if (IsAttachedTerm(inp)) { | 
					
						
							| 
									
										
										
										
											2010-03-08 09:18:52 +00:00
										 |  |  |       attvar_record *attv = RepAttVar(VarOfTerm(inp)); | 
					
						
							| 
									
										
										
										
											2009-09-09 17:59:25 -05:00
										 |  |  |       return(UnBindAttVar(attv)); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return(TRUE); | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     Yap_Error(REPRESENTATION_ERROR_VARIABLE,inp,"first argument of bind_attvar/2"); | 
					
						
							|  |  |  |     return(FALSE); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | static Int | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | p_get_all_atts( USES_REGS1 ) { | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   /* receive a variable in ARG1 */ | 
					
						
							|  |  |  |   Term inp = Deref(ARG1); | 
					
						
							|  |  |  |   /* if this is unbound, ok */ | 
					
						
							|  |  |  |   if (IsVarTerm(inp)) { | 
					
						
							|  |  |  |     if (IsAttachedTerm(inp)) { | 
					
						
							| 
									
										
										
										
											2010-03-08 09:18:52 +00:00
										 |  |  |       attvar_record *attv = RepAttVar(VarOfTerm(inp)); | 
					
						
							| 
									
										
										
										
											2004-12-16 05:57:32 +00:00
										 |  |  |       return Yap_unify(ARG2,GetAllAtts(attv)); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2004-12-16 05:57:32 +00:00
										 |  |  |     return TRUE; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2009-05-22 21:51:48 -05:00
										 |  |  |     Yap_Error(REPRESENTATION_ERROR_VARIABLE,inp,"first argument of get_all_atts/2"); | 
					
						
							| 
									
										
										
										
											2004-12-16 05:57:32 +00:00
										 |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-10-18 17:04:43 +00:00
										 |  |  | static int | 
					
						
							|  |  |  | ActiveAtt(Term tatt, UInt ar) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2006-01-04 03:47:49 +00:00
										 |  |  |   CELL *cp = RepAppl(tatt)+1; | 
					
						
							| 
									
										
										
										
											2005-10-18 17:04:43 +00:00
										 |  |  |   UInt i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   for (i = 1; i < ar; i++) { | 
					
						
							| 
									
										
										
										
											2006-01-07 02:12:32 +00:00
										 |  |  |     if (cp[i] != TermVoidAtt) | 
					
						
							| 
									
										
										
										
											2005-10-18 17:04:43 +00:00
										 |  |  |       return TRUE; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return FALSE; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | static Int | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | p_modules_with_atts( USES_REGS1 ) { | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |   /* receive a variable in ARG1 */ | 
					
						
							|  |  |  |   Term inp = Deref(ARG1); | 
					
						
							|  |  |  |   /* if this is unbound, ok */ | 
					
						
							|  |  |  |   if (IsVarTerm(inp)) { | 
					
						
							|  |  |  |     if (IsAttachedTerm(inp)) { | 
					
						
							| 
									
										
										
										
											2010-03-08 09:18:52 +00:00
										 |  |  |       attvar_record *attv = RepAttVar(VarOfTerm(inp)); | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |       CELL *h0 = H; | 
					
						
							|  |  |  |       Term tatt; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if (IsVarTerm(tatt = attv->Atts)) | 
					
						
							|  |  |  | 	  return Yap_unify(ARG2,TermNil); | 
					
						
							|  |  |  |       while (!IsVarTerm(tatt)) { | 
					
						
							| 
									
										
										
										
											2005-10-18 17:04:43 +00:00
										 |  |  | 	Functor f = FunctorOfTerm(tatt); | 
					
						
							| 
									
										
										
										
											2006-01-08 03:12:02 +00:00
										 |  |  | 	if (H != h0) | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  | 	  H[-1] = AbsPair(H); | 
					
						
							| 
									
										
										
										
											2005-10-18 17:04:43 +00:00
										 |  |  | 	if (ActiveAtt(tatt, ArityOfFunctor(f))) { | 
					
						
							|  |  |  | 	  *H = MkAtomTerm(NameOfFunctor(f)); | 
					
						
							|  |  |  | 	  H+=2; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  | 	tatt = ArgOfTerm(1,tatt); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2005-10-18 17:04:43 +00:00
										 |  |  |       if (h0 != H) { | 
					
						
							|  |  |  | 	H[-1] = TermNil; | 
					
						
							|  |  |  | 	return Yap_unify(ARG2,AbsPair(h0)); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2005-10-18 17:04:43 +00:00
										 |  |  |     return Yap_unify(ARG2,TermNil); | 
					
						
							|  |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2009-05-22 21:51:48 -05:00
										 |  |  |     Yap_Error(REPRESENTATION_ERROR_VARIABLE,inp,"first argument of modules_with_attributes/2"); | 
					
						
							| 
									
										
										
										
											2005-10-18 17:04:43 +00:00
										 |  |  |     return FALSE; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static Int | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | p_swi_all_atts( USES_REGS1 ) { | 
					
						
							| 
									
										
										
										
											2005-10-18 17:04:43 +00:00
										 |  |  |   /* receive a variable in ARG1 */ | 
					
						
							|  |  |  |   Term inp = Deref(ARG1); | 
					
						
							| 
									
										
										
										
											2008-12-24 09:04:44 +00:00
										 |  |  |   Functor attf = FunctorAtt1; | 
					
						
							| 
									
										
										
										
											2005-10-18 17:04:43 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   /* if this is unbound, ok */ | 
					
						
							|  |  |  |   if (IsVarTerm(inp)) { | 
					
						
							|  |  |  |     if (IsAttachedTerm(inp)) { | 
					
						
							| 
									
										
										
										
											2010-03-08 09:18:52 +00:00
										 |  |  |       attvar_record *attv = RepAttVar(VarOfTerm(inp)); | 
					
						
							| 
									
										
										
										
											2005-10-18 17:04:43 +00:00
										 |  |  |       CELL *h0 = H; | 
					
						
							|  |  |  |       Term tatt; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if (IsVarTerm(tatt = attv->Atts)) | 
					
						
							|  |  |  | 	  return Yap_unify(ARG2,TermNil); | 
					
						
							|  |  |  |       while (!IsVarTerm(tatt)) { | 
					
						
							|  |  |  | 	Functor f = FunctorOfTerm(tatt); | 
					
						
							| 
									
										
										
										
											2010-06-30 17:54:58 +02:00
										 |  |  | 	UInt ar = ArityOfFunctor(f); | 
					
						
							| 
									
										
										
										
											2005-10-18 17:04:43 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-30 17:54:58 +02:00
										 |  |  | 	if (H != h0) | 
					
						
							|  |  |  | 	  H[-1] = AbsAppl(H); | 
					
						
							|  |  |  | 	H[0] = (CELL) attf; | 
					
						
							|  |  |  | 	H[1] = MkAtomTerm(NameOfFunctor(f)); | 
					
						
							|  |  |  | 	/* SWI */ | 
					
						
							|  |  |  | 	if (ar == 2)  | 
					
						
							|  |  |  | 	  H[2] =  ArgOfTerm(2,tatt); | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 	  H[2] =  tatt; | 
					
						
							|  |  |  | 	H += 4; | 
					
						
							|  |  |  | 	H[-1] = AbsAppl(H); | 
					
						
							| 
									
										
										
										
											2005-10-18 17:04:43 +00:00
										 |  |  | 	tatt = ArgOfTerm(1,tatt); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       if (h0 != H) { | 
					
						
							|  |  |  | 	H[-1] = TermNil; | 
					
						
							|  |  |  | 	return Yap_unify(ARG2,AbsAppl(h0)); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return Yap_unify(ARG2,TermNil); | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2009-05-22 21:51:48 -05:00
										 |  |  |     Yap_Error(REPRESENTATION_ERROR_VARIABLE,inp,"first argument of get_all_swi_atts/2"); | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |     return FALSE; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-10 14:06:07 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | static Term | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | AllAttVars( USES_REGS1 ) { | 
					
						
							| 
									
										
										
										
											2010-03-10 14:06:07 +00:00
										 |  |  |   CELL *pt = H0; | 
					
						
							|  |  |  |   CELL *myH = H; | 
					
						
							|  |  |  |    | 
					
						
							| 
									
										
										
										
											2011-09-20 09:53:06 +01:00
										 |  |  |   while (pt < myH) { | 
					
						
							| 
									
										
										
										
											2010-03-10 14:06:07 +00:00
										 |  |  |     switch(*pt) { | 
					
						
							|  |  |  |     case (CELL)FunctorAttVar: | 
					
						
							|  |  |  |       if (IsUnboundVar(pt+1)) { | 
					
						
							|  |  |  | 	if (ASP - myH < 1024) { | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  | 	  LOCAL_Error_Size = (ASP-H)*sizeof(CELL); | 
					
						
							| 
									
										
										
										
											2010-03-10 14:06:07 +00:00
										 |  |  | 	  return 0L; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if (myH != H) { | 
					
						
							|  |  |  | 	  myH[-1] = AbsPair(myH); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	myH[0] = AbsAttVar((attvar_record *)pt); | 
					
						
							|  |  |  | 	myH += 2; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       pt += (1+ATT_RECORD_ARITY); | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     case (CELL)FunctorDouble: | 
					
						
							|  |  |  | #if SIZEOF_DOUBLE == 2*SIZEOF_LONG_INT
 | 
					
						
							|  |  |  |       pt += 4; | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |       pt += 3; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     case (CELL)FunctorBigInt: | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  | 	Int sz = 3 + | 
					
						
							|  |  |  | 	  (sizeof(MP_INT)+ | 
					
						
							|  |  |  | 	   (((MP_INT *)(pt+2))->_mp_alloc*sizeof(mp_limb_t)))/sizeof(CELL); | 
					
						
							|  |  |  | 	pt += sz; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     case (CELL)FunctorLongInt: | 
					
						
							|  |  |  |       pt += 3; | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     default: | 
					
						
							|  |  |  |       pt++; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (myH != H) { | 
					
						
							|  |  |  |     Term out = AbsPair(H); | 
					
						
							|  |  |  |     myH[-1] = TermNil; | 
					
						
							|  |  |  |     H = myH; | 
					
						
							|  |  |  |     return out; | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     return TermNil; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  |    | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | static Int | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | p_all_attvars( USES_REGS1 ) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-03-10 14:06:07 +00:00
										 |  |  |   do { | 
					
						
							|  |  |  |     Term out; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |     if (!(out = AllAttVars( PASS_REGS1 ))) { | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |       if (!Yap_gcl(LOCAL_Error_Size, 1, ENV, gc_P(P,CP))) { | 
					
						
							|  |  |  | 	Yap_Error(OUT_OF_STACK_ERROR, TermNil, LOCAL_ErrorMessage); | 
					
						
							| 
									
										
										
										
											2010-03-10 14:06:07 +00:00
										 |  |  | 	return FALSE; | 
					
						
							|  |  |  |       }     | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       return Yap_unify(ARG1,out); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } while (TRUE); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static Int | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | p_is_attvar( USES_REGS1 ) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   Term t = Deref(ARG1); | 
					
						
							|  |  |  |   return(IsVarTerm(t) && | 
					
						
							| 
									
										
										
										
											2010-03-08 09:18:52 +00:00
										 |  |  | 	 IsAttVar(VarOfTerm(t))); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-07-17 20:25:30 +00:00
										 |  |  | /* check if we are not redoing effort */ | 
					
						
							|  |  |  | static Int | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | p_attvar_bound( USES_REGS1 ) | 
					
						
							| 
									
										
										
										
											2002-07-17 20:25:30 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   Term t = Deref(ARG1); | 
					
						
							| 
									
										
										
										
											2010-03-08 09:18:52 +00:00
										 |  |  |   return | 
					
						
							|  |  |  |     IsVarTerm(t) && | 
					
						
							|  |  |  |     IsAttachedTerm(t) && | 
					
						
							|  |  |  |     !IsUnboundVar(&(RepAttVar(VarOfTerm(t))->Done)); | 
					
						
							| 
									
										
										
										
											2002-07-17 20:25:30 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-01-17 14:10:42 +00:00
										 |  |  | static Int | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | p_void_term( USES_REGS1 ) | 
					
						
							| 
									
										
										
										
											2006-01-17 14:10:42 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   return Yap_unify(ARG1,TermVoidAtt); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static Int | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | p_free_term( USES_REGS1 ) | 
					
						
							| 
									
										
										
										
											2006-01-17 14:10:42 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   return Yap_unify(ARG1,TermFreeTerm); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-14 14:50:54 +00:00
										 |  |  | static Int | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | p_fast_unify( USES_REGS1 ) | 
					
						
							| 
									
										
										
										
											2008-11-14 14:50:54 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   /*
 | 
					
						
							|  |  |  |     Case we want to unify two variables, but we do not | 
					
						
							|  |  |  |     think there is a point in waking them up | 
					
						
							|  |  |  |   */ | 
					
						
							|  |  |  |   Term t1, t2; | 
					
						
							|  |  |  |   CELL *a, *b; | 
					
						
							|  |  |  |   if (!IsVarTerm(t1 = Deref(ARG1))) | 
					
						
							|  |  |  |     return FALSE; | 
					
						
							|  |  |  |   if (!IsVarTerm(t2 = Deref(ARG2))) | 
					
						
							|  |  |  |     return FALSE; | 
					
						
							|  |  |  |   a = VarOfTerm(t1); | 
					
						
							|  |  |  |   b = VarOfTerm(t2); | 
					
						
							|  |  |  |   if(a > b) {						  | 
					
						
							| 
									
										
										
										
											2011-03-18 19:34:58 +00:00
										 |  |  |     Bind_Global_NonAtt(a,t2);				  | 
					
						
							| 
									
										
										
										
											2008-11-14 14:50:54 +00:00
										 |  |  |   } else if((a) < (b)){						  | 
					
						
							| 
									
										
										
										
											2011-03-18 19:34:58 +00:00
										 |  |  |     Bind_Global_NonAtt(b,t1);				  | 
					
						
							| 
									
										
										
										
											2008-11-14 14:50:54 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   return TRUE; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-06-23 17:24:20 +00:00
										 |  |  | #else
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static Int | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | p_all_attvars( USES_REGS1 ) | 
					
						
							| 
									
										
										
										
											2004-06-23 17:24:20 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   return FALSE; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static Int | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | p_is_attvar( USES_REGS1 ) | 
					
						
							| 
									
										
										
										
											2004-06-23 17:24:20 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   return FALSE; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static Int | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | p_attvar_bound( USES_REGS1 ) | 
					
						
							| 
									
										
										
										
											2004-06-23 17:24:20 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   return FALSE; | 
					
						
							| 
									
										
										
										
											2004-06-23 17:24:20 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif /* COROUTINING */
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  | void Yap_InitAttVarPreds(void) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2004-05-13 20:54:58 +00:00
										 |  |  |   Term OldCurrentModule = CurrentModule; | 
					
						
							| 
									
										
										
										
											2004-06-23 17:24:20 +00:00
										 |  |  |   CurrentModule = ATTRIBUTES_MODULE; | 
					
						
							|  |  |  | #ifdef COROUTINING
 | 
					
						
							| 
									
										
										
										
											2011-05-25 16:40:36 +01:00
										 |  |  |   GLOBAL_attas[attvars_ext].bind_op = WakeAttVar; | 
					
						
							|  |  |  |   GLOBAL_attas[attvars_ext].copy_term_op = CopyAttVar; | 
					
						
							|  |  |  |   GLOBAL_attas[attvars_ext].to_term_op = AttVarToTerm; | 
					
						
							|  |  |  |   GLOBAL_attas[attvars_ext].term_to_op = TermToAttVar; | 
					
						
							|  |  |  |   GLOBAL_attas[attvars_ext].mark_op = mark_attvar; | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |   Yap_InitCPred("get_att", 4, p_get_att, SafePredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("get_module_atts", 2, p_get_atts, SafePredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("has_module_atts", 2, p_has_atts, SafePredFlag); | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   Yap_InitCPred("get_all_atts", 2, p_get_all_atts, SafePredFlag); | 
					
						
							| 
									
										
										
										
											2005-10-18 17:04:43 +00:00
										 |  |  |   Yap_InitCPred("get_all_swi_atts", 2, p_swi_all_atts, SafePredFlag); | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |   Yap_InitCPred("free_att", 3, p_free_att, SafePredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("put_att", 5, p_put_att, 0); | 
					
						
							| 
									
										
										
										
											2009-02-10 14:56:43 +00:00
										 |  |  |   Yap_InitCPred("put_att_term", 2, p_put_att_term, 0); | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |   Yap_InitCPred("put_module_atts", 2, p_put_atts, 0); | 
					
						
							| 
									
										
										
										
											2005-10-18 17:04:43 +00:00
										 |  |  |   Yap_InitCPred("del_all_module_atts", 2, p_del_atts, 0); | 
					
						
							| 
									
										
										
										
											2010-03-03 19:08:17 +00:00
										 |  |  |   Yap_InitCPred("del_all_atts", 1, p_del_all_atts, 0); | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |   Yap_InitCPred("rm_att", 4, p_rm_att, 0); | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   Yap_InitCPred("bind_attvar", 1, p_bind_attvar, SafePredFlag); | 
					
						
							| 
									
										
										
										
											2009-09-09 17:59:25 -05:00
										 |  |  |   Yap_InitCPred("unbind_attvar", 1, p_unbind_attvar, SafePredFlag); | 
					
						
							| 
									
										
										
										
											2006-01-17 14:10:42 +00:00
										 |  |  |   Yap_InitCPred("modules_with_attributes", 2, p_modules_with_atts, SafePredFlag); | 
					
						
							| 
									
										
										
										
											2005-09-09 17:24:39 +00:00
										 |  |  |   Yap_InitCPred("void_term", 1, p_void_term, SafePredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("free_term", 1, p_free_term, SafePredFlag); | 
					
						
							| 
									
										
										
										
											2008-11-14 14:50:54 +00:00
										 |  |  |   Yap_InitCPred("fast_unify_attributed", 2, p_fast_unify, 0); | 
					
						
							| 
									
										
										
										
											2004-06-23 17:24:20 +00:00
										 |  |  | #endif /* COROUTINING */
 | 
					
						
							| 
									
										
										
										
											2005-08-23 21:27:39 +00:00
										 |  |  |   Yap_InitCPred("all_attvars", 1, p_all_attvars, 0); | 
					
						
							| 
									
										
										
										
											2004-05-13 20:54:58 +00:00
										 |  |  |   CurrentModule = OldCurrentModule; | 
					
						
							| 
									
										
										
										
											2004-09-10 20:18:01 +00:00
										 |  |  |   Yap_InitCPred("attvar", 1, p_is_attvar, SafePredFlag|TestPredFlag); | 
					
						
							| 
									
										
										
										
											2004-11-18 22:32:40 +00:00
										 |  |  |   Yap_InitCPred("$att_bound", 1, p_attvar_bound, SafePredFlag|TestPredFlag|HiddenPredFlag); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 |