| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | /* yap2swi.c  */ | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Project: jpl for Yap Prolog | 
					
						
							|  |  |  |  * Author: Steve Moyle and Vitor Santos Costa | 
					
						
							|  |  |  |  * Email:  steve.moyle@comlab.ox.ac.uk | 
					
						
							|  |  |  |  * Date:   21 January 2002 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  * Copyright (c) 2002 Steve Moyle.  All rights reserved. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-27 11:49:42 +01:00
										 |  |  | #define PL_KERNEL 1
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | //=== includes ===============================================================
 | 
					
						
							|  |  |  | #include	<stdlib.h>
 | 
					
						
							|  |  |  | #include	<string.h>
 | 
					
						
							|  |  |  | #include	<stdio.h>
 | 
					
						
							| 
									
										
										
										
											2008-08-01 21:44:25 +00:00
										 |  |  | #include	<wchar.h>
 | 
					
						
							|  |  |  | #include	<assert.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  | #include	<Yap.h>
 | 
					
						
							|  |  |  | #include	<Yatom.h>
 | 
					
						
							| 
									
										
										
										
											2010-05-03 14:26:56 +01:00
										 |  |  | #include	<YapHeap.h>
 | 
					
						
							| 
									
										
										
										
											2009-06-01 18:01:30 -05:00
										 |  |  | #include	<eval.h>
 | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #if HAVE_MATH_H
 | 
					
						
							|  |  |  | #include	<math.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2009-05-30 12:52:23 -05:00
										 |  |  | #if HAVE_ERRNO_H
 | 
					
						
							|  |  |  | #include	<errno.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-21 08:29:28 -05:00
										 |  |  | #define PL_KERNEL 1
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-24 16:02:04 +00:00
										 |  |  | #include	<SWI-Stream.h>
 | 
					
						
							| 
									
										
										
										
											2008-08-01 21:44:25 +00:00
										 |  |  | #include	<SWI-Prolog.h>
 | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-29 23:04:04 +01:00
										 |  |  | #include	<yapio.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-12 21:50:58 +00:00
										 |  |  | #ifdef USE_GMP
 | 
					
						
							|  |  |  | #include <gmp.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-22 01:59:48 +00:00
										 |  |  | #ifdef __WIN32__
 | 
					
						
							|  |  |  | /* Windows */ | 
					
						
							|  |  |  | #include <fcntl.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-29 23:17:06 +00:00
										 |  |  | #include "swi.h"
 | 
					
						
							| 
									
										
										
										
											2008-12-22 12:03:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-10 21:14:38 +00:00
										 |  |  | extern X_API Atom YAP_AtomFromSWIAtom(atom_t at); | 
					
						
							| 
									
										
										
										
											2011-03-02 23:19:39 +00:00
										 |  |  | extern X_API atom_t YAP_SWIAtomFromAtom(Atom at); | 
					
						
							| 
									
										
										
										
											2011-02-11 19:01:18 +00:00
										 |  |  | extern int	PL_error(const char *pred, int arity, const char *msg, int id, ...); | 
					
						
							| 
									
										
										
										
											2011-02-10 21:14:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | X_API extern Atom | 
					
						
							|  |  |  | YAP_AtomFromSWIAtom(atom_t at) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   return SWIAtomToAtom(at); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-02 23:19:39 +00:00
										 |  |  | X_API extern atom_t | 
					
						
							|  |  |  | YAP_SWIAtomFromAtom(Atom at) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   return AtomToSWIAtom(at); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-28 17:13:10 +01:00
										 |  |  | extern X_API Int YAP_PLArityOfSWIFunctor(functor_t at); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-02 19:41:48 +00:00
										 |  |  | /* This is silly, but let's keep it like that for now */ | 
					
						
							| 
									
										
										
										
											2010-07-28 17:13:10 +01:00
										 |  |  | X_API Int | 
					
						
							| 
									
										
										
										
											2010-12-02 12:10:03 +00:00
										 |  |  | YAP_PLArityOfSWIFunctor(functor_t f) { | 
					
						
							| 
									
										
										
										
											2010-12-02 19:38:15 +00:00
										 |  |  |   if ((CELL)(f) & 2 && ((CELL)f) < N_SWI_FUNCTORS*4+2) | 
					
						
							|  |  |  |     return ArityOfFunctor(SWI_Functors[(CELL)f/4]); | 
					
						
							| 
									
										
										
										
											2010-12-02 12:10:03 +00:00
										 |  |  |   if (IsAtomTerm(f)) | 
					
						
							| 
									
										
										
										
											2010-07-28 17:13:10 +01:00
										 |  |  |     return 0; | 
					
						
							| 
									
										
										
										
											2010-12-02 12:10:03 +00:00
										 |  |  |   return ArityOfFunctor((Functor)f); | 
					
						
							| 
									
										
										
										
											2010-07-28 17:13:10 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-03 14:26:56 +01:00
										 |  |  | void | 
					
						
							|  |  |  | Yap_InitSWIHash(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   int i, j; | 
					
						
							| 
									
										
										
										
											2010-05-06 09:08:59 +01:00
										 |  |  |   memset(SWI_ReverseHash, 0, N_SWI_HASH*sizeof(swi_rev_hash)); | 
					
						
							| 
									
										
										
										
											2010-05-03 14:26:56 +01:00
										 |  |  |   for (i=0; i < N_SWI_ATOMS; i++) { | 
					
						
							| 
									
										
										
										
											2010-12-02 12:10:03 +00:00
										 |  |  |     add_to_hash(i, (ADDR)SWI_Atoms[i]); | 
					
						
							| 
									
										
										
										
											2010-05-03 14:26:56 +01:00
										 |  |  |   } | 
					
						
							|  |  |  |   for (j=0; j < N_SWI_FUNCTORS; j++) { | 
					
						
							| 
									
										
										
										
											2010-12-02 12:10:03 +00:00
										 |  |  |     add_to_hash(j, (ADDR)SWI_Functors[j]); | 
					
						
							| 
									
										
										
										
											2010-05-03 14:26:56 +01:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  | static void | 
					
						
							|  |  |  | PredicateInfo(void *p, Atom* a, unsigned long int* arity, Term* m) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   PredEntry *pd = (PredEntry *)p; | 
					
						
							|  |  |  |   if (pd->ArityOfPE) { | 
					
						
							|  |  |  |     *arity = pd->ArityOfPE; | 
					
						
							|  |  |  |     *a = NameOfFunctor(pd->FunctorOfPred); | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     *arity = 0; | 
					
						
							|  |  |  |     *a = (Atom)(pd->FunctorOfPred); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (pd->ModuleOfPred) | 
					
						
							|  |  |  |     *m = pd->ModuleOfPred; | 
					
						
							|  |  |  |   else | 
					
						
							|  |  |  |     *m = TermProlog; | 
					
						
							|  |  |  | }  | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							| 
									
										
										
										
											2009-06-01 21:49:24 -05:00
										 |  |  | UserCPredicate(char *a, CPredicate def, unsigned long int arity, Term mod, int flags) | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2011-11-16 15:20:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  |   Term cm = CurrentModule; | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  |   /* fprintf(stderr,"doing %s:%s/%d\n", RepAtom(AtomOfTerm(mod))->StrOfAE, a,arity); */ | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  |   CurrentModule = mod; | 
					
						
							| 
									
										
										
										
											2011-03-26 15:17:17 +00:00
										 |  |  |   Yap_InitCPred(a, arity, def, (UserCPredFlag|CArgsPredFlag|flags)); | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  |   CurrentModule = cm; | 
					
						
							|  |  |  | }  | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-12-05 12:17:25 +00:00
										 |  |  | /* SWI: void PL_agc_hook(void) */ | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | X_API PL_agc_hook_t | 
					
						
							|  |  |  | PL_agc_hook(PL_agc_hook_t entry) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2008-02-12 17:03:59 +00:00
										 |  |  |   return (PL_agc_hook_t)YAP_AGCRegisterHook((YAP_agc_hook)entry); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* SWI: char* PL_atom_chars(atom_t atom)
 | 
					
						
							|  |  |  |    YAP: char* AtomName(Atom) */ | 
					
						
							|  |  |  | X_API char* PL_atom_chars(atom_t a)	 /* SAM check type */ | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-01-26 12:21:06 +00:00
										 |  |  |   return RepAtom(SWIAtomToAtom(a))->StrOfAE; | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-18 09:14:45 +01:00
										 |  |  | /* SWI: char* PL_atom_chars(atom_t atom)
 | 
					
						
							|  |  |  |    YAP: char* AtomName(Atom) */ | 
					
						
							|  |  |  | X_API char* PL_atom_nchars(atom_t a, size_t *len)	 /* SAM check type */ | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   char *s = RepAtom(SWIAtomToAtom(a))->StrOfAE; | 
					
						
							|  |  |  |   *len = strlen(s); | 
					
						
							|  |  |  |   return s; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | /* SWI: term_t PL_copy_term_ref(term_t from)
 | 
					
						
							|  |  |  |    YAP: NO EQUIVALENT */ | 
					
						
							|  |  |  | /* SAM TO DO */ | 
					
						
							|  |  |  | X_API term_t PL_copy_term_ref(term_t from) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   return YAP_InitSlot(Yap_GetFromSlot(from PASS_REGS)); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API term_t PL_new_term_ref(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |    | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   term_t to = Yap_NewSlots(1 PASS_REGS); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   return to; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API term_t PL_new_term_refs(int n) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   term_t to = Yap_NewSlots(n PASS_REGS); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   return to; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API void PL_reset_term_refs(term_t after) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   term_t new = Yap_NewSlots(1 PASS_REGS); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   YAP_RecoverSlots(after-new); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* begin PL_get_* functions =============================*/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* SWI: int PL_get_arg(int index, term_t t, term_t a)
 | 
					
						
							|  |  |  |    YAP: YAP_Term YAP_ArgOfTerm(int argno, YAP_Term t)*/ | 
					
						
							|  |  |  | X_API int PL_get_arg(int index, term_t ts, term_t a) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   YAP_Term t = Yap_GetFromSlot(ts PASS_REGS); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   if ( !YAP_IsApplTerm(t) ) { | 
					
						
							|  |  |  |     if (YAP_IsPairTerm(t)) { | 
					
						
							|  |  |  |       if (index == 1){ | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | 	Yap_PutInSlot(a,YAP_HeadOfTerm(t) PASS_REGS); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | 	return 1; | 
					
						
							|  |  |  |       } else if (index == 2) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | 	Yap_PutInSlot(a,YAP_TailOfTerm(t) PASS_REGS); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | 	return 1; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   Yap_PutInSlot(a,YAP_ArgOfTerm(index, t) PASS_REGS); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  |     | 
					
						
							| 
									
										
										
										
											2010-05-06 10:57:59 +01:00
										 |  |  | /* SWI: int PL_get_arg(int index, term_t t, term_t a)
 | 
					
						
							|  |  |  |    YAP: YAP_Term YAP_ArgOfTerm(int argno, YAP_Term t)*/ | 
					
						
							|  |  |  | X_API int _PL_get_arg(int index, term_t ts, term_t a) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   YAP_Term t = Yap_GetFromSlot(ts PASS_REGS); | 
					
						
							| 
									
										
										
										
											2010-05-06 10:57:59 +01:00
										 |  |  |   if ( !YAP_IsApplTerm(t) ) { | 
					
						
							|  |  |  |     if (YAP_IsPairTerm(t)) { | 
					
						
							|  |  |  |       if (index == 1){ | 
					
						
							| 
									
										
										
										
											2012-02-12 12:28:37 +00:00
										 |  |  | 	Yap_PutInSlot(a,HeadOfTerm(t) PASS_REGS); | 
					
						
							| 
									
										
										
										
											2010-05-06 10:57:59 +01:00
										 |  |  | 	return 1; | 
					
						
							|  |  |  |       } else if (index == 2) { | 
					
						
							| 
									
										
										
										
											2012-02-12 12:28:37 +00:00
										 |  |  | 	Yap_PutInSlot(a,TailOfTerm(t) PASS_REGS); | 
					
						
							| 
									
										
										
										
											2010-05-06 10:57:59 +01:00
										 |  |  | 	return 1; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2012-02-12 12:28:37 +00:00
										 |  |  |   Yap_PutInSlot(a,ArgOfTerm(index, t) PASS_REGS); | 
					
						
							| 
									
										
										
										
											2010-05-06 10:57:59 +01:00
										 |  |  |   return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  |     | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | /* SWI: int PL_get_atom(term_t t, YAP_Atom *a)
 | 
					
						
							|  |  |  |    YAP: YAP_Atom YAP_AtomOfTerm(Term) */ | 
					
						
							|  |  |  | X_API int PL_get_atom(term_t ts, atom_t *a) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   YAP_Term t = Yap_GetFromSlot(ts PASS_REGS); | 
					
						
							| 
									
										
										
										
											2008-12-19 11:41:56 +00:00
										 |  |  |   if ( !IsAtomTerm(t)) | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |     return 0; | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  |   *a = AtomToSWIAtom(AtomOfTerm(t)); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-15 16:21:43 +00:00
										 |  |  | /* SWI: int PL_get_atom(term_t t, YAP_Atom *a)
 | 
					
						
							|  |  |  |    YAP: YAP_Atom YAP_AtomOfTerm(Term) */ | 
					
						
							|  |  |  | X_API int PL_get_intptr(term_t ts, intptr_t *a) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   Term t = Yap_GetFromSlot(ts PASS_REGS); | 
					
						
							| 
									
										
										
										
											2010-01-15 16:21:43 +00:00
										 |  |  |   if ( !IsIntegerTerm(t) ) | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  |   *a = (intptr_t)(IntegerOfTerm(t)); | 
					
						
							|  |  |  |   return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-10 00:01:19 +00:00
										 |  |  | /* SWI: int PL_get_atom(term_t t, YAP_Atom *a)
 | 
					
						
							|  |  |  |    YAP: YAP_Atom YAP_AtomOfTerm(Term) */ | 
					
						
							|  |  |  | X_API int PL_get_uintptr(term_t ts, uintptr_t *a) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   Term t = Yap_GetFromSlot(ts PASS_REGS); | 
					
						
							| 
									
										
										
										
											2011-02-10 00:01:19 +00:00
										 |  |  |   if ( !IsIntegerTerm(t) ) | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  |   *a = (uintptr_t)(IntegerOfTerm(t)); | 
					
						
							|  |  |  |   return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | /* SWI: int PL_get_atom_chars(term_t t, char **s)
 | 
					
						
							|  |  |  |    YAP: char* AtomName(Atom) */ | 
					
						
							|  |  |  | X_API int PL_get_atom_chars(term_t ts, char **a)  /* SAM check type */ | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   Term t = Yap_GetFromSlot(ts PASS_REGS); | 
					
						
							| 
									
										
										
										
											2008-12-19 11:41:56 +00:00
										 |  |  |   if (!IsAtomTerm(t)) | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |     return 0; | 
					
						
							| 
									
										
										
										
											2008-12-19 11:41:56 +00:00
										 |  |  |   *a = RepAtom(AtomOfTerm(t))->StrOfAE; | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-19 14:40:47 +01:00
										 |  |  | /* SWI: int PL_get_atom_chars(term_t t, char **s)
 | 
					
						
							|  |  |  |    YAP: char* AtomName(Atom) */ | 
					
						
							| 
									
										
										
										
											2010-07-05 16:00:12 +01:00
										 |  |  | X_API int PL_get_atom_nchars(term_t ts, size_t *len, char **s)  /* SAM check type */ | 
					
						
							| 
									
										
										
										
											2010-06-19 14:40:47 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   Term t = Yap_GetFromSlot(ts PASS_REGS); | 
					
						
							| 
									
										
										
										
											2010-06-19 14:40:47 +01:00
										 |  |  |   if (!IsAtomTerm(t)) | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  |   *s = RepAtom(AtomOfTerm(t))->StrOfAE; | 
					
						
							|  |  |  |   *len = strlen(*s); | 
					
						
							|  |  |  |   return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  |   int PL_get_chars(term_t +t, char **s, unsigned flags) Convert the | 
					
						
							|  |  |  |   argument term t to a 0-terminated C-string. flags is a bitwise | 
					
						
							|  |  |  |   disjunction from two groups of constants. The first specifies which | 
					
						
							|  |  |  |   term-types should converted and the second how the argument is | 
					
						
							|  |  |  |   stored. Below is a specification of these constants. BUF_RING | 
					
						
							|  |  |  |   implies, if the data is not static (as from an atom), the data is | 
					
						
							|  |  |  |   copied to the next buffer from a ring of sixteen (16) buffers. This is a | 
					
						
							|  |  |  |   convenient way of converting multiple arguments passed to a foreign | 
					
						
							|  |  |  |   predicate to C-strings. If BUF_MALLOC is used, the data must be | 
					
						
							|  |  |  |   freed using free() when not needed any longer. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     CVT_ATOM Convert if term is an atom | 
					
						
							|  |  |  |     CVT_STRING Convert if term is a string | 
					
						
							|  |  |  |     CVT_LIST Convert if term is a list of integers between 1 and 255 | 
					
						
							|  |  |  |     CVT_INTEGER Convert if term is an integer (using %d) | 
					
						
							|  |  |  |     CVT_FLOAT Convert if term is a float (using %f) | 
					
						
							|  |  |  |     CVT_NUMBER Convert if term is a integer or float | 
					
						
							|  |  |  |     CVT_ATOMIC Convert if term is atomic | 
					
						
							|  |  |  |     CVT_VARIABLE Convert variable to print-name | 
					
						
							|  |  |  |     CVT_ALL Convert if term is any of the above, except for variables | 
					
						
							|  |  |  |     BUF_DISCARDABLE Data must copied immediately | 
					
						
							|  |  |  |     BUF_RING Data is stored in a ring of buffers | 
					
						
							|  |  |  |     BUF_MALLOC Data is copied to a new buffer returned by malloc(3) | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if !HAVE_SNPRINTF
 | 
					
						
							|  |  |  | #define snprintf(X,Y,Z,A) sprintf(X,Z,A)
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* SWI: int PL_get_functor(term_t t, functor_t *f)
 | 
					
						
							|  |  |  |    YAP: YAP_Functor YAP_FunctorOfTerm(Term) */ | 
					
						
							|  |  |  | X_API int PL_get_functor(term_t ts, functor_t *f) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   Term t = Yap_GetFromSlot(ts PASS_REGS); | 
					
						
							| 
									
										
										
										
											2008-12-19 11:41:56 +00:00
										 |  |  |   if ( IsAtomTerm(t)) { | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |     *f = t; | 
					
						
							|  |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2008-12-22 12:03:14 +00:00
										 |  |  |     *f = FunctorToSWIFunctor(FunctorOfTerm(t)); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* SWI: int PL_get_float(term_t t, double *f)
 | 
					
						
							|  |  |  |    YAP: double YAP_FloatOfTerm(Term) */ | 
					
						
							|  |  |  | X_API int PL_get_float(term_t ts, double *f) /* SAM type check*/ | 
					
						
							|  |  |  | {	 | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   YAP_Term t = Yap_GetFromSlot(ts PASS_REGS); | 
					
						
							| 
									
										
										
										
											2010-08-04 02:46:26 +01:00
										 |  |  |   if ( YAP_IsFloatTerm(t)) { | 
					
						
							|  |  |  |     *f = YAP_FloatOfTerm(t); | 
					
						
							|  |  |  |   } else if ( YAP_IsIntTerm(t)) { | 
					
						
							|  |  |  |     *f = YAP_IntOfTerm(t); | 
					
						
							|  |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |     return 0; | 
					
						
							| 
									
										
										
										
											2010-08-04 02:46:26 +01:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API int PL_get_head(term_t ts, term_t h) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   YAP_Term t = Yap_GetFromSlot(ts PASS_REGS); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   if (!YAP_IsPairTerm(t) ) { | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   Yap_PutInSlot(h,YAP_HeadOfTerm(t) PASS_REGS); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-30 17:54:02 +02:00
										 |  |  | X_API int PL_get_string(term_t t, char **s, size_t *len) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   return PL_get_string_chars(t, s, len); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-19 00:38:49 +01:00
										 |  |  | X_API int PL_get_string_chars(term_t t, char **s, size_t *len) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   Term tt = Yap_GetFromSlot(t PASS_REGS); | 
					
						
							| 
									
										
										
										
											2010-06-19 00:38:49 +01:00
										 |  |  |   if (!IsBlobStringTerm(tt)) { | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   *s = Yap_BlobStringOfTermAndLength(tt, len); | 
					
						
							|  |  |  |   return TRUE; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | /* SWI: int PL_get_integer(term_t t, int *i)
 | 
					
						
							|  |  |  |    YAP: long int  YAP_IntOfTerm(Term) */ | 
					
						
							|  |  |  | X_API int PL_get_integer(term_t ts, int *i) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   YAP_Term t = Yap_GetFromSlot(ts PASS_REGS); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   if (!YAP_IsIntTerm(t) ) | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  |   *i = YAP_IntOfTerm(t); | 
					
						
							|  |  |  |   return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-12 17:03:59 +00:00
										 |  |  | /* SWI: int PL_get_bool(term_t t, int *i)
 | 
					
						
							|  |  |  |    YAP: long int  YAP_AtomOfTerm(Term) */ | 
					
						
							|  |  |  | X_API int PL_get_bool(term_t ts, int *i) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   YAP_Term t = Yap_GetFromSlot(ts PASS_REGS); | 
					
						
							| 
									
										
										
										
											2008-12-19 11:41:56 +00:00
										 |  |  |   Atom at; | 
					
						
							| 
									
										
										
										
											2008-02-12 17:03:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-19 11:41:56 +00:00
										 |  |  |   if (!IsAtomTerm(t) ) | 
					
						
							| 
									
										
										
										
											2008-02-12 17:03:59 +00:00
										 |  |  |     return 0; | 
					
						
							| 
									
										
										
										
											2008-12-19 11:41:56 +00:00
										 |  |  |   at = AtomOfTerm(t); | 
					
						
							|  |  |  |   if (at == AtomTrue) { | 
					
						
							|  |  |  |     *i = TRUE; | 
					
						
							| 
									
										
										
										
											2008-02-12 17:03:59 +00:00
										 |  |  |     return 1;     | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2008-12-19 11:41:56 +00:00
										 |  |  |   if (at == AtomFalse) { | 
					
						
							|  |  |  |     *i = FALSE; | 
					
						
							| 
									
										
										
										
											2008-02-12 17:03:59 +00:00
										 |  |  |     return 1;     | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | X_API int PL_get_long(term_t ts, long *i) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   YAP_Term t = Yap_GetFromSlot(ts PASS_REGS); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   if (!YAP_IsIntTerm(t) ) { | 
					
						
							|  |  |  |     if (YAP_IsFloatTerm(t)) { | 
					
						
							|  |  |  |       double dbl = YAP_FloatOfTerm(t); | 
					
						
							|  |  |  |       if (dbl - (long)dbl == 0.0) { | 
					
						
							|  |  |  | 	*i = (long)dbl; | 
					
						
							|  |  |  | 	return 1; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   *i = YAP_IntOfTerm(t); | 
					
						
							|  |  |  |   return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API int PL_get_int64(term_t ts, int64_t *i) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-06-01 15:38:39 -05:00
										 |  |  | #if SIZE_OF_LONG_INT==8
 | 
					
						
							|  |  |  |   return PL_get_long(ts, (long *)i); | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   YAP_Term t = Yap_GetFromSlot(ts PASS_REGS); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   if (!YAP_IsIntTerm(t) ) { | 
					
						
							|  |  |  |     if (YAP_IsFloatTerm(t)) { | 
					
						
							|  |  |  |       double dbl = YAP_FloatOfTerm(t); | 
					
						
							|  |  |  |       if (dbl - (int64_t)dbl == 0.0) { | 
					
						
							|  |  |  | 	*i = (int64_t)dbl; | 
					
						
							|  |  |  | 	return 1; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | #if USE_GMP
 | 
					
						
							|  |  |  |     } else if (YAP_IsBigNumTerm(t)) { | 
					
						
							|  |  |  |       MP_INT g; | 
					
						
							|  |  |  |       char s[64]; | 
					
						
							|  |  |  |       YAP_BigNumOfTerm(t, (void *)&g); | 
					
						
							|  |  |  |       if (mpz_sizeinbase(&g,2) > 64) { | 
					
						
							|  |  |  | 	return 0; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       mpz_get_str (s, 10, &g); | 
					
						
							| 
									
										
										
										
											2010-02-10 03:03:03 -06:00
										 |  |  | #ifdef _WIN32
 | 
					
						
							|  |  |  |       sscanf(s, "%I64d", (long long int *)i); | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |       sscanf(s, "%lld", (long long int *)i); | 
					
						
							| 
									
										
										
										
											2010-02-10 03:03:03 -06:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |       return 1; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   *i = YAP_IntOfTerm(t); | 
					
						
							|  |  |  |   return 1; | 
					
						
							| 
									
										
										
										
											2009-06-01 15:38:39 -05:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-01-09 23:29:31 +00:00
										 |  |  | X_API int PL_unify_bool(term_t t, int a) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   Term iterm = (a ? MkAtomTerm(AtomTrue) : MkAtomTerm(AtomFalse) ); | 
					
						
							|  |  |  |   return Yap_unify(Yap_GetFromSlot(t PASS_REGS),iterm); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-18 23:24:36 +01:00
										 |  |  | #if USE_GMP
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		 /*******************************
 | 
					
						
							|  |  |  | 		 *	       GMP		* | 
					
						
							|  |  |  | 		 *******************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API int PL_get_mpz(term_t t, mpz_t mpz) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   Term t0 = Yap_GetFromSlot(t PASS_REGS); | 
					
						
							| 
									
										
										
										
											2010-06-18 23:24:36 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |   return Yap_term_to_existing_big(t0, mpz); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API int PL_unify_mpz(term_t t, mpz_t mpz) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2010-06-18 23:24:36 +01:00
										 |  |  |   Term iterm = Yap_MkBigIntTerm(mpz); | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   return Yap_unify(Yap_GetFromSlot(t PASS_REGS),iterm); | 
					
						
							| 
									
										
										
										
											2010-06-18 23:24:36 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API int PL_get_mpq(term_t t, mpq_t mpz) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   Term t0 = Yap_GetFromSlot(t PASS_REGS); | 
					
						
							| 
									
										
										
										
											2010-06-18 23:24:36 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |   return Yap_term_to_existing_rat(t0, mpz); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API int PL_unify_mpq(term_t t, mpq_t mpq) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2010-06-18 23:24:36 +01:00
										 |  |  |   Term iterm = Yap_MkBigRatTerm(mpq); | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   return Yap_unify(Yap_GetFromSlot(t PASS_REGS),iterm); | 
					
						
							| 
									
										
										
										
											2010-06-18 23:24:36 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | X_API int PL_get_list(term_t ts, term_t h, term_t tl) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   YAP_Term t = Yap_GetFromSlot(ts PASS_REGS); | 
					
						
							| 
									
										
										
										
											2010-05-03 17:02:49 +01:00
										 |  |  |   if (IsVarTerm(t) || !IsPairTerm(t) ) { | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |     return 0; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   Yap_PutInSlot(h,HeadOfTerm(t) PASS_REGS); | 
					
						
							|  |  |  |   Yap_PutInSlot(tl,TailOfTerm(t) PASS_REGS); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* SWI: int PL_get_module(term_t t, module_t *m) */ | 
					
						
							|  |  |  | X_API int PL_get_module(term_t ts, module_t *m) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   YAP_Term t = Yap_GetFromSlot(ts PASS_REGS); | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  |   if (!IsAtomTerm(t) ) | 
					
						
							|  |  |  |     return FALSE; | 
					
						
							|  |  |  |   *m = (module_t)t; | 
					
						
							|  |  |  |   return TRUE; | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* SWI: int PL_new_module(term_t t, module_t *m) */ | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  | X_API module_t PL_new_module(atom_t swiat) | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  |   Atom at = SWIAtomToAtom(swiat); | 
					
						
							|  |  |  |   Term t; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   WRITE_LOCK(RepAtom(at)->ARWLock);   | 
					
						
							|  |  |  |   t = Yap_Module(MkAtomTerm(at)); | 
					
						
							|  |  |  |   WRITE_UNLOCK(RepAtom(at)->ARWLock);     | 
					
						
							|  |  |  |   return (module_t)t; | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* SWI: int PL_get_atom(term_t t, YAP_Atom *a)
 | 
					
						
							|  |  |  |    YAP: YAP_Atom YAP_AtomOfTerm(Term) */ | 
					
						
							|  |  |  | X_API int PL_get_name_arity(term_t ts, atom_t *name, int *arity) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   YAP_Term t = Yap_GetFromSlot(ts PASS_REGS); | 
					
						
							| 
									
										
										
										
											2008-12-19 11:41:56 +00:00
										 |  |  |   if (IsAtomTerm(t)) { | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  |     *name = AtomToSWIAtom(AtomOfTerm(t)); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |     *arity = 0; | 
					
						
							|  |  |  |     return 1; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (YAP_IsApplTerm(t)) { | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  |     Functor f = FunctorOfTerm(t); | 
					
						
							| 
									
										
										
										
											2011-02-27 03:40:27 -08:00
										 |  |  |     if (IsExtensionFunctor(f)) { | 
					
						
							|  |  |  |       return 0; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  |     *name = AtomToSWIAtom(NameOfFunctor(f)); | 
					
						
							|  |  |  |     *arity = ArityOfFunctor(f); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |     return 1; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (YAP_IsPairTerm(t)) { | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  |     *name = AtomToSWIAtom(AtomDot); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |     *arity = 2; | 
					
						
							|  |  |  |     return 1; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* SWI: int PL_get_atom(term_t t, YAP_Atom *a)
 | 
					
						
							|  |  |  |    YAP: YAP_Atom YAP_AtomOfTerm(Term) */ | 
					
						
							|  |  |  | X_API int PL_get_nil(term_t ts) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   Term t = Yap_GetFromSlot(ts PASS_REGS); | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  |   return ( t == TermNil ); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* SWI: int PL_get_pointer(term_t t, int *i)
 | 
					
						
							|  |  |  |    YAP: NO EQUIVALENT */ | 
					
						
							|  |  |  | /* SAM TO DO */ | 
					
						
							|  |  |  | X_API int PL_get_pointer(term_t ts, void **i) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   YAP_Term t = Yap_GetFromSlot(ts PASS_REGS); | 
					
						
							| 
									
										
										
										
											2012-02-12 12:28:37 +00:00
										 |  |  |   if (IsVarTerm(t) || !IsIntegerTerm(t) ) | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |     return 0; | 
					
						
							| 
									
										
										
										
											2012-02-12 12:28:37 +00:00
										 |  |  |   *i = (void *)IntegerOfTerm(t); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API int PL_get_tail(term_t ts, term_t tl) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   YAP_Term t = Yap_GetFromSlot(ts PASS_REGS); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   if (!YAP_IsPairTerm(t) ) { | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   Yap_PutInSlot(tl,YAP_TailOfTerm(t) PASS_REGS); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* end PL_get_* functions  =============================*/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* begin PL_new_* functions =============================*/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* SWI: atom_t PL_new_atom(const char *)
 | 
					
						
							|  |  |  |    YAP: YAP_Atom LookupAtom(char *) */ | 
					
						
							|  |  |  | /*  SAM should the following be used instead?
 | 
					
						
							|  |  |  |       YAP_Atom  FullLookupAtom(char *) | 
					
						
							|  |  |  |       */ | 
					
						
							|  |  |  | X_API atom_t PL_new_atom(const char *c) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  |   Atom at; | 
					
						
							|  |  |  |   while ((at = Yap_LookupAtom((char *)c)) == NULL) { | 
					
						
							|  |  |  |     if (!Yap_growheap(FALSE, 0L, NULL)) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       CACHE_REGS | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |       Yap_Error(OUT_OF_HEAP_ERROR, TermNil, LOCAL_ErrorMessage); | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  |       return 0L; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2009-12-21 10:12:47 -02:00
										 |  |  |   Yap_AtomIncreaseHold(at); | 
					
						
							|  |  |  |   return AtomToSWIAtom(at); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-17 00:34:29 +01:00
										 |  |  | X_API atom_t PL_new_atom_nchars(size_t len, const char *c) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   Atom at; | 
					
						
							|  |  |  |   char *pt; | 
					
						
							|  |  |  |   if (strlen(c) > len) { | 
					
						
							|  |  |  |     while ((pt = (char *)Yap_AllocCodeSpace(len+1)) == NULL) { | 
					
						
							|  |  |  |       if (!Yap_growheap(FALSE, 0L, NULL)) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | 	CACHE_REGS | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  | 	Yap_Error(OUT_OF_HEAP_ERROR, TermNil, LOCAL_ErrorMessage); | 
					
						
							| 
									
										
										
										
											2010-06-17 00:34:29 +01:00
										 |  |  | 	return 0L; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-12-19 20:45:01 +01:00
										 |  |  |     memcpy(pt, c, len); | 
					
						
							| 
									
										
										
										
											2010-08-04 02:46:26 +01:00
										 |  |  |     pt[len] = '\0'; | 
					
						
							| 
									
										
										
										
											2010-06-17 00:34:29 +01:00
										 |  |  |   } else { | 
					
						
							|  |  |  |     pt = (char *)c; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   while ((at = Yap_LookupAtom(pt)) == NULL) { | 
					
						
							|  |  |  |     if (!Yap_growheap(FALSE, 0L, NULL)) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       CACHE_REGS | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |       Yap_Error(OUT_OF_HEAP_ERROR, TermNil, LOCAL_ErrorMessage); | 
					
						
							| 
									
										
										
										
											2010-06-17 00:34:29 +01:00
										 |  |  |       return 0L; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   Yap_AtomIncreaseHold(at); | 
					
						
							|  |  |  |   return AtomToSWIAtom(at); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API atom_t PL_new_atom_wchars(size_t len, const wchar_t *c) | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2007-09-27 15:25:34 +00:00
										 |  |  |   atom_t at; | 
					
						
							|  |  |  |   int i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   for (i=0;i<len;i++) { | 
					
						
							|  |  |  |     if (c[i] > 255) break; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (i!=len) { | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  |     Atom at0; | 
					
						
							|  |  |  |     wchar_t *nbf; | 
					
						
							|  |  |  |     while (!(nbf = (wchar_t *)YAP_AllocSpaceFromYap((len+1)*sizeof(wchar_t)))) { | 
					
						
							|  |  |  |       if (!Yap_growheap(FALSE, 0L, NULL)) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | 	CACHE_REGS | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  | 	Yap_Error(OUT_OF_HEAP_ERROR, TermNil, LOCAL_ErrorMessage); | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  | 	return 0; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2007-09-27 15:25:34 +00:00
										 |  |  |     for (i=0;i<len;i++) | 
					
						
							|  |  |  |       nbf[i] = c[i]; | 
					
						
							|  |  |  |     nbf[len]='\0'; | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  |     while ((at0 = Yap_LookupWideAtom(nbf)) == NULL) { | 
					
						
							|  |  |  |       if (!Yap_growheap(FALSE, 0L, NULL)) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | 	CACHE_REGS | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  | 	Yap_Error(OUT_OF_HEAP_ERROR, TermNil, LOCAL_ErrorMessage); | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  | 	return 0L; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     at = AtomToSWIAtom(at0); | 
					
						
							| 
									
										
										
										
											2012-01-17 12:37:29 +00:00
										 |  |  |     Yap_AtomIncreaseHold(at0); | 
					
						
							| 
									
										
										
										
											2007-09-27 15:25:34 +00:00
										 |  |  |     YAP_FreeSpaceFromYap(nbf); | 
					
						
							|  |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  |     char *nbf; | 
					
						
							|  |  |  |     Atom at0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     while (!(nbf = (char *)YAP_AllocSpaceFromYap((len+1)*sizeof(char)))) { | 
					
						
							|  |  |  |       if (!Yap_growheap(FALSE, 0L, NULL)) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | 	CACHE_REGS | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  | 	Yap_Error(OUT_OF_HEAP_ERROR, TermNil, LOCAL_ErrorMessage); | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  | 	return 0; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2007-09-27 15:25:34 +00:00
										 |  |  |     for (i=0;i<len;i++) | 
					
						
							|  |  |  |       nbf[i] = c[i]; | 
					
						
							|  |  |  |     nbf[len]='\0'; | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  |     while (!(at0 = Yap_LookupAtom(nbf))) { | 
					
						
							|  |  |  |       if (!Yap_growheap(FALSE, 0L, NULL)) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | 	CACHE_REGS | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  | 	Yap_Error(OUT_OF_HEAP_ERROR, TermNil, LOCAL_ErrorMessage); | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  | 	return 0; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     at = AtomToSWIAtom(at0); | 
					
						
							| 
									
										
										
										
											2012-01-17 12:37:29 +00:00
										 |  |  |     Yap_AtomIncreaseHold(at0); | 
					
						
							| 
									
										
										
										
											2007-09-27 15:25:34 +00:00
										 |  |  |     YAP_FreeSpaceFromYap(nbf); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return at; | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API wchar_t *PL_atom_wchars(atom_t name, size_t *sp) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  |   Atom at = SWIAtomToAtom(name); | 
					
						
							|  |  |  |   if (!IsWideAtom(at)) | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |     return NULL; | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  |   *sp = wcslen(RepAtom(at)->WStrOfAE); | 
					
						
							|  |  |  |   return RepAtom(at)->WStrOfAE; | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API functor_t PL_new_functor(atom_t name, int arity) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   functor_t f; | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  |   Atom at = SWIAtomToAtom(name); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   if (arity == 0) { | 
					
						
							| 
									
										
										
										
											2008-12-22 12:03:14 +00:00
										 |  |  |     f = FunctorToSWIFunctor((Functor)MkAtomTerm(at)); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2008-12-22 12:03:14 +00:00
										 |  |  |     f = FunctorToSWIFunctor(Yap_MkFunctor(at,arity)); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   return f; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API atom_t PL_functor_name(functor_t f) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  |   if (IsAtomTerm(f)) { | 
					
						
							| 
									
										
										
										
											2008-12-22 12:03:14 +00:00
										 |  |  |     return AtomToSWIAtom(AtomOfTerm((Term)SWIFunctorToFunctor(f))); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2008-12-22 12:03:14 +00:00
										 |  |  |     return AtomToSWIAtom(NameOfFunctor(SWIFunctorToFunctor(f))); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API int PL_functor_arity(functor_t f) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2008-12-19 11:41:56 +00:00
										 |  |  |   if (IsAtomTerm(f)) { | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |     return 0; | 
					
						
							|  |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2008-12-22 12:03:14 +00:00
										 |  |  |     return ArityOfFunctor(SWIFunctorToFunctor(f)); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* end PL_new_* functions =============================*/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* begin PL_put_* functions =============================*/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-15 00:49:05 +00:00
										 |  |  | X_API int PL_cons_functor(term_t d, functor_t f,...) | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   va_list ap; | 
					
						
							|  |  |  |   int arity, i; | 
					
						
							| 
									
										
										
										
											2010-11-28 11:50:41 +00:00
										 |  |  |   Term *tmp, t; | 
					
						
							| 
									
										
										
										
											2008-12-22 12:03:14 +00:00
										 |  |  |   Functor ff = SWIFunctorToFunctor(f); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-22 12:03:14 +00:00
										 |  |  |   if (IsAtomTerm((Term)ff)) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |     Yap_PutInSlot(d, (YAP_Term)f PASS_REGS); | 
					
						
							| 
									
										
										
										
											2010-01-15 00:49:05 +00:00
										 |  |  |     return TRUE; | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2008-12-22 12:03:14 +00:00
										 |  |  |   arity = ArityOfFunctor(ff); | 
					
						
							| 
									
										
										
										
											2010-11-28 11:50:41 +00:00
										 |  |  |   while (Unsigned(H+arity) > Unsigned(ASP)-CreepFlag) { | 
					
						
							|  |  |  |     if (!Yap_gc(0, ENV, CP)) { | 
					
						
							|  |  |  |       return FALSE; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (arity == 2 && ff == FunctorDot) { | 
					
						
							|  |  |  |     t = Yap_MkNewPairTerm(); | 
					
						
							|  |  |  |     tmp = RepPair(t); | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     t = Yap_MkNewApplTerm(ff, arity); | 
					
						
							|  |  |  |     tmp = RepAppl(t)+1; | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   va_start (ap, f); | 
					
						
							|  |  |  |   for (i = 0; i < arity; i++) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |     Yap_unify(tmp[i],Yap_GetFromSlot(va_arg(ap, term_t) PASS_REGS)); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   va_end (ap); | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   Yap_PutInSlot(d,t PASS_REGS); | 
					
						
							| 
									
										
										
										
											2010-01-15 00:49:05 +00:00
										 |  |  |   return TRUE; | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-28 11:50:41 +00:00
										 |  |  | X_API int PL_cons_functor_v(term_t d, functor_t f, term_t a0) | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2010-11-28 11:50:41 +00:00
										 |  |  |   int arity, i; | 
					
						
							|  |  |  |   Term *tmp, t; | 
					
						
							| 
									
										
										
										
											2008-12-22 12:03:14 +00:00
										 |  |  |   Functor ff = SWIFunctorToFunctor(f); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-22 12:03:14 +00:00
										 |  |  |   if (IsAtomTerm((Term)ff)) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |     Yap_PutInSlot(d, (YAP_Term)f PASS_REGS); | 
					
						
							| 
									
										
										
										
											2010-01-15 00:49:05 +00:00
										 |  |  |     return TRUE; | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2008-12-22 12:03:14 +00:00
										 |  |  |   arity = ArityOfFunctor(ff); | 
					
						
							| 
									
										
										
										
											2010-11-28 11:50:41 +00:00
										 |  |  |   while (Unsigned(H+arity) > Unsigned(ASP)-CreepFlag) { | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  |     if (!Yap_gc(0, ENV, CP)) { | 
					
						
							|  |  |  |       return FALSE; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2010-11-28 11:50:41 +00:00
										 |  |  |   if (arity == 2 && ff == FunctorDot) { | 
					
						
							|  |  |  |     t = Yap_MkNewPairTerm(); | 
					
						
							|  |  |  |     tmp = RepPair(t); | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     t = Yap_MkNewApplTerm(ff, arity); | 
					
						
							|  |  |  |     tmp = RepAppl(t)+1; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   for (i = 0; i < arity; i++) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |     Yap_unify(tmp[i],Yap_GetFromSlot(a0 PASS_REGS)); | 
					
						
							| 
									
										
										
										
											2010-11-28 11:50:41 +00:00
										 |  |  |     a0++; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   Yap_PutInSlot(d,t PASS_REGS); | 
					
						
							| 
									
										
										
										
											2010-01-15 00:49:05 +00:00
										 |  |  |   return TRUE; | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-15 00:49:05 +00:00
										 |  |  | X_API int PL_cons_list(term_t d, term_t h, term_t t) | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   Yap_PutInSlot(d,MkPairTerm(Yap_GetFromSlot(h PASS_REGS),Yap_GetFromSlot(t PASS_REGS)) PASS_REGS); | 
					
						
							| 
									
										
										
										
											2010-01-15 00:49:05 +00:00
										 |  |  |   return TRUE; | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-15 00:49:05 +00:00
										 |  |  | X_API int PL_put_atom(term_t t, atom_t a) | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   Yap_PutInSlot(t,MkAtomTerm(SWIAtomToAtom(a)) PASS_REGS); | 
					
						
							| 
									
										
										
										
											2010-01-15 00:49:05 +00:00
										 |  |  |   return TRUE; | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-15 00:49:05 +00:00
										 |  |  | X_API int PL_put_atom_chars(term_t t, const char *s) | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  |   Atom at; | 
					
						
							|  |  |  |   while (!(at = Yap_LookupAtom((char *)s))) { | 
					
						
							|  |  |  |     if (!Yap_growheap(FALSE, 0L, NULL)) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       CACHE_REGS | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |       Yap_Error(OUT_OF_HEAP_ERROR, TermNil, LOCAL_ErrorMessage); | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  |       return FALSE; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2012-01-15 11:21:38 -06:00
										 |  |  |   Yap_AtomIncreaseHold(at); | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   Yap_PutInSlot(t,MkAtomTerm(at) PASS_REGS); | 
					
						
							| 
									
										
										
										
											2010-01-15 00:49:05 +00:00
										 |  |  |   return TRUE; | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-18 23:24:36 +01:00
										 |  |  | X_API int PL_put_atom_nchars(term_t t, size_t len, const char *s) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2010-06-18 23:24:36 +01:00
										 |  |  |   Atom at; | 
					
						
							|  |  |  |   char *buf; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (strlen(s) > len) { | 
					
						
							|  |  |  |     while (!(buf = (char *)Yap_AllocCodeSpace(len+1))) { | 
					
						
							|  |  |  |       if (!Yap_growheap(FALSE, 0L, NULL)) { | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  | 	Yap_Error(OUT_OF_HEAP_ERROR, TermNil, LOCAL_ErrorMessage); | 
					
						
							| 
									
										
										
										
											2010-06-18 23:24:36 +01:00
										 |  |  | 	return FALSE; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-12-19 20:45:01 +01:00
										 |  |  |     memcpy(buf, s, len); | 
					
						
							|  |  |  |     buf[len] = 0; | 
					
						
							| 
									
										
										
										
											2010-06-18 23:24:36 +01:00
										 |  |  |   } else { | 
					
						
							|  |  |  |     buf = (char *)s; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   while (!(at = Yap_LookupAtom(buf))) { | 
					
						
							|  |  |  |     if (!Yap_growheap(FALSE, 0L, NULL)) { | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |       Yap_Error(OUT_OF_HEAP_ERROR, TermNil, LOCAL_ErrorMessage); | 
					
						
							| 
									
										
										
										
											2010-06-18 23:24:36 +01:00
										 |  |  |       return FALSE; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2012-01-15 11:21:38 -06:00
										 |  |  |   Yap_AtomIncreaseHold(at); | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   Yap_PutInSlot(t,MkAtomTerm(at) PASS_REGS); | 
					
						
							| 
									
										
										
										
											2010-06-18 23:24:36 +01:00
										 |  |  |   return TRUE; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-15 00:49:05 +00:00
										 |  |  | X_API int PL_put_float(term_t t, double fl) | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   Yap_PutInSlot(t,YAP_MkFloatTerm(fl) PASS_REGS); | 
					
						
							| 
									
										
										
										
											2010-01-15 00:49:05 +00:00
										 |  |  |   return TRUE; | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-15 00:49:05 +00:00
										 |  |  | X_API int PL_put_functor(term_t t, functor_t f) | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   long int  arity; | 
					
						
							| 
									
										
										
										
											2008-12-22 12:03:14 +00:00
										 |  |  |   Functor ff = SWIFunctorToFunctor(f); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2008-12-22 12:03:14 +00:00
										 |  |  |   if (IsAtomTerm((Term)ff)) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |     Yap_PutInSlot(t,(Term)ff PASS_REGS); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2008-12-22 12:03:14 +00:00
										 |  |  |     arity = ArityOfFunctor(ff); | 
					
						
							|  |  |  |     if (arity == 2 && ff == FunctorDot) | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       Yap_PutInSlot(t,YAP_MkNewPairTerm() PASS_REGS);     | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |     else | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       Yap_PutInSlot(t,YAP_MkNewApplTerm((YAP_Functor)ff,arity) PASS_REGS); | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  |     if (Unsigned(H) > Unsigned(ASP)-CreepFlag) { | 
					
						
							|  |  |  |       if (!Yap_gc(0, ENV, CP)) { | 
					
						
							|  |  |  | 	return FALSE; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2010-01-15 00:49:05 +00:00
										 |  |  |   return TRUE; | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-15 00:49:05 +00:00
										 |  |  | X_API int PL_put_integer(term_t t, long n) | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   Yap_PutInSlot(t,YAP_MkIntTerm(n) PASS_REGS); | 
					
						
							| 
									
										
										
										
											2010-01-15 00:49:05 +00:00
										 |  |  |   return TRUE; | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-15 00:49:05 +00:00
										 |  |  | X_API int PL_put_int64(term_t t, int64_t n) | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2011-11-03 07:45:51 +09:00
										 |  |  | #if SIZEOF_INT_P==8
 | 
					
						
							| 
									
										
										
										
											2011-11-16 15:20:21 +00:00
										 |  |  |   Yap_PutInSlot(t,MkIntegerTerm(n) PASS_REGS); | 
					
						
							| 
									
										
										
										
											2011-11-03 07:45:51 +09:00
										 |  |  |   return TRUE; | 
					
						
							|  |  |  | #elif USE_GMP
 | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   char s[64]; | 
					
						
							|  |  |  |   MP_INT rop; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-10 03:03:03 -06:00
										 |  |  | #ifdef _WIN32
 | 
					
						
							|  |  |  |   snprintf(s, 64, "%I64d", (long long int)n); | 
					
						
							|  |  |  | #elif HAVE_SNPRINTF
 | 
					
						
							|  |  |  |   snprintf(s, 64, "%lld", (long long int)n); | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   sprintf(s, "%lld", (long long int)n); | 
					
						
							| 
									
										
										
										
											2010-02-10 03:03:03 -06:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   mpz_init_set_str (&rop, s, 10); | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   Yap_PutInSlot(t,YAP_MkBigNumTerm((void *)&rop) PASS_REGS); | 
					
						
							| 
									
										
										
										
											2010-01-15 00:49:05 +00:00
										 |  |  |   return TRUE; | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |   return FALSE; | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-15 00:49:05 +00:00
										 |  |  | X_API int PL_put_list(term_t t) | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   Yap_PutInSlot(t,YAP_MkNewPairTerm() PASS_REGS); | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  |   if (Unsigned(H) > Unsigned(ASP)-CreepFlag) { | 
					
						
							|  |  |  |     if (!Yap_gc(0, ENV, CP)) { | 
					
						
							|  |  |  |       return FALSE; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2010-01-15 00:49:05 +00:00
										 |  |  |   return TRUE; | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-15 00:49:05 +00:00
										 |  |  | X_API int PL_put_list_chars(term_t t, const char *s) | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   Yap_PutInSlot(t,YAP_BufferToString((char *)s) PASS_REGS); | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  |   if (Unsigned(H) > Unsigned(ASP)-CreepFlag) { | 
					
						
							|  |  |  |     if (!Yap_gc(0, ENV, CP)) { | 
					
						
							|  |  |  |       return FALSE; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2010-01-15 00:49:05 +00:00
										 |  |  |   return TRUE; | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API void PL_put_nil(term_t t) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   Yap_PutInSlot(t,TermNil PASS_REGS); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* SWI: void PL_put_pointer(term_t -t, void *ptr)
 | 
					
						
							|  |  |  |    YAP: NO EQUIVALENT */ | 
					
						
							|  |  |  | /* SAM TO DO */ | 
					
						
							| 
									
										
										
										
											2010-01-15 00:49:05 +00:00
										 |  |  | X_API int PL_put_pointer(term_t t, void *ptr) | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2010-05-06 16:41:40 +01:00
										 |  |  |   YAP_Term tptr = YAP_MkIntTerm((YAP_Int)ptr); | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   Yap_PutInSlot(t,tptr PASS_REGS); | 
					
						
							| 
									
										
										
										
											2010-01-15 00:49:05 +00:00
										 |  |  |   return TRUE; | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-19 00:38:49 +01:00
										 |  |  | X_API int PL_put_string_nchars(term_t t, size_t len, const char *chars) | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2010-06-19 00:38:49 +01:00
										 |  |  |   Term tt; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if ((tt = Yap_MkBlobStringTerm(chars, len)) == TermNil) | 
					
						
							|  |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   Yap_PutInSlot(t,tt PASS_REGS); | 
					
						
							| 
									
										
										
										
											2010-01-15 00:49:05 +00:00
										 |  |  |   return TRUE; | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-15 00:49:05 +00:00
										 |  |  | X_API int PL_put_term(term_t d, term_t s) | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   Yap_PutInSlot(d,Yap_GetFromSlot(s PASS_REGS) PASS_REGS); | 
					
						
							| 
									
										
										
										
											2010-01-15 00:49:05 +00:00
										 |  |  |   return TRUE; | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-15 00:49:05 +00:00
										 |  |  | X_API int PL_put_variable(term_t t) | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   Yap_PutInSlot(t,MkVarTerm() PASS_REGS); | 
					
						
							| 
									
										
										
										
											2010-01-15 00:49:05 +00:00
										 |  |  |   return TRUE; | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* end PL_put_* functions =============================*/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* SWI: int PL_raise_exception(term_t exception)
 | 
					
						
							|  |  |  |    YAP: NO EQUIVALENT */ | 
					
						
							|  |  |  | /* SAM TO DO */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API int PL_raise_exception(term_t exception) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   EX = Yap_StoreTermInDB(Yap_GetFromSlot(exception PASS_REGS),0); | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  |   return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-17 00:34:29 +01:00
										 |  |  | X_API int PL_throw(term_t exception) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   YAP_Throw(Yap_GetFromSlot(exception PASS_REGS)); | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |   longjmp(LOCAL_execution->env, 0); | 
					
						
							| 
									
										
										
										
											2010-06-17 00:34:29 +01:00
										 |  |  |   return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API void  PL_fatal_error(const char *msg) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   fprintf(stderr,"[ FATAL ERROR: %s ]\n",msg); | 
					
						
							|  |  |  |   Yap_exit(1); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-19 21:09:22 +00:00
										 |  |  | X_API int PL_warning(const char *msg, ...) { | 
					
						
							|  |  |  |   va_list args; | 
					
						
							|  |  |  |   va_start(args, msg); | 
					
						
							|  |  |  |   // just print the warning message and return? 
 | 
					
						
							|  |  |  |   fprintf(stderr,"[Warning:"); | 
					
						
							|  |  |  |   fprintf(stderr,msg,args); | 
					
						
							|  |  |  |   fprintf(stderr,"]\n"); | 
					
						
							|  |  |  |   va_end(args); | 
					
						
							|  |  |  |   PL_fail; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | /* begin PL_unify_* functions =============================*/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API int PL_unify(term_t t1, term_t t2) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   return YAP_Unify(Yap_GetFromSlot(t1 PASS_REGS),Yap_GetFromSlot(t2 PASS_REGS)); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* SWI: int PL_unify_atom(term_t ?t, atom  *at)
 | 
					
						
							|  |  |  |    YAP long int  unify(YAP_Term* a, Term* b) */ | 
					
						
							|  |  |  | X_API int PL_unify_atom(term_t t, atom_t at) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  |   YAP_Term cterm = MkAtomTerm(SWIAtomToAtom(at)); | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   return YAP_Unify(Yap_GetFromSlot(t PASS_REGS),cterm); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* SWI: int PL_unify_atom_chars(term_t ?t, const char *chars)
 | 
					
						
							|  |  |  |    YAP long int  unify(YAP_Term* a, Term* b) */ | 
					
						
							|  |  |  | X_API int PL_unify_atom_chars(term_t t, const char *s) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2010-05-06 10:57:59 +01:00
										 |  |  |   Atom catom; | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  |   Term cterm; | 
					
						
							|  |  |  |   while (!(catom = Yap_LookupAtom((char *)s))) { | 
					
						
							|  |  |  |     if (!Yap_growheap(FALSE, 0L, NULL)) { | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |       Yap_Error(OUT_OF_HEAP_ERROR, TermNil, LOCAL_ErrorMessage); | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  |       return FALSE; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2012-01-15 11:21:38 -06:00
										 |  |  |   Yap_AtomIncreaseHold(catom); | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  |   cterm = MkAtomTerm(catom); | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   return Yap_unify(Yap_GetFromSlot(t PASS_REGS),cterm); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-01 21:44:25 +00:00
										 |  |  | /* SWI: int PL_unify_atom_chars(term_t ?t, const char *chars)
 | 
					
						
							|  |  |  |    YAP long int  unify(YAP_Term* a, Term* b) */ | 
					
						
							|  |  |  | X_API int PL_unify_atom_nchars(term_t t, size_t len, const char *s) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  |   Atom catom; | 
					
						
							| 
									
										
										
										
											2008-08-01 21:44:25 +00:00
										 |  |  |   YAP_Term cterm; | 
					
						
							| 
									
										
										
										
											2010-11-30 22:12:30 +00:00
										 |  |  |   char *buf = (char *)malloc(len+1); | 
					
						
							| 
									
										
										
										
											2008-08-01 21:44:25 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   if (!buf) | 
					
						
							|  |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2010-12-19 20:45:01 +01:00
										 |  |  |   memcpy(buf, s, len); | 
					
						
							| 
									
										
										
										
											2008-08-01 21:44:25 +00:00
										 |  |  |   buf[len] = '\0'; | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  |   while (!(catom = Yap_LookupAtom(buf))) { | 
					
						
							|  |  |  |     if (!Yap_growheap(FALSE, 0L, NULL)) { | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |       Yap_Error(OUT_OF_HEAP_ERROR, TermNil, LOCAL_ErrorMessage); | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  |       return FALSE; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2008-08-01 21:44:25 +00:00
										 |  |  |   free(buf); | 
					
						
							| 
									
										
										
										
											2012-01-17 12:37:29 +00:00
										 |  |  |   Yap_AtomIncreaseHold(catom); | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  |   cterm = MkAtomTerm(catom); | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   return YAP_Unify(Yap_GetFromSlot(t PASS_REGS),cterm); | 
					
						
							| 
									
										
										
										
											2008-08-01 21:44:25 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | /* SWI: int PL_unify_float(term_t ?t, double f)
 | 
					
						
							|  |  |  |    YAP long int  unify(YAP_Term* a, Term* b) */ | 
					
						
							|  |  |  | X_API int PL_unify_float(term_t t, double f) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   YAP_Term fterm = YAP_MkFloatTerm(f); | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   return YAP_Unify(Yap_GetFromSlot(t PASS_REGS),fterm); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* SWI: int PL_unify_integer(term_t ?t, long n)
 | 
					
						
							|  |  |  |    YAP long int  unify(YAP_Term* a, Term* b) */ | 
					
						
							|  |  |  | X_API int PL_unify_integer(term_t t, long n) | 
					
						
							|  |  |  | {	 | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2010-01-26 22:26:08 +00:00
										 |  |  |   Term iterm = MkIntegerTerm(n); | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   return Yap_unify(Yap_GetFromSlot(t PASS_REGS),iterm); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-01 21:44:25 +00:00
										 |  |  | /* SWI: int PL_unify_integer(term_t ?t, long n)
 | 
					
						
							|  |  |  |    YAP long int  unify(YAP_Term* a, Term* b) */ | 
					
						
							|  |  |  | X_API int PL_unify_functor(term_t t, functor_t f) | 
					
						
							|  |  |  | {	 | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   Term tt = Yap_GetFromSlot(t PASS_REGS); | 
					
						
							| 
									
										
										
										
											2008-12-22 12:03:14 +00:00
										 |  |  |   Functor ff = SWIFunctorToFunctor(f); | 
					
						
							| 
									
										
										
										
											2011-02-14 11:28:07 -08:00
										 |  |  |   if (IsVarTerm(tt)) { | 
					
						
							|  |  |  |     while (Unsigned(H)+ArityOfFunctor(ff) > Unsigned(ASP)-CreepFlag) { | 
					
						
							|  |  |  |       if (!Yap_gc(ArityOfFunctor(ff)*sizeof(CELL), ENV, CP)) { | 
					
						
							|  |  |  | 	return FALSE; | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-02-14 11:28:07 -08:00
										 |  |  |     return Yap_unify(tt, Yap_MkNewApplTerm(ff,ArityOfFunctor(ff))); | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2011-02-14 11:28:07 -08:00
										 |  |  |   if (IsPairTerm(tt)) | 
					
						
							| 
									
										
										
										
											2008-12-22 12:03:14 +00:00
										 |  |  |     return ff == FunctorDot; | 
					
						
							| 
									
										
										
										
											2011-02-14 11:28:07 -08:00
										 |  |  |   if (!IsApplTerm(tt)) | 
					
						
							| 
									
										
										
										
											2008-08-01 21:44:25 +00:00
										 |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2008-12-22 12:03:14 +00:00
										 |  |  |   return ff == FunctorOfTerm(tt); | 
					
						
							| 
									
										
										
										
											2008-08-01 21:44:25 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | /* SWI: int PL_unify_integer(term_t ?t, long n)
 | 
					
						
							|  |  |  |    YAP long int  unify(YAP_Term* a, Term* b) */ | 
					
						
							|  |  |  | X_API int PL_unify_int64(term_t t, int64_t n) | 
					
						
							|  |  |  | {	 | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2010-07-19 14:54:21 +01:00
										 |  |  | #if SIZEOF_INT_P==8
 | 
					
						
							|  |  |  |   Term iterm = MkIntegerTerm(n); | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   return Yap_unify(Yap_GetFromSlot(t PASS_REGS),iterm); | 
					
						
							| 
									
										
										
										
											2010-07-19 14:54:21 +01:00
										 |  |  | #elif USE_GMP
 | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   YAP_Term iterm; | 
					
						
							|  |  |  |   char s[64]; | 
					
						
							|  |  |  |   MP_INT rop; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-10 03:03:03 -06:00
										 |  |  | #ifdef _WIN32
 | 
					
						
							|  |  |  |   snprintf(s, 64, "%I64d", (long long int)n); | 
					
						
							|  |  |  | #elif HAVE_SNPRINTF
 | 
					
						
							|  |  |  |   snprintf(s, 64, "%lld", (long long int)n); | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   sprintf(s, "%lld", (long long int)n); | 
					
						
							| 
									
										
										
										
											2010-02-10 03:03:03 -06:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   mpz_init_set_str (&rop, s, 10); | 
					
						
							|  |  |  |   iterm = YAP_MkBigNumTerm((void *)&rop); | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   return YAP_Unify(Yap_GetFromSlot(t PASS_REGS),iterm); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2011-11-03 07:45:51 +09:00
										 |  |  |   if ((long)n == n) | 
					
						
							|  |  |  |     return PL_unify_integer(t, n); | 
					
						
							| 
									
										
										
										
											2011-06-06 12:27:45 +01:00
										 |  |  |   fprintf(stderr,"Error in PL_unify_int64: please install GMP\n"); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   return FALSE; | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2010-07-19 14:54:21 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* SWI: int PL_unify_list(term_t ?t, term_t +h, term_t -t)
 | 
					
						
							|  |  |  |    YAP long int  unify(YAP_Term* a, Term* b) */ | 
					
						
							| 
									
										
										
										
											2009-03-13 19:40:27 +00:00
										 |  |  | X_API int PL_unify_list(term_t tt, term_t h, term_t tail) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  |   Term t; | 
					
						
							|  |  |  |   if (Unsigned(H) > Unsigned(ASP)-CreepFlag) { | 
					
						
							|  |  |  |     if (!Yap_gc(0, ENV, CP)) { | 
					
						
							|  |  |  |       return FALSE; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   t = Deref(Yap_GetFromSlot(tt PASS_REGS)); | 
					
						
							| 
									
										
										
										
											2009-03-13 19:40:27 +00:00
										 |  |  |   if (IsVarTerm(t)) { | 
					
						
							|  |  |  |     Term pairterm = Yap_MkNewPairTerm(); | 
					
						
							|  |  |  |     Yap_unify(t, pairterm); | 
					
						
							|  |  |  |     /* avoid calling deref */ | 
					
						
							|  |  |  |     t = pairterm; | 
					
						
							|  |  |  |   } else if (!IsPairTerm(t)) { | 
					
						
							|  |  |  |     return FALSE; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   Yap_PutInSlot(h,HeadOfTerm(t) PASS_REGS); | 
					
						
							|  |  |  |   Yap_PutInSlot(tail,TailOfTerm(t) PASS_REGS); | 
					
						
							| 
									
										
										
										
											2010-05-03 17:02:49 +01:00
										 |  |  |   return TRUE; | 
					
						
							| 
									
										
										
										
											2010-01-25 12:29:51 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* SWI: int PL_unify_list(term_t ?t, term_t +h, term_t -t)
 | 
					
						
							|  |  |  |    YAP long int  unify(YAP_Term* a, Term* b) */ | 
					
						
							|  |  |  | X_API int PL_unify_arg(int index, term_t tt, term_t arg) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   Term t = Deref(Yap_GetFromSlot(tt PASS_REGS)), to; | 
					
						
							| 
									
										
										
										
											2010-01-25 12:29:51 +00:00
										 |  |  |   if (index < 0) | 
					
						
							|  |  |  |     return FALSE; | 
					
						
							|  |  |  |   if (IsVarTerm(t) || IsAtomOrIntTerm(t)) { | 
					
						
							|  |  |  |     return FALSE; | 
					
						
							|  |  |  |   } else if (IsPairTerm(t)) { | 
					
						
							|  |  |  |     if (index == 1) | 
					
						
							|  |  |  |       to = HeadOfTerm(t); | 
					
						
							|  |  |  |     else if (index == 2) | 
					
						
							|  |  |  |       to = TailOfTerm(t); | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       return FALSE; | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     Functor f = FunctorOfTerm(t); | 
					
						
							|  |  |  |     if (IsExtensionFunctor(f))  | 
					
						
							|  |  |  |       return FALSE; | 
					
						
							|  |  |  |     if (index > ArityOfFunctor(f)) | 
					
						
							|  |  |  |       return FALSE; | 
					
						
							|  |  |  |     to = ArgOfTerm(index, t); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   return Yap_unify(Yap_GetFromSlot(t PASS_REGS),to); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* SWI: int PL_unify_list(term_t ?t, term_t +h, term_t -t)
 | 
					
						
							|  |  |  |    YAP long int  unify(YAP_Term* a, Term* b) */ | 
					
						
							|  |  |  | X_API int PL_unify_list_chars(term_t t, const char *chars) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  |   YAP_Term chterm; | 
					
						
							|  |  |  |   if (Unsigned(H) > Unsigned(ASP)-CreepFlag) { | 
					
						
							|  |  |  |     if (!Yap_gc(0, ENV, CP)) { | 
					
						
							|  |  |  |       return FALSE; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   chterm = YAP_BufferToString((char *)chars); | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   return YAP_Unify(Yap_GetFromSlot(t PASS_REGS), chterm); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-17 00:34:29 +01:00
										 |  |  | /* SWI: int PL_unify_list(term_t ?t, term_t +h, term_t -t)
 | 
					
						
							|  |  |  |    YAP long int  unify(YAP_Term* a, Term* b) */ | 
					
						
							|  |  |  | X_API int PL_unify_list_ncodes(term_t t, size_t len, const char *chars) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2010-06-17 00:34:29 +01:00
										 |  |  |   Term chterm; | 
					
						
							|  |  |  |   if (Unsigned(H) > Unsigned(ASP+len*2)-CreepFlag) { | 
					
						
							|  |  |  |     if (!Yap_gc(len*2*sizeof(CELL), ENV, CP)) { | 
					
						
							|  |  |  |       return FALSE; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   chterm = Yap_NStringToList((char *)chars, len); | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   return Yap_unify(Yap_GetFromSlot(t PASS_REGS), chterm); | 
					
						
							| 
									
										
										
										
											2010-06-17 00:34:29 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-18 00:29:07 +01:00
										 |  |  | X_API int | 
					
						
							|  |  |  | PL_unify_list_codes(term_t l, const char *chars) | 
					
						
							|  |  |  | { return PL_unify_list_ncodes(l, strlen(chars), chars); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | /* SWI: int PL_unify_nil(term_t ?l)
 | 
					
						
							|  |  |  |    YAP long int  unify(YAP_Term* a, Term* b) */ | 
					
						
							|  |  |  | X_API int PL_unify_nil(term_t l) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  |   YAP_Term nilterm = TermNil; | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   return YAP_Unify(Yap_GetFromSlot(l PASS_REGS), nilterm); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* SWI: int PL_unify_pointer(term_t ?t, void *ptr)
 | 
					
						
							|  |  |  |    YAP: NO EQUIVALENT */ | 
					
						
							|  |  |  | /* SAM TO DO */ | 
					
						
							|  |  |  | X_API int PL_unify_pointer(term_t t, void *ptr) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2010-05-06 16:41:40 +01:00
										 |  |  |   YAP_Term ptrterm = YAP_MkIntTerm((YAP_Int)ptr); | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   return YAP_Unify(Yap_GetFromSlot(t PASS_REGS), ptrterm); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* SWI: int PL_unify_list(term_t ?t, term_t +h, term_t -t)
 | 
					
						
							|  |  |  |    YAP long int  unify(YAP_Term* a, Term* b) */ | 
					
						
							|  |  |  | X_API int PL_unify_string_chars(term_t t, const char *chars) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  |   YAP_Term chterm; | 
					
						
							|  |  |  |   if (Unsigned(H) > Unsigned(ASP)-CreepFlag) { | 
					
						
							|  |  |  |     if (!Yap_gc(0, ENV, CP)) { | 
					
						
							|  |  |  |       return FALSE; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   chterm = YAP_BufferToString((char *)chars); | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   return YAP_Unify(Yap_GetFromSlot(t PASS_REGS), chterm); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-17 00:34:29 +01:00
										 |  |  | X_API int PL_unify_string_nchars(term_t t, size_t len, const char *chars) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2010-06-17 00:34:29 +01:00
										 |  |  |   YAP_Term chterm; | 
					
						
							|  |  |  |   if (Unsigned(H) > Unsigned(ASP)-CreepFlag) { | 
					
						
							|  |  |  |     if (!Yap_gc(0, ENV, CP)) { | 
					
						
							|  |  |  |       return FALSE; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   chterm = YAP_NBufferToString((char *)chars, len); | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   return YAP_Unify(Yap_GetFromSlot(t PASS_REGS), chterm); | 
					
						
							| 
									
										
										
										
											2010-06-17 00:34:29 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-24 16:02:04 +00:00
										 |  |  | /* SWI: int PL_unify_wchars(term_t ?t, int type, size_t len,, const pl_wchar_t *s)
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | X_API int PL_unify_wchars(term_t t, int type, size_t len, const pl_wchar_t *chars) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2008-07-24 16:02:04 +00:00
										 |  |  |   YAP_Term chterm; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (len == (size_t)-1) | 
					
						
							|  |  |  |     len = wcslen(chars); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  |   if (Unsigned(H) > Unsigned(ASP)-CreepFlag) { | 
					
						
							|  |  |  |     if (!Yap_gc(0, ENV, CP)) { | 
					
						
							|  |  |  |       return FALSE; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2008-07-24 16:02:04 +00:00
										 |  |  |   switch (type) { | 
					
						
							|  |  |  |   case PL_ATOM: | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  |     { | 
					
						
							|  |  |  |       Atom at; | 
					
						
							| 
									
										
										
										
											2010-05-06 10:57:59 +01:00
										 |  |  |       while ((at = Yap_LookupMaybeWideAtomWithLength((wchar_t *)chars, len)) == NULL) { | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  | 	if (!Yap_growheap(FALSE, 0L, NULL)) { | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  | 	  Yap_Error(OUT_OF_HEAP_ERROR, TermNil, LOCAL_ErrorMessage); | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  | 	  return FALSE; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2012-01-17 12:37:29 +00:00
										 |  |  |       Yap_AtomIncreaseHold(at); | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  |       chterm = MkAtomTerm(at); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2008-07-24 16:02:04 +00:00
										 |  |  |     break; | 
					
						
							|  |  |  |   case PL_STRING: | 
					
						
							| 
									
										
										
										
											2010-06-19 00:38:49 +01:00
										 |  |  |     chterm = Yap_MkBlobWideStringTerm(chars, len); | 
					
						
							|  |  |  |     break; | 
					
						
							| 
									
										
										
										
											2008-07-24 16:02:04 +00:00
										 |  |  |   case PL_CODE_LIST: | 
					
						
							|  |  |  |     chterm = YAP_NWideBufferToString(chars, len); | 
					
						
							|  |  |  |     break; | 
					
						
							|  |  |  |   case PL_CHAR_LIST: | 
					
						
							|  |  |  |     chterm = YAP_NWideBufferToAtomList(chars, len); | 
					
						
							|  |  |  |     break; | 
					
						
							|  |  |  |   default: | 
					
						
							|  |  |  |     /* should give error?? */ | 
					
						
							|  |  |  |     return FALSE; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   return YAP_Unify(Yap_GetFromSlot(t PASS_REGS), chterm); | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | typedef struct { | 
					
						
							|  |  |  |   int type; | 
					
						
							|  |  |  |   union { | 
					
						
							|  |  |  |     functor_t f; | 
					
						
							|  |  |  |     term_t t; | 
					
						
							|  |  |  |     atom_t a; | 
					
						
							|  |  |  |     long l; | 
					
						
							| 
									
										
										
										
											2008-08-01 21:44:25 +00:00
										 |  |  |     int i; | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |     double dbl; | 
					
						
							|  |  |  |     char *s; | 
					
						
							| 
									
										
										
										
											2008-08-01 21:44:25 +00:00
										 |  |  |     struct { | 
					
						
							|  |  |  |       size_t n; | 
					
						
							|  |  |  |       char *s; | 
					
						
							|  |  |  |     } ns; | 
					
						
							|  |  |  |     struct { | 
					
						
							|  |  |  |       size_t n; | 
					
						
							|  |  |  |       wchar_t *w; | 
					
						
							|  |  |  |     } nw; | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |     void *p; | 
					
						
							| 
									
										
										
										
											2008-08-01 21:44:25 +00:00
										 |  |  |     wchar_t *w; | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   } arg; | 
					
						
							|  |  |  | } arg_types; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  | static Atom | 
					
						
							| 
									
										
										
										
											2008-08-01 21:44:25 +00:00
										 |  |  | LookupMaxAtom(size_t n, char *s) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  |   Atom catom; | 
					
						
							| 
									
										
										
										
											2009-03-13 19:40:27 +00:00
										 |  |  |   char *buf = (char *)Yap_AllocCodeSpace(n+1); | 
					
						
							| 
									
										
										
										
											2008-08-01 21:44:25 +00:00
										 |  |  |    | 
					
						
							|  |  |  |   if (!buf) | 
					
						
							|  |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2010-12-19 20:45:01 +01:00
										 |  |  |   memcpy(buf, s, n); | 
					
						
							| 
									
										
										
										
											2008-08-01 21:44:25 +00:00
										 |  |  |   buf[n] = '\0'; | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  |   while (!(catom = Yap_LookupAtom(buf))) { | 
					
						
							|  |  |  |     if (!Yap_growheap(FALSE, 0L, NULL)) { | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |       Yap_Error(OUT_OF_HEAP_ERROR, TermNil, LOCAL_ErrorMessage); | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  |       return NULL; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2012-01-15 11:21:38 -06:00
										 |  |  |   Yap_AtomIncreaseHold(catom); | 
					
						
							| 
									
										
										
										
											2009-03-13 19:40:27 +00:00
										 |  |  |   Yap_FreeCodeSpace(buf); | 
					
						
							| 
									
										
										
										
											2008-08-01 21:44:25 +00:00
										 |  |  |   return catom; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  | static Atom | 
					
						
							| 
									
										
										
										
											2008-08-01 21:44:25 +00:00
										 |  |  | LookupMaxWideAtom(size_t n, wchar_t *s) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  |   Atom catom; | 
					
						
							| 
									
										
										
										
											2009-03-13 19:40:27 +00:00
										 |  |  |   wchar_t *buf = (wchar_t *)Yap_AllocCodeSpace((n+1)*sizeof(wchar_t)); | 
					
						
							| 
									
										
										
										
											2008-08-01 21:44:25 +00:00
										 |  |  |    | 
					
						
							|  |  |  |   if (!buf) | 
					
						
							|  |  |  |     return FALSE; | 
					
						
							|  |  |  |   wcsncpy(buf, s, n); | 
					
						
							|  |  |  |   buf[n] = '\0'; | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  |   while (!(catom = Yap_LookupMaybeWideAtom(buf))) { | 
					
						
							|  |  |  |     if (!Yap_growheap(FALSE, 0L, NULL)) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       CACHE_REGS | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |       Yap_Error(OUT_OF_HEAP_ERROR, TermNil, LOCAL_ErrorMessage); | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  |       return NULL; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2012-01-17 12:37:29 +00:00
										 |  |  |   Yap_AtomIncreaseHold(catom); | 
					
						
							| 
									
										
										
										
											2009-03-13 19:40:27 +00:00
										 |  |  |   Yap_FreeAtomSpace((ADDR)buf); | 
					
						
							| 
									
										
										
										
											2008-08-01 21:44:25 +00:00
										 |  |  |   return catom; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static YAP_Term | 
					
						
							|  |  |  | MkBoolTerm(int b) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   if (b) | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  |     return MkAtomTerm(AtomTrue); | 
					
						
							| 
									
										
										
										
											2008-08-01 21:44:25 +00:00
										 |  |  |   else | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  |     return MkAtomTerm(AtomFalse); | 
					
						
							| 
									
										
										
										
											2008-08-01 21:44:25 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-13 19:40:27 +00:00
										 |  |  | #define MAX_DEPTH 64
 | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-13 19:40:27 +00:00
										 |  |  | typedef struct { | 
					
						
							|  |  |  |   int nels; | 
					
						
							|  |  |  |   CELL *ptr; | 
					
						
							|  |  |  | } stack_el; | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* SWI: int PL_unify_term(term_t ?t1, term_t ?t2)
 | 
					
						
							|  |  |  |    YAP long int  YAP_Unify(YAP_Term* a, Term* b) */ | 
					
						
							|  |  |  | X_API int PL_unify_term(term_t l,...) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   va_list ap; | 
					
						
							| 
									
										
										
										
											2011-01-20 12:04:50 -06:00
										 |  |  |   int type, res; | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   int nels = 1; | 
					
						
							| 
									
										
										
										
											2009-03-13 19:40:27 +00:00
										 |  |  |   int depth = 1; | 
					
						
							|  |  |  |   Term a[1], *pt; | 
					
						
							|  |  |  |   stack_el stack[MAX_DEPTH]; | 
					
						
							|  |  |  |    | 
					
						
							| 
									
										
										
										
											2011-01-20 12:04:50 -06:00
										 |  |  |   BACKUP_MACHINE_REGS(); | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  |   if (Unsigned(H) > Unsigned(ASP)-CreepFlag) { | 
					
						
							|  |  |  |     if (!Yap_gc(0, ENV, CP)) { | 
					
						
							| 
									
										
										
										
											2011-01-20 12:04:50 -06:00
										 |  |  |       RECOVER_MACHINE_REGS(); | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  |       return FALSE; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   va_start (ap, l); | 
					
						
							| 
									
										
										
										
											2009-03-13 19:40:27 +00:00
										 |  |  |   pt = a; | 
					
						
							|  |  |  |   while (depth > 0) { | 
					
						
							|  |  |  |     while (nels > 0) { | 
					
						
							|  |  |  |       type = va_arg(ap, int); | 
					
						
							|  |  |  |       nels--; | 
					
						
							|  |  |  |       switch(type) { | 
					
						
							|  |  |  |       case PL_VARIABLE: | 
					
						
							|  |  |  | 	*pt++ = MkVarTerm(); | 
					
						
							|  |  |  | 	break; | 
					
						
							|  |  |  |       case PL_BOOL: | 
					
						
							|  |  |  | 	*pt++ = MkBoolTerm(va_arg(ap, int)); | 
					
						
							|  |  |  | 	break; | 
					
						
							|  |  |  |       case PL_ATOM: | 
					
						
							|  |  |  | 	*pt++ = MkAtomTerm(SWIAtomToAtom(va_arg(ap, atom_t))); | 
					
						
							|  |  |  | 	break; | 
					
						
							|  |  |  |       case PL_INTEGER: | 
					
						
							|  |  |  | 	*pt++ = MkIntegerTerm(va_arg(ap, long)); | 
					
						
							|  |  |  | 	break; | 
					
						
							|  |  |  |       case PL_SHORT: | 
					
						
							|  |  |  | 	*pt++ = MkIntegerTerm(va_arg(ap, int)); | 
					
						
							|  |  |  | 	break; | 
					
						
							| 
									
										
										
										
											2010-07-19 14:54:21 +01:00
										 |  |  |       case PL_LONG: | 
					
						
							|  |  |  | 	*pt++ = MkIntegerTerm(va_arg(ap, long)); | 
					
						
							|  |  |  | 	break; | 
					
						
							| 
									
										
										
										
											2009-03-13 19:40:27 +00:00
										 |  |  |       case PL_INT: | 
					
						
							|  |  |  | 	*pt++ = MkIntegerTerm(va_arg(ap, int)); | 
					
						
							|  |  |  | 	break; | 
					
						
							|  |  |  |       case PL_FLOAT: | 
					
						
							|  |  |  | 	*pt++ = MkFloatTerm(va_arg(ap, double)); | 
					
						
							|  |  |  | 	break; | 
					
						
							|  |  |  |       case PL_STRING: | 
					
						
							| 
									
										
										
										
											2010-06-19 00:38:49 +01:00
										 |  |  | 	*pt++ = Yap_MkBlobStringTerm(va_arg(ap, char *), -1); | 
					
						
							| 
									
										
										
										
											2009-03-13 19:40:27 +00:00
										 |  |  | 	break; | 
					
						
							|  |  |  |       case PL_CHARS: | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 	  Atom at; | 
					
						
							| 
									
										
										
										
											2010-05-06 10:57:59 +01:00
										 |  |  | 	  char *s = va_arg(ap, char *); | 
					
						
							|  |  |  | 	  while (!(at = Yap_LookupAtom(s))) { | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  | 	    if (!Yap_growheap(FALSE, 0L, NULL)) { | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  | 	      Yap_Error(OUT_OF_HEAP_ERROR, TermNil, LOCAL_ErrorMessage); | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  | 	      return FALSE; | 
					
						
							|  |  |  | 	    } | 
					
						
							|  |  |  | 	  } | 
					
						
							| 
									
										
										
										
											2012-01-15 11:21:38 -06:00
										 |  |  | 	  Yap_AtomIncreaseHold(at); | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  | 	  *pt++ = MkAtomTerm(at); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2009-03-13 19:40:27 +00:00
										 |  |  | 	break; | 
					
						
							|  |  |  |       case PL_NCHARS: | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 	  size_t sz = va_arg(ap, size_t); | 
					
						
							|  |  |  | 	  *pt++ = MkAtomTerm(LookupMaxAtom(sz,va_arg(ap, char *))); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	break; | 
					
						
							|  |  |  |       case PL_NWCHARS: | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 	  size_t sz = va_arg(ap, size_t); | 
					
						
							| 
									
										
										
										
											2010-05-06 10:57:59 +01:00
										 |  |  | 	  wchar_t * arg = va_arg(ap, wchar_t *); | 
					
						
							|  |  |  | 	  *pt++ = MkAtomTerm(LookupMaxWideAtom(sz,arg)); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2009-03-13 19:40:27 +00:00
										 |  |  | 	break; | 
					
						
							|  |  |  |       case PL_TERM: | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | 	  Term t = Yap_GetFromSlot(va_arg(ap, size_t) PASS_REGS); | 
					
						
							| 
									
										
										
										
											2009-03-13 19:40:27 +00:00
										 |  |  | 	  if (IsVarTerm(t) && VarOfTerm(t) >= ASP && VarOfTerm(t) < LCL0) { | 
					
						
							|  |  |  | 	    Yap_unify(*pt++, t); | 
					
						
							|  |  |  | 	  } | 
					
						
							|  |  |  | 	  else { | 
					
						
							|  |  |  | 	    *pt++ = t; | 
					
						
							|  |  |  | 	  } | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	break; | 
					
						
							|  |  |  |       case PL_POINTER: | 
					
						
							|  |  |  | 	*pt++ = MkIntegerTerm((Int)va_arg(ap, void *)); | 
					
						
							|  |  |  | 	break; | 
					
						
							| 
									
										
										
										
											2009-06-01 15:38:39 -05:00
										 |  |  |       case PL_INT64: | 
					
						
							| 
									
										
										
										
											2011-02-12 18:42:44 +00:00
										 |  |  | #if SIZEOF_LONG_INT==8
 | 
					
						
							| 
									
										
										
										
											2009-06-01 15:38:39 -05:00
										 |  |  | 	*pt++ = MkIntegerTerm((Int)va_arg(ap, long int)); | 
					
						
							|  |  |  | #elif USE_GMP
 | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 	  char s[64]; | 
					
						
							|  |  |  | 	  MP_INT rop; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-10 03:03:03 -06:00
										 |  |  | #ifdef _WIN32
 | 
					
						
							|  |  |  | 	  snprintf(s, 64, "%I64d", va_arg(ap, long long int)); | 
					
						
							|  |  |  | #elif HAVE_SNPRINTF
 | 
					
						
							|  |  |  | 	  snprintf(s, 64, "%lld", va_arg(ap, long long int)); | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2009-06-01 15:38:39 -05:00
										 |  |  | 	  sprintf(s, "%lld", va_arg(ap, long long int)); | 
					
						
							| 
									
										
										
										
											2010-02-10 03:03:03 -06:00
										 |  |  | #endif	  
 | 
					
						
							| 
									
										
										
										
											2009-06-01 15:38:39 -05:00
										 |  |  | 	  mpz_init_set_str (&rop, s, 10); | 
					
						
							|  |  |  | 	  *pt++ = YAP_MkBigNumTerm((void *)&rop); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | 	fprintf(stderr, "PL_unify_term: PL_int64 not supported\n"); | 
					
						
							|  |  |  | 	exit(1); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 	break; | 
					
						
							| 
									
										
										
										
											2009-03-13 19:40:27 +00:00
										 |  |  |       case PL_FUNCTOR: | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 	  functor_t f = va_arg(ap, functor_t); | 
					
						
							|  |  |  | 	  Functor ff = SWIFunctorToFunctor(f); | 
					
						
							|  |  |  | 	  UInt arity = ArityOfFunctor(ff); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	  if (!arity) { | 
					
						
							|  |  |  | 	    *pt++ = MkAtomTerm((Atom)f); | 
					
						
							|  |  |  | 	  } else { | 
					
						
							|  |  |  | 	    Term t = Yap_MkNewApplTerm(ff, arity); | 
					
						
							|  |  |  | 	    if (nels) { | 
					
						
							|  |  |  | 	      if (depth == MAX_DEPTH) { | 
					
						
							|  |  |  | 		fprintf(stderr,"ERROR: very deep term in PL_unify_term, change MAX_DEPTH from %d\n", MAX_DEPTH); | 
					
						
							|  |  |  | 		return FALSE; | 
					
						
							|  |  |  | 	      } | 
					
						
							| 
									
										
										
										
											2009-04-18 18:49:12 -05:00
										 |  |  | 	      stack[depth-1].nels = nels; | 
					
						
							|  |  |  | 	      stack[depth-1].ptr = pt+1; | 
					
						
							| 
									
										
										
										
											2009-03-13 19:40:27 +00:00
										 |  |  | 	      depth++; | 
					
						
							|  |  |  | 	    } | 
					
						
							|  |  |  | 	    *pt = t; | 
					
						
							|  |  |  | 	    if (ff == FunctorDot) | 
					
						
							|  |  |  | 	      pt = RepPair(t); | 
					
						
							|  |  |  | 	    else | 
					
						
							|  |  |  | 	      pt = RepAppl(t)+1; | 
					
						
							|  |  |  | 	    nels = arity; | 
					
						
							|  |  |  | 	  } | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	break; | 
					
						
							|  |  |  |       case PL_FUNCTOR_CHARS: | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 	  char *fname = va_arg(ap, char *); | 
					
						
							|  |  |  | 	  size_t arity = va_arg(ap, size_t); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	  if (!arity) { | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  | 	    Atom at; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	    while (!(at = Yap_LookupAtom(fname))) { | 
					
						
							|  |  |  | 	      if (!Yap_growheap(FALSE, 0L, NULL)) { | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  | 		Yap_Error(OUT_OF_HEAP_ERROR, TermNil, LOCAL_ErrorMessage); | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  | 		return FALSE; | 
					
						
							|  |  |  | 	      } | 
					
						
							|  |  |  | 	    } | 
					
						
							| 
									
										
										
										
											2012-01-15 11:21:38 -06:00
										 |  |  | 	    Yap_AtomIncreaseHold(at); | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  | 	    *pt++ = MkAtomTerm(at); | 
					
						
							| 
									
										
										
										
											2009-03-13 19:40:27 +00:00
										 |  |  | 	  } else { | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  | 	    Atom at; | 
					
						
							|  |  |  | 	    Functor ff; | 
					
						
							|  |  |  | 	    Term t; | 
					
						
							| 
									
										
										
										
											2009-03-13 19:40:27 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  | 	    while (!(at = Yap_LookupAtom(fname))) { | 
					
						
							|  |  |  | 	      if (!Yap_growheap(FALSE, 0L, NULL)) { | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  | 		Yap_Error(OUT_OF_HEAP_ERROR, TermNil, LOCAL_ErrorMessage); | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  | 		return FALSE; | 
					
						
							|  |  |  | 	      } | 
					
						
							|  |  |  | 	    } | 
					
						
							|  |  |  | 	    ff = Yap_MkFunctor(at,arity); | 
					
						
							|  |  |  | 	    t = Yap_MkNewApplTerm(ff, arity); | 
					
						
							| 
									
										
										
										
											2009-03-13 19:40:27 +00:00
										 |  |  | 	    if (nels) { | 
					
						
							|  |  |  | 	      if (depth == MAX_DEPTH) { | 
					
						
							|  |  |  | 		fprintf(stderr,"very deep term in PL_unify_term\n"); | 
					
						
							|  |  |  | 		return FALSE; | 
					
						
							|  |  |  | 	      } | 
					
						
							| 
									
										
										
										
											2009-04-18 18:49:12 -05:00
										 |  |  | 	      stack[depth-1].nels = nels; | 
					
						
							|  |  |  | 	      stack[depth-1].ptr = pt+1; | 
					
						
							| 
									
										
										
										
											2009-03-13 19:40:27 +00:00
										 |  |  | 	      depth++; | 
					
						
							|  |  |  | 	    } | 
					
						
							|  |  |  | 	    *pt = t; | 
					
						
							|  |  |  | 	    if (ff == FunctorDot) | 
					
						
							|  |  |  | 	      pt = RepPair(t); | 
					
						
							|  |  |  | 	    else | 
					
						
							|  |  |  | 	      pt = RepAppl(t)+1; | 
					
						
							|  |  |  | 	    nels = arity; | 
					
						
							|  |  |  | 	  } | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	break; | 
					
						
							|  |  |  |       case PL_LIST: | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 	  Term t = Yap_MkNewPairTerm(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	  if (nels) { | 
					
						
							|  |  |  | 	    if (depth == MAX_DEPTH) { | 
					
						
							|  |  |  | 	      fprintf(stderr,"very deep term in PL_unify_term\n"); | 
					
						
							|  |  |  | 	      return FALSE; | 
					
						
							|  |  |  | 	    } | 
					
						
							| 
									
										
										
										
											2009-04-18 18:49:12 -05:00
										 |  |  | 	    stack[depth-1].nels = nels; | 
					
						
							| 
									
										
										
										
											2009-03-13 19:40:27 +00:00
										 |  |  | 	    stack[depth].ptr = pt+1; | 
					
						
							|  |  |  | 	    depth++; | 
					
						
							|  |  |  | 	  } | 
					
						
							|  |  |  | 	  *pt = t; | 
					
						
							|  |  |  | 	  pt = RepPair(t); | 
					
						
							|  |  |  | 	  nels = 2; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	break; | 
					
						
							|  |  |  |       default: | 
					
						
							|  |  |  | 	fprintf(stderr, "PL_unify_term: %d not supported\n", type); | 
					
						
							|  |  |  | 	exit(1); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-03-13 19:40:27 +00:00
										 |  |  |     depth--; | 
					
						
							|  |  |  |     if (depth) { | 
					
						
							|  |  |  |       pt = stack[depth-1].ptr; | 
					
						
							|  |  |  |       nels = stack[depth-1].nels; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   va_end (ap); | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   res = Yap_unify(Yap_GetFromSlot(l PASS_REGS),a[0]); | 
					
						
							| 
									
										
										
										
											2011-01-20 12:04:50 -06:00
										 |  |  |   RECOVER_MACHINE_REGS(); | 
					
						
							|  |  |  |   return res; | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* end PL_unify_* functions =============================*/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-12-05 12:17:25 +00:00
										 |  |  | /* SWI: void PL_register_atom(atom_t atom) */ | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | X_API void PL_register_atom(atom_t atom) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-12-21 10:12:47 -02:00
										 |  |  |   Yap_AtomIncreaseHold(SWIAtomToAtom(atom)); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-12-05 12:17:25 +00:00
										 |  |  | /* SWI: void PL_unregister_atom(atom_t atom) */ | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | X_API void PL_unregister_atom(atom_t atom) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-12-21 10:12:47 -02:00
										 |  |  |   Yap_AtomDecreaseHold(SWIAtomToAtom(atom)); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API int PL_term_type(term_t t) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   /* YAP_ does not support strings as different objects */ | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   YAP_Term v = Yap_GetFromSlot(t PASS_REGS); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   if (YAP_IsVarTerm(v)) { | 
					
						
							|  |  |  |     return PL_VARIABLE; | 
					
						
							| 
									
										
										
										
											2008-12-19 11:41:56 +00:00
										 |  |  |   } else if (IsAtomTerm(v)) { | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |     return PL_ATOM; | 
					
						
							|  |  |  |   } else if (YAP_IsIntTerm(v)) { | 
					
						
							|  |  |  |     return PL_INTEGER; | 
					
						
							|  |  |  |   } else if (YAP_IsFloatTerm(v)) { | 
					
						
							|  |  |  |     return PL_FLOAT; | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     return PL_TERM; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API int PL_is_atom(term_t t) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   return IsAtomTerm(Yap_GetFromSlot(t PASS_REGS)); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-25 12:29:51 +00:00
										 |  |  | X_API int PL_is_ground(term_t t) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   return Yap_IsGroundTerm(Yap_GetFromSlot(t PASS_REGS)); | 
					
						
							| 
									
										
										
										
											2010-01-25 12:29:51 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-23 11:44:21 +01:00
										 |  |  | X_API int PL_is_callable(term_t t) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   YAP_Term t1 = Yap_GetFromSlot(t PASS_REGS); | 
					
						
							| 
									
										
										
										
											2010-06-23 11:44:21 +01:00
										 |  |  |   if (IsVarTerm(t1)) | 
					
						
							|  |  |  |     return FALSE; | 
					
						
							|  |  |  |   if (IsAtomTerm(t1) || IsPairTerm(t1))  | 
					
						
							|  |  |  |     return TRUE; | 
					
						
							|  |  |  |   if (IsApplTerm(t1) && !IsExtensionFunctor(FunctorOfTerm(t1))) | 
					
						
							|  |  |  |       return TRUE; | 
					
						
							|  |  |  |   return FALSE; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | X_API int PL_is_atomic(term_t ts) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   YAP_Term t = Yap_GetFromSlot(ts PASS_REGS); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   return !YAP_IsVarTerm(t) || !YAP_IsApplTerm(t) || !YAP_IsPairTerm(t); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API int PL_is_compound(term_t ts) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   YAP_Term t = Yap_GetFromSlot(ts PASS_REGS); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   return (YAP_IsApplTerm(t) || YAP_IsPairTerm(t)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API int PL_is_functor(term_t ts, functor_t f) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   YAP_Term t = Yap_GetFromSlot(ts PASS_REGS); | 
					
						
							| 
									
										
										
										
											2008-12-22 12:03:14 +00:00
										 |  |  |   Functor ff = SWIFunctorToFunctor(f); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   if (YAP_IsApplTerm(t)) { | 
					
						
							| 
									
										
										
										
											2008-12-22 12:03:14 +00:00
										 |  |  |     return FunctorOfTerm(t) == (Functor)ff; | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   } else if (YAP_IsPairTerm(t)) { | 
					
						
							| 
									
										
										
										
											2011-02-15 05:54:19 -08:00
										 |  |  |     return ff == FunctorDot; | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   } else | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API int PL_is_float(term_t ts) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   YAP_Term t = Yap_GetFromSlot(ts PASS_REGS); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   return YAP_IsFloatTerm(t); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API int PL_is_integer(term_t ts) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   YAP_Term t = Yap_GetFromSlot(ts PASS_REGS); | 
					
						
							| 
									
										
										
										
											2011-02-27 03:40:27 -08:00
										 |  |  |   if (IsVarTerm(t)) return FALSE; | 
					
						
							|  |  |  |   if (IsIntTerm(t)) return TRUE; | 
					
						
							|  |  |  |   if (IsApplTerm(t)) { | 
					
						
							|  |  |  |     Functor f = FunctorOfTerm(t); | 
					
						
							|  |  |  |     if (f == FunctorLongInt) | 
					
						
							|  |  |  |       return TRUE; | 
					
						
							|  |  |  |     if (f == FunctorBigInt) { | 
					
						
							|  |  |  |       CELL mask = RepAppl(t)[1]; | 
					
						
							|  |  |  |       return ( mask == BIG_INT ); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return FALSE; | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API int PL_is_list(term_t ts) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   YAP_Term t = Yap_GetFromSlot(ts PASS_REGS); | 
					
						
							| 
									
										
										
										
											2009-04-24 10:31:53 -05:00
										 |  |  |   return Yap_IsListTerm(t); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-01-09 23:29:31 +00:00
										 |  |  | X_API int | 
					
						
							|  |  |  | PL_skip_list(term_t list, term_t tail, size_t *len) | 
					
						
							|  |  |  | {  | 
					
						
							|  |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   Term *l = Yap_AddressFromSlot(list PASS_REGS); | 
					
						
							|  |  |  |   Term *t; | 
					
						
							|  |  |  |   intptr_t length; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   length = Yap_SkipList(l, &t); | 
					
						
							|  |  |  |   if ( len ) | 
					
						
							|  |  |  |     *len = length; | 
					
						
							|  |  |  |   if ( tail ) | 
					
						
							| 
									
										
										
										
											2012-02-07 15:18:43 +00:00
										 |  |  |   { Term t2 = Yap_GetFromSlot(tail PASS_REGS); | 
					
						
							| 
									
										
										
										
											2012-01-09 23:29:31 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     Yap_unify(t2, *t); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if ( *t == TermNil ) | 
					
						
							|  |  |  |     return PL_LIST; | 
					
						
							|  |  |  |   else if ( IsVarTerm(*t) ) | 
					
						
							|  |  |  |     return PL_PARTIAL_LIST; | 
					
						
							|  |  |  |   else if ( IsPairTerm(*t) ) | 
					
						
							|  |  |  |     return PL_CYCLIC_TERM; | 
					
						
							|  |  |  |   else | 
					
						
							|  |  |  |     return PL_NOT_A_LIST; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | X_API int PL_is_number(term_t ts) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   YAP_Term t = Yap_GetFromSlot(ts PASS_REGS); | 
					
						
							| 
									
										
										
										
											2010-12-19 18:49:50 +01:00
										 |  |  |   return YAP_IsIntTerm(t) || YAP_IsBigNumTerm(t) || YAP_IsFloatTerm(t); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API int PL_is_string(term_t ts) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2011-03-11 23:21:23 +00:00
										 |  |  |   Term t = Yap_GetFromSlot(ts PASS_REGS); | 
					
						
							|  |  |  |   return Yap_IsStringTerm(t); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API int PL_is_variable(term_t ts) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   YAP_Term t = Yap_GetFromSlot(ts PASS_REGS); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   return YAP_IsVarTerm(t); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API int PL_compare(term_t ts1, term_t ts2) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   YAP_Term t1 = Yap_GetFromSlot(ts1 PASS_REGS); | 
					
						
							|  |  |  |   YAP_Term t2 = Yap_GetFromSlot(ts2 PASS_REGS); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   return YAP_CompareTerms(t1, t2); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-15 23:35:37 +01:00
										 |  |  | X_API char * | 
					
						
							|  |  |  | PL_record_external | 
					
						
							|  |  |  | (term_t ts, size_t *sz) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   Term t = Yap_GetFromSlot(ts PASS_REGS); | 
					
						
							| 
									
										
										
										
											2010-07-15 23:35:37 +01:00
										 |  |  |   size_t len = 512, nsz; | 
					
						
							|  |  |  |   char *s; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   while(TRUE) { | 
					
						
							|  |  |  |     if (!(s = Yap_AllocCodeSpace(len))) | 
					
						
							|  |  |  |       return NULL; | 
					
						
							| 
									
										
										
										
											2012-02-02 23:25:09 +00:00
										 |  |  |     if ((nsz = Yap_ExportTerm(t, s, len, 0))) { | 
					
						
							| 
									
										
										
										
											2010-07-15 23:35:37 +01:00
										 |  |  |       *sz = nsz; | 
					
						
							|  |  |  |       return s; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       if (len < 16*1024)  | 
					
						
							|  |  |  | 	len = len *2; | 
					
						
							|  |  |  |       else  | 
					
						
							|  |  |  | 	len += 16*1024; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return NULL; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* 
 | 
					
						
							|  |  |  |    partial implementation of recorded_external, does not guarantee endianness nor portability, and does not | 
					
						
							|  |  |  |    support constraints. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API int | 
					
						
							|  |  |  | PL_recorded_external | 
					
						
							|  |  |  | (char *tp, term_t ts) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2010-07-15 23:35:37 +01:00
										 |  |  |   Term t = Yap_ImportTerm(tp); | 
					
						
							|  |  |  |   if (t == 0) | 
					
						
							|  |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   Yap_PutInSlot(ts,t PASS_REGS); | 
					
						
							| 
									
										
										
										
											2010-07-15 23:35:37 +01:00
										 |  |  |   return TRUE; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API int | 
					
						
							|  |  |  | PL_erase_external | 
					
						
							|  |  |  | (char *tp) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   Yap_FreeCodeSpace(tp); | 
					
						
							|  |  |  |   return TRUE; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  | X_API record_t | 
					
						
							|  |  |  | PL_record(term_t ts) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   Term t = Yap_GetFromSlot(ts PASS_REGS); | 
					
						
							| 
									
										
										
										
											2011-01-02 21:16:29 -06:00
										 |  |  |   return (record_t)YAP_Record(t); | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-22 09:35:21 +00:00
										 |  |  | X_API int | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  | PL_recorded(record_t db, term_t ts) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2011-01-02 21:16:29 -06:00
										 |  |  |   Term t = YAP_Recorded((void *)db); | 
					
						
							|  |  |  |   if (t == ((CELL)0)) | 
					
						
							| 
									
										
										
										
											2010-02-22 09:35:21 +00:00
										 |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   Yap_PutInSlot(ts,t PASS_REGS); | 
					
						
							| 
									
										
										
										
											2010-02-22 09:35:21 +00:00
										 |  |  |   return TRUE; | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-26 15:17:17 +00:00
										 |  |  | X_API record_t | 
					
						
							|  |  |  | PL_duplicate_record(record_t db) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   Term t = YAP_Recorded((void *)db); | 
					
						
							|  |  |  |   if (t == ((CELL)0)) | 
					
						
							|  |  |  |     return FALSE; | 
					
						
							|  |  |  |   return (record_t)YAP_Record(t); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  | X_API void | 
					
						
							|  |  |  | PL_erase(record_t db) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-01-02 21:16:29 -06:00
										 |  |  |   YAP_Erase((void *)db); | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | X_API void PL_halt(int e) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |    YAP_Halt(e); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API int PL_action(int action,...) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   va_list ap; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   va_start (ap, action); | 
					
						
							|  |  |  |   switch (action) { | 
					
						
							|  |  |  |   case PL_ACTION_TRACE: | 
					
						
							|  |  |  |     fprintf(stderr, "PL_ACTION_TRACE not supported\n"); | 
					
						
							|  |  |  |     break; | 
					
						
							|  |  |  |   case PL_ACTION_DEBUG: | 
					
						
							|  |  |  |     fprintf(stderr, "PL_ACTION_DEBUG not supported\n"); | 
					
						
							|  |  |  |     break; | 
					
						
							|  |  |  |   case PL_ACTION_BACKTRACE: | 
					
						
							|  |  |  |     fprintf(stderr, "PL_ACTION_BACKTRACE not supported\n"); | 
					
						
							|  |  |  |     break; | 
					
						
							|  |  |  |   case PL_ACTION_HALT: | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       int halt_arg = va_arg(ap, int); | 
					
						
							|  |  |  |       YAP_Halt(halt_arg); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     break; | 
					
						
							|  |  |  |   case PL_ACTION_ABORT: | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  |       YAP_Throw(MkAtomTerm(Yap_LookupAtom("abort"))); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |     break; | 
					
						
							|  |  |  |   case PL_ACTION_BREAK: | 
					
						
							|  |  |  |     fprintf(stderr, "PL_ACTION_BREAK not supported\n"); | 
					
						
							|  |  |  |     break; | 
					
						
							|  |  |  |   case PL_ACTION_GUIAPP: | 
					
						
							|  |  |  |     fprintf(stderr, "PL_ACTION_GUIAPP not supported\n"); | 
					
						
							|  |  |  |     break; | 
					
						
							|  |  |  |   case PL_ACTION_WRITE: | 
					
						
							|  |  |  |     fprintf(stderr, "PL_ACTION_WRITE not supported\n"); | 
					
						
							|  |  |  |     break; | 
					
						
							|  |  |  |   case PL_ACTION_FLUSH: | 
					
						
							|  |  |  |     fprintf(stderr, "PL_ACTION_WRITE not supported\n"); | 
					
						
							|  |  |  |     break; | 
					
						
							|  |  |  |   case PL_ACTION_ATTACH_CONSOLE: | 
					
						
							|  |  |  |     fprintf(stderr, "PL_ACTION_WRITE not supported\n"); | 
					
						
							|  |  |  |     break; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   va_end (ap); | 
					
						
							|  |  |  |   return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API term_t | 
					
						
							|  |  |  | PL_exception(qid_t q) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   YAP_Term t; | 
					
						
							|  |  |  |   if (YAP_GoalHasException(&t)) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |     CACHE_REGS | 
					
						
							|  |  |  |     term_t to = Yap_NewSlots(1 PASS_REGS); | 
					
						
							|  |  |  |     Yap_PutInSlot(to,t PASS_REGS); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |     return to; | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     return 0L; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-22 09:35:21 +00:00
										 |  |  | X_API void | 
					
						
							|  |  |  | PL_clear_exception(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2010-07-21 12:49:06 +01:00
										 |  |  |   EX = NULL; | 
					
						
							| 
									
										
										
										
											2010-02-22 09:35:21 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | X_API int | 
					
						
							|  |  |  | PL_initialise(int myargc, char **myargv) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   YAP_init_args init_args; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-26 12:21:06 +00:00
										 |  |  |   memset((void *)&init_args,0,sizeof(init_args)); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   init_args.Argv = myargv; | 
					
						
							|  |  |  |   init_args.Argc = myargc; | 
					
						
							| 
									
										
										
										
											2010-06-06 23:05:54 +01:00
										 |  |  | #if BOOT_FROM_SAVED_STATE
 | 
					
						
							| 
									
										
										
										
											2009-05-02 14:11:54 -05:00
										 |  |  |   init_args.SavedState = "startup.yss"; | 
					
						
							| 
									
										
										
										
											2010-06-06 23:05:54 +01:00
										 |  |  | #else
 | 
					
						
							|  |  |  |   init_args.SavedState = NULL; | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   init_args.YapLibDir = NULL; | 
					
						
							|  |  |  |   init_args.YapPrologBootFile = NULL; | 
					
						
							|  |  |  |   init_args.HaltAfterConsult = FALSE; | 
					
						
							|  |  |  |   init_args.FastBoot = FALSE; | 
					
						
							| 
									
										
										
										
											2010-06-06 23:05:54 +01:00
										 |  |  |   init_args.MaxTableSpaceSize = 0; | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   init_args.NumberWorkers = 1; | 
					
						
							|  |  |  |   init_args.SchedulerLoop = 10; | 
					
						
							|  |  |  |   init_args.DelayedReleaseLoad = 3; | 
					
						
							| 
									
										
										
										
											2010-04-13 00:31:48 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-10 10:06:51 +01:00
										 |  |  |   GLOBAL_PL_Argc = myargc; | 
					
						
							|  |  |  |   GLOBAL_PL_Argv = myargv; | 
					
						
							|  |  |  |   GLOBAL_InitialisedFromPL = TRUE; | 
					
						
							| 
									
										
										
										
											2010-06-06 23:05:54 +01:00
										 |  |  |   return YAP_Init(&init_args) != YAP_BOOT_ERROR; | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API int | 
					
						
							| 
									
										
										
										
											2010-04-13 00:31:48 +01:00
										 |  |  | PL_is_initialised(int *argcp, char ***argvp) | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-05-10 10:06:51 +01:00
										 |  |  |   if (GLOBAL_InitialisedFromPL) { | 
					
						
							| 
									
										
										
										
											2010-04-13 00:31:48 +01:00
										 |  |  |     if (argcp)  | 
					
						
							| 
									
										
										
										
											2011-05-10 10:06:51 +01:00
										 |  |  |       *argcp = GLOBAL_PL_Argc; | 
					
						
							| 
									
										
										
										
											2010-04-13 00:31:48 +01:00
										 |  |  |     if (argvp)  | 
					
						
							| 
									
										
										
										
											2011-05-10 10:06:51 +01:00
										 |  |  |       *argvp = GLOBAL_PL_Argv; | 
					
						
							| 
									
										
										
										
											2010-04-13 00:31:48 +01:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2011-05-10 10:06:51 +01:00
										 |  |  |   return GLOBAL_InitialisedFromPL; | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-01 21:44:25 +00:00
										 |  |  | X_API module_t | 
					
						
							|  |  |  | PL_context(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   return (module_t)YAP_CurrentModule(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API int | 
					
						
							|  |  |  | PL_strip_module(term_t raw, module_t *m, term_t plain) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   YAP_Term t =  YAP_StripModule(Yap_GetFromSlot(raw PASS_REGS),(YAP_Term *)m); | 
					
						
							| 
									
										
										
										
											2008-08-01 21:44:25 +00:00
										 |  |  |   if (!t) | 
					
						
							|  |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   Yap_PutInSlot(plain, t PASS_REGS); | 
					
						
							| 
									
										
										
										
											2008-08-01 21:44:25 +00:00
										 |  |  |   return TRUE; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | X_API atom_t PL_module_name(module_t m) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  |   Atom at = AtomOfTerm((Term)m); | 
					
						
							|  |  |  |   WRITE_LOCK(RepAtom(at)->ARWLock);   | 
					
						
							| 
									
										
										
										
											2011-11-16 15:20:21 +00:00
										 |  |  |   Yap_Module(MkAtomTerm(at)); | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  |   WRITE_UNLOCK(RepAtom(at)->ARWLock);   | 
					
						
							|  |  |  |   return AtomToSWIAtom(at); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API predicate_t PL_pred(functor_t f, module_t m) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2008-12-22 12:03:14 +00:00
										 |  |  |   Functor ff = SWIFunctorToFunctor(f); | 
					
						
							| 
									
										
										
										
											2010-01-26 12:21:06 +00:00
										 |  |  |   Term mod = SWIModuleToModule(m); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-22 12:03:14 +00:00
										 |  |  |   if (IsAtomTerm((Term)f)) { | 
					
						
							| 
									
										
										
										
											2010-01-26 12:21:06 +00:00
										 |  |  |     return YAP_Predicate(YAP_AtomOfTerm((Term)f),0,mod); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2010-01-26 12:21:06 +00:00
										 |  |  |     return YAP_Predicate((YAP_Atom)NameOfFunctor(ff),ArityOfFunctor(ff),mod); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API predicate_t PL_predicate(const char *name, int arity, const char *m) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2010-01-26 12:21:06 +00:00
										 |  |  |   Term mod; | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  |   Atom at; | 
					
						
							| 
									
										
										
										
											2010-01-26 12:21:06 +00:00
										 |  |  |   if (m == NULL) { | 
					
						
							|  |  |  |     mod = CurrentModule; | 
					
						
							|  |  |  |     if (!mod) mod = USER_MODULE; | 
					
						
							|  |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  |     Atom at; | 
					
						
							|  |  |  |     while (!(at = Yap_LookupAtom((char *)m))) { | 
					
						
							|  |  |  |       if (!Yap_growheap(FALSE, 0L, NULL)) { | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  | 	Yap_Error(OUT_OF_HEAP_ERROR, TermNil, LOCAL_ErrorMessage); | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  | 	return NULL; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     mod = MkAtomTerm(at); | 
					
						
							| 
									
										
										
										
											2010-01-26 12:21:06 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  |   while (!(at = Yap_LookupAtom((char *)name))) { | 
					
						
							|  |  |  |     if (!Yap_growheap(FALSE, 0L, NULL)) { | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |       Yap_Error(OUT_OF_HEAP_ERROR, TermNil, LOCAL_ErrorMessage); | 
					
						
							| 
									
										
										
										
											2010-05-04 15:03:12 +01:00
										 |  |  |       return NULL; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return YAP_Predicate((YAP_Atom)at, arity, mod); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-10 21:14:38 +00:00
										 |  |  | X_API int PL_unify_predicate(term_t head, predicate_t pred, int how) | 
					
						
							| 
									
										
										
										
											2011-02-10 00:01:19 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2011-02-10 21:14:38 +00:00
										 |  |  |   PredEntry *pe = (PredEntry *)pred; | 
					
						
							|  |  |  |   Term ts[2], nt; | 
					
						
							|  |  |  |   if (!pe->ModuleOfPred) { | 
					
						
							|  |  |  |     ts[0] = pe->ModuleOfPred; | 
					
						
							| 
									
										
										
										
											2011-02-10 00:01:19 +00:00
										 |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2011-02-10 21:14:38 +00:00
										 |  |  |     ts[0] = TermProlog; | 
					
						
							| 
									
										
										
										
											2011-02-10 00:01:19 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2011-02-10 21:14:38 +00:00
										 |  |  |   if (how == GP_NAMEARITY) { | 
					
						
							|  |  |  |     Term nts[2]; | 
					
						
							|  |  |  |     nts[1] = MkIntegerTerm(pe->ArityOfPE); | 
					
						
							|  |  |  |     if (pe->ArityOfPE) { | 
					
						
							|  |  |  |       nts[0] = MkAtomTerm(NameOfFunctor(pe->FunctorOfPred)); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       nts[0] = MkAtomTerm((Atom)pe->FunctorOfPred); | 
					
						
							| 
									
										
										
										
											2011-02-10 00:01:19 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-02-10 21:14:38 +00:00
										 |  |  |     ts[1] = Yap_MkApplTerm(FunctorSlash, 2, nts); | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     if (pe->ArityOfPE) { | 
					
						
							|  |  |  |       ts[1] = Yap_MkNewApplTerm(pe->FunctorOfPred, pe->ArityOfPE); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       ts[1] = MkAtomTerm((Atom)pe->FunctorOfPred); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   nt = Yap_MkApplTerm(FunctorModule, 2, ts); | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   return Yap_unify(Yap_GetFromSlot(head PASS_REGS),nt); | 
					
						
							| 
									
										
										
										
											2011-02-10 00:01:19 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | X_API void PL_predicate_info(predicate_t p,atom_t *name, int *arity, module_t *m) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  |   PredEntry *pd = (PredEntry *)p; | 
					
						
							|  |  |  |   Atom aname; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (pd->ArityOfPE) { | 
					
						
							| 
									
										
										
										
											2011-02-10 00:01:19 +00:00
										 |  |  |     if (arity) | 
					
						
							|  |  |  |       *arity = pd->ArityOfPE; | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  |     aname = NameOfFunctor(pd->FunctorOfPred); | 
					
						
							|  |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2011-02-10 00:01:19 +00:00
										 |  |  |     if (arity) | 
					
						
							|  |  |  |       *arity = 0; | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  |     aname = (Atom)(pd->FunctorOfPred); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2011-02-10 00:01:19 +00:00
										 |  |  |   if (pd->ModuleOfPred && m)  | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  |     *m = (module_t)pd->ModuleOfPred; | 
					
						
							| 
									
										
										
										
											2011-02-10 00:01:19 +00:00
										 |  |  |   else if (m) | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  |     *m = (module_t)TermProlog; | 
					
						
							| 
									
										
										
										
											2011-02-10 00:01:19 +00:00
										 |  |  |   if (name) | 
					
						
							|  |  |  |     *name = AtomToSWIAtom(aname); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-14 06:58:03 -08:00
										 |  |  | #undef S_YREG
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-01 00:40:58 +01:00
										 |  |  | X_API fid_t | 
					
						
							|  |  |  | PL_open_foreign_frame(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2010-06-01 00:40:58 +01:00
										 |  |  |   open_query *new = (open_query *)malloc(sizeof(open_query)); | 
					
						
							|  |  |  |   if (!new) return 0; | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |   new->old = LOCAL_execution; | 
					
						
							| 
									
										
										
										
											2010-06-01 00:40:58 +01:00
										 |  |  |   new->g = TermNil; | 
					
						
							|  |  |  |   new->open = FALSE; | 
					
						
							|  |  |  |   new->cp = CP; | 
					
						
							|  |  |  |   new->p = P; | 
					
						
							| 
									
										
										
										
											2011-03-14 20:54:19 +00:00
										 |  |  |   new->b = (CELL)(LCL0-(CELL*)B); | 
					
						
							| 
									
										
										
										
											2010-06-01 00:40:58 +01:00
										 |  |  |   new->slots = CurSlot; | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |   LOCAL_execution = new; | 
					
						
							| 
									
										
										
										
											2011-02-14 06:58:03 -08:00
										 |  |  |   {  | 
					
						
							|  |  |  |     /* initialise a new marker choicepoint */ | 
					
						
							|  |  |  |     choiceptr cp_b = ((choiceptr)ASP)-1; | 
					
						
							|  |  |  |     cp_b->cp_tr = TR; | 
					
						
							|  |  |  |     cp_b->cp_h = H; | 
					
						
							|  |  |  |     cp_b->cp_b = B; | 
					
						
							|  |  |  |     cp_b->cp_cp = CP; | 
					
						
							|  |  |  |     cp_b->cp_env = ENV; | 
					
						
							|  |  |  |     cp_b->cp_ap = NOCODE; | 
					
						
							|  |  |  |     HB = H; | 
					
						
							|  |  |  |     B = cp_b; | 
					
						
							|  |  |  |     ASP = (CELL *)B; | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |     Yap_StartSlots( PASS_REGS1 ); | 
					
						
							| 
									
										
										
										
											2011-02-14 06:58:03 -08:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2010-06-01 00:40:58 +01:00
										 |  |  |   return (fid_t)new; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API void | 
					
						
							|  |  |  | PL_close_foreign_frame(fid_t f) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2011-02-14 06:58:03 -08:00
										 |  |  |   open_query *env = (open_query *)f; | 
					
						
							|  |  |  |   CP = env->cp; | 
					
						
							|  |  |  |   P = env->p; | 
					
						
							|  |  |  |   CurSlot = env->slots; | 
					
						
							| 
									
										
										
										
											2011-03-14 20:54:19 +00:00
										 |  |  |   B = (choiceptr)(LCL0-env->b); | 
					
						
							|  |  |  |   ASP = (CELL *)(LCL0-CurSlot); | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |   LOCAL_execution = env->old; | 
					
						
							| 
									
										
										
										
											2011-02-14 06:58:03 -08:00
										 |  |  |   free(env); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							|  |  |  | backtrack(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2011-02-14 06:58:03 -08:00
										 |  |  |   P = FAILCODE; | 
					
						
							|  |  |  |   Yap_absmi(0); | 
					
						
							|  |  |  |   H = HB = B->cp_h; | 
					
						
							|  |  |  |   TR = B->cp_tr; | 
					
						
							| 
									
										
										
										
											2010-06-01 00:40:58 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API void | 
					
						
							|  |  |  | PL_rewind_foreign_frame(fid_t f) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2011-02-14 06:58:03 -08:00
										 |  |  |   open_query *env = (open_query *)f; | 
					
						
							|  |  |  |   CurSlot = env->slots; | 
					
						
							| 
									
										
										
										
											2011-03-14 20:54:19 +00:00
										 |  |  |   while (B->cp_b != (choiceptr)(LCL0-env->b)) | 
					
						
							|  |  |  |     B = B->cp_b; | 
					
						
							| 
									
										
										
										
											2011-02-14 06:58:03 -08:00
										 |  |  |   backtrack(); | 
					
						
							| 
									
										
										
										
											2011-03-14 20:54:19 +00:00
										 |  |  |   ASP = (CELL *)B; | 
					
						
							|  |  |  |   Yap_StartSlots( PASS_REGS1 );   | 
					
						
							| 
									
										
										
										
											2010-06-01 00:40:58 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API void | 
					
						
							|  |  |  | PL_discard_foreign_frame(fid_t f) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2011-02-14 06:58:03 -08:00
										 |  |  |   open_query *env = (open_query *)f; | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |   if (LOCAL_execution != env) { | 
					
						
							| 
									
										
										
										
											2011-03-15 16:22:56 +00:00
										 |  |  |     /* handle the case where we do not want to kill the last open frame */  | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |     open_query *env0 = LOCAL_execution; | 
					
						
							| 
									
										
										
										
											2011-03-15 16:22:56 +00:00
										 |  |  |     while (env0 && env0 != env) env0 = env0->old; | 
					
						
							|  |  |  |     if (!env0) | 
					
						
							|  |  |  |       return; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2011-02-14 06:58:03 -08:00
										 |  |  |   CurSlot = env->slots; | 
					
						
							| 
									
										
										
										
											2011-03-14 20:54:19 +00:00
										 |  |  |   while (B->cp_b != (choiceptr)(LCL0-env->b)) | 
					
						
							|  |  |  |     B = B->cp_b; | 
					
						
							| 
									
										
										
										
											2011-02-14 06:58:03 -08:00
										 |  |  |   backtrack(); | 
					
						
							|  |  |  |   CP = env->cp; | 
					
						
							|  |  |  |   P = env->p; | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |   LOCAL_execution = env->old; | 
					
						
							| 
									
										
										
										
											2011-03-14 20:54:19 +00:00
										 |  |  |   ASP = LCL0-CurSlot; | 
					
						
							| 
									
										
										
										
											2011-02-14 06:58:03 -08:00
										 |  |  |   B = B->cp_b; | 
					
						
							|  |  |  |   free(env); | 
					
						
							| 
									
										
										
										
											2010-06-01 00:40:58 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | X_API qid_t PL_open_query(module_t ctx, int flags, predicate_t p, term_t t0) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  |   Atom yname; | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   unsigned long int  arity; | 
					
						
							| 
									
										
										
										
											2010-01-26 12:21:06 +00:00
										 |  |  |   Term t[2], m; | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   /* ignore flags  and module for now */ | 
					
						
							| 
									
										
										
										
											2010-12-14 09:30:40 +00:00
										 |  |  |   PL_open_foreign_frame(); | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |   LOCAL_execution->open=1; | 
					
						
							|  |  |  |   LOCAL_execution->state=0; | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  |   PredicateInfo((PredEntry *)p, &yname, &arity, &m); | 
					
						
							| 
									
										
										
										
											2010-01-26 12:21:06 +00:00
										 |  |  |   t[0] = SWIModuleToModule(ctx); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   if (arity == 0) { | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  |     t[1] = MkAtomTerm(yname); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  |     Functor f = Yap_MkFunctor(yname, arity); | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |     t[1] = Yap_MkApplTerm(f,arity,Yap_AddressFromSlot(t0 PASS_REGS)); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2010-07-19 14:54:21 +01:00
										 |  |  |   if (ctx) { | 
					
						
							|  |  |  |     Term ti; | 
					
						
							|  |  |  |     t[0] = MkAtomTerm((Atom)ctx); | 
					
						
							|  |  |  |     ti = Yap_MkApplTerm(FunctorModule,2,t); | 
					
						
							|  |  |  |     t[0] = ti; | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |     LOCAL_execution->g = Yap_MkApplTerm(FunctorCall,1,t); | 
					
						
							| 
									
										
										
										
											2010-07-19 14:54:21 +01:00
										 |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2010-07-28 17:13:10 +01:00
										 |  |  |     if (m && m != CurrentModule) { | 
					
						
							|  |  |  |       Term ti; | 
					
						
							|  |  |  |       t[0] = m; | 
					
						
							|  |  |  |       ti = Yap_MkApplTerm(FunctorModule,2,t); | 
					
						
							|  |  |  |       t[0] = ti; | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |       LOCAL_execution->g = Yap_MkApplTerm(FunctorCall,1,t); | 
					
						
							| 
									
										
										
										
											2010-07-28 17:13:10 +01:00
										 |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |       LOCAL_execution->g = t[1]; | 
					
						
							| 
									
										
										
										
											2010-07-28 17:13:10 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-07-19 14:54:21 +01:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |   return LOCAL_execution; | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API int PL_next_solution(qid_t qi) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   int result; | 
					
						
							|  |  |  |   if (qi->open != 1) return 0; | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |   if (setjmp(LOCAL_execution->env)) | 
					
						
							| 
									
										
										
										
											2010-06-17 00:34:29 +01:00
										 |  |  |     return 0; | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   if (qi->state == 0) { | 
					
						
							|  |  |  |     result = YAP_RunGoal(qi->g); | 
					
						
							|  |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |     LOCAL_AllowRestart = qi->open; | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |     result = YAP_RestartGoal(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   qi->state = 1; | 
					
						
							|  |  |  |   if (result == 0) { | 
					
						
							|  |  |  |     qi->open = 0; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return result; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API void PL_cut_query(qid_t qi) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-01-26 12:21:06 +00:00
										 |  |  |   if (qi->open != 1) return; | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   YAP_PruneGoal(); | 
					
						
							| 
									
										
										
										
											2010-04-23 16:43:29 +01:00
										 |  |  |   YAP_cut_up(); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   qi->open = 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API void PL_close_query(qid_t qi) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   /* need to implement backtracking here */ | 
					
						
							|  |  |  |   if (qi->open != 1) | 
					
						
							|  |  |  |     return; | 
					
						
							|  |  |  |   YAP_PruneGoal(); | 
					
						
							|  |  |  |   YAP_RestartGoal(); | 
					
						
							|  |  |  |   qi->open = 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API int PL_call_predicate(module_t ctx, int flags, predicate_t p, term_t t0) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   qid_t qi = PL_open_query(ctx, flags, p, t0); | 
					
						
							|  |  |  |   int ret = PL_next_solution(qi); | 
					
						
							| 
									
										
										
										
											2010-04-23 16:43:29 +01:00
										 |  |  |   PL_cut_query(qi); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   return ret; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-23 16:50:43 +01:00
										 |  |  | X_API int PL_toplevel(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   return YAP_RunGoal(MkAtomTerm(Yap_FullLookupAtom("$live"))); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | X_API int PL_call(term_t tp, module_t m) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2010-01-26 12:21:06 +00:00
										 |  |  |   int out; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   BACKUP_B(); | 
					
						
							|  |  |  |   BACKUP_H(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Term t[2], g; | 
					
						
							|  |  |  |   t[0] = SWIModuleToModule(m); | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   t[1] = Yap_GetFromSlot(tp PASS_REGS); | 
					
						
							| 
									
										
										
										
											2010-01-26 12:21:06 +00:00
										 |  |  |   g = Yap_MkApplTerm(FunctorModule,2,t); | 
					
						
							|  |  |  |   out =  YAP_RunGoal(g); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   RECOVER_H(); | 
					
						
							|  |  |  |   RECOVER_B(); | 
					
						
							|  |  |  |   return out; | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-06 12:19:51 +01:00
										 |  |  | X_API void PL_register_foreign_in_module(const char *module, const char *name, int arity, pl_function_t function, int flags) | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2009-03-13 19:40:27 +00:00
										 |  |  |   Term tmod; | 
					
						
							| 
									
										
										
										
											2009-06-01 21:49:24 -05:00
										 |  |  |   Int nflags = 0; | 
					
						
							| 
									
										
										
										
											2009-04-14 01:25:21 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-26 15:45:42 +00:00
										 |  |  | #ifdef DEBUG
 | 
					
						
							| 
									
										
										
										
											2009-06-01 15:38:39 -05:00
										 |  |  |   if (flags & (PL_FA_NOTRACE|PL_FA_CREF)) { | 
					
						
							| 
									
										
										
										
											2009-03-13 19:40:27 +00:00
										 |  |  |     fprintf(stderr,"PL_register_foreign_in_module called with non-implemented flag %x when creating predicate %s:%s/%d\n", flags, module, name, arity); | 
					
						
							|  |  |  |   }       | 
					
						
							| 
									
										
										
										
											2011-03-26 15:45:42 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2009-03-13 19:40:27 +00:00
										 |  |  |   if (module == NULL) { | 
					
						
							|  |  |  |     tmod = CurrentModule; | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     tmod = MkAtomTerm(Yap_LookupAtom((char *)module)); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2009-06-01 21:49:24 -05:00
										 |  |  |   if (flags & PL_FA_VARARGS) {  | 
					
						
							|  |  |  |     nflags = SWIEnvPredFlag; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (flags & PL_FA_TRANSPARENT) { | 
					
						
							|  |  |  |     nflags |= ModuleTransparentPredFlag; | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     nflags |= CArgsPredFlag; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (flags & PL_FA_NONDETERMINISTIC) { | 
					
						
							| 
									
										
										
										
											2010-01-15 16:21:43 +00:00
										 |  |  |     Yap_InitCPredBackCut((char *)name, arity, sizeof(struct foreign_context)/sizeof(CELL), (CPredicate)function, (CPredicate)function, (CPredicate)function, UserCPredFlag|nflags); | 
					
						
							| 
									
										
										
										
											2009-06-01 21:49:24 -05:00
										 |  |  |   } else { | 
					
						
							|  |  |  |     UserCPredicate((char *)name,(CPredicate)function,arity,tmod,nflags); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-23 16:50:43 +01:00
										 |  |  | X_API void PL_register_extensions(const PL_extension *ptr) | 
					
						
							| 
									
										
										
										
											2008-02-12 17:03:59 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-02-03 11:23:12 +00:00
										 |  |  |   // implemented as register foreign
 | 
					
						
							|  |  |  |   // may cause problems during initialization?
 | 
					
						
							| 
									
										
										
										
											2009-06-01 21:49:24 -05:00
										 |  |  |   PL_load_extensions(ptr); | 
					
						
							| 
									
										
										
										
											2008-02-12 17:03:59 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-03 11:23:12 +00:00
										 |  |  | X_API void | 
					
						
							|  |  |  | PL_register_extensions_in_module(const char *module, const PL_extension *e) | 
					
						
							|  |  |  | {  | 
					
						
							|  |  |  |   // implemented as register foreign
 | 
					
						
							|  |  |  |   /* ignore flags for now */ | 
					
						
							|  |  |  |   while(e->predicate_name != NULL) { | 
					
						
							|  |  |  |     PL_register_foreign_in_module(module, e->predicate_name, e->arity, e->function, e->flags); | 
					
						
							|  |  |  |     e++; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-06 12:19:51 +01:00
										 |  |  | X_API void PL_register_foreign(const char *name, int arity, pl_function_t function, int flags) | 
					
						
							| 
									
										
										
										
											2010-01-25 12:29:51 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   PL_register_foreign_in_module(NULL, name, arity, function, flags); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-23 16:50:43 +01:00
										 |  |  | X_API void PL_load_extensions(const PL_extension *ptr) | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   /* ignore flags for now */ | 
					
						
							|  |  |  |   while(ptr->predicate_name != NULL) { | 
					
						
							| 
									
										
										
										
											2009-06-01 21:49:24 -05:00
										 |  |  |     PL_register_foreign_in_module(NULL, ptr->predicate_name, ptr->arity, ptr->function, ptr->flags); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |     ptr++; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  | X_API  int PL_is_inf(term_t st) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   Term t = Deref(Yap_GetFromSlot(st PASS_REGS)); | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  |   Float fl; | 
					
						
							|  |  |  |   if (IsVarTerm(t)) return FALSE; | 
					
						
							|  |  |  |   if (!IsFloatTerm(t)) return FALSE; | 
					
						
							|  |  |  |   fl = FloatOfTerm(t); | 
					
						
							| 
									
										
										
										
											2009-06-15 14:58:57 -05:00
										 |  |  | #if HAVE_ISINF
 | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  |   return isinf(fl); | 
					
						
							| 
									
										
										
										
											2009-06-15 14:58:57 -05:00
										 |  |  | #elif HAVE_FPCLASS
 | 
					
						
							|  |  |  |   return (fpclass(fl) == FP_NINF || fpclass(fl) == FP_PINF); | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |   return FALSE; | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | X_API int PL_thread_self(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2010-07-23 15:54:13 +01:00
										 |  |  | #if THREADS
 | 
					
						
							|  |  |  |   if (pthread_getspecific(Yap_yaamregs_key) == NULL) | 
					
						
							|  |  |  |     return -1; | 
					
						
							|  |  |  |   return worker_id; | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |   return -2; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API int PL_unify_thread_id(term_t t, int i) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2010-07-23 15:54:13 +01:00
										 |  |  |   Term iterm = MkIntegerTerm(i); | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   return Yap_unify(Yap_GetFromSlot(t PASS_REGS),iterm); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-23 15:54:13 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | X_API int PL_thread_attach_engine(const PL_thread_attr_t *attr) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-07-23 15:54:13 +01:00
										 |  |  |   int wid = PL_thread_self(); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |    | 
					
						
							|  |  |  |   if (wid < 0) { | 
					
						
							|  |  |  |     /* we do not have an engine */ | 
					
						
							|  |  |  |     if (attr) { | 
					
						
							|  |  |  |       YAP_thread_attr yapt; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       yapt.ssize = attr->local_size; | 
					
						
							|  |  |  |       yapt.tsize = attr->global_size; | 
					
						
							|  |  |  |       yapt.alias = (YAP_Term)attr->alias; | 
					
						
							|  |  |  |       yapt.cancel =  attr->cancel; | 
					
						
							|  |  |  |       wid = YAP_ThreadCreateEngine(&yapt); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       wid = YAP_ThreadCreateEngine(NULL); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if (wid < 0) | 
					
						
							|  |  |  |       return -1; | 
					
						
							|  |  |  |     if (YAP_ThreadAttachEngine(wid)) { | 
					
						
							|  |  |  |       return wid; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return -1; | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     /* attach myself again */ | 
					
						
							| 
									
										
										
										
											2010-07-23 15:54:13 +01:00
										 |  |  |     return YAP_ThreadAttachEngine(wid); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API int PL_thread_destroy_engine(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-07-23 15:54:13 +01:00
										 |  |  |   int wid = PL_thread_self(); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   if (wid < 0) { | 
					
						
							|  |  |  |     /* we do not have an engine */ | 
					
						
							|  |  |  |     return FALSE; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   YAP_ThreadDetachEngine(wid); | 
					
						
							|  |  |  |   return YAP_ThreadDestroyEngine(wid); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API int | 
					
						
							|  |  |  | PL_thread_at_exit(void (*function)(void *), void *closure, int global) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   /* don't do nothing for now */ | 
					
						
							|  |  |  |   fprintf(stderr,"%% YAP ERROR: PL_thread_at_exit not implemented yet\n"); | 
					
						
							|  |  |  |   return TRUE; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API PL_engine_t | 
					
						
							|  |  |  | PL_create_engine(const PL_thread_attr_t *attr) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-07-25 11:19:07 +01:00
										 |  |  | #if THREADS
 | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   if (attr) { | 
					
						
							|  |  |  |     YAP_thread_attr yapt; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     yapt.ssize = attr->local_size; | 
					
						
							|  |  |  |     yapt.tsize = attr->global_size; | 
					
						
							|  |  |  |     yapt.alias = (YAP_Term)attr->alias; | 
					
						
							|  |  |  |     yapt.cancel =  attr->cancel; | 
					
						
							| 
									
										
										
										
											2011-05-09 19:36:51 +01:00
										 |  |  |     return  Yap_local+YAP_ThreadCreateEngine(&yapt); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2011-05-09 19:36:51 +01:00
										 |  |  |     return Yap_local+YAP_ThreadCreateEngine(NULL); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2010-07-25 11:19:07 +01:00
										 |  |  | #else
 | 
					
						
							|  |  |  |   return NULL; | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API int | 
					
						
							|  |  |  | PL_destroy_engine(PL_engine_t e) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-07-25 11:19:07 +01:00
										 |  |  | #if THREADS
 | 
					
						
							| 
									
										
										
										
											2011-05-11 18:22:58 +01:00
										 |  |  |   return YAP_ThreadDestroyEngine(((struct worker_local *)e)->ThreadHandle_.current_yaam_regs->worker_id_); | 
					
						
							| 
									
										
										
										
											2010-07-25 11:19:07 +01:00
										 |  |  | #else
 | 
					
						
							|  |  |  |   return FALSE; | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API int | 
					
						
							|  |  |  | PL_set_engine(PL_engine_t engine, PL_engine_t *old) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2010-07-25 11:19:07 +01:00
										 |  |  | #if THREADS
 | 
					
						
							| 
									
										
										
										
											2010-07-23 15:54:13 +01:00
										 |  |  |   int cwid = PL_thread_self(), nwid; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (cwid >= 0) { | 
					
						
							| 
									
										
										
										
											2011-05-09 19:36:51 +01:00
										 |  |  |     if (old) *old = (PL_engine_t)(Yap_local[cwid]); | 
					
						
							| 
									
										
										
										
											2010-07-23 15:54:13 +01:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2010-07-25 11:19:07 +01:00
										 |  |  |   if (!engine) { | 
					
						
							|  |  |  |     if (cwid < 0) | 
					
						
							|  |  |  |       return PL_ENGINE_INVAL; | 
					
						
							|  |  |  |     if (!YAP_ThreadDetachEngine(worker_id)) { | 
					
						
							|  |  |  |       return PL_ENGINE_INVAL; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return PL_ENGINE_SET; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2010-07-23 15:54:13 +01:00
										 |  |  |   if (engine == PL_ENGINE_MAIN) { | 
					
						
							|  |  |  |     nwid = 0; | 
					
						
							|  |  |  |   } else if (engine == PL_ENGINE_CURRENT) { | 
					
						
							| 
									
										
										
										
											2010-07-25 11:19:07 +01:00
										 |  |  |     if (cwid < 0) { | 
					
						
							|  |  |  |       if (old) *old = NULL; | 
					
						
							| 
									
										
										
										
											2010-07-23 15:54:13 +01:00
										 |  |  |       return PL_ENGINE_INVAL; | 
					
						
							| 
									
										
										
										
											2010-07-25 11:19:07 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-07-23 15:54:13 +01:00
										 |  |  |     return PL_ENGINE_SET; | 
					
						
							| 
									
										
										
										
											2010-07-25 11:19:07 +01:00
										 |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2011-05-11 18:22:58 +01:00
										 |  |  |     nwid = ((struct worker_local *)engine)->ThreadHandle_.current_yaam_regs->worker_id_; | 
					
						
							| 
									
										
										
										
											2010-07-23 12:07:33 +01:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2010-07-25 11:19:07 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-09 20:19:49 +01:00
										 |  |  |   pthread_mutex_lock(&(REMOTE_ThreadHandle(nwid).tlock)); | 
					
						
							|  |  |  |   if (REMOTE_ThreadHandle(nwid).pthread_handle) { | 
					
						
							|  |  |  |     pthread_mutex_unlock(&(REMOTE_ThreadHandle(nwid).tlock)); | 
					
						
							| 
									
										
										
										
											2010-07-25 11:19:07 +01:00
										 |  |  |     if (cwid != nwid) { | 
					
						
							| 
									
										
										
										
											2010-07-23 15:54:13 +01:00
										 |  |  |       return PL_ENGINE_INUSE; | 
					
						
							| 
									
										
										
										
											2010-07-25 11:19:07 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |     return PL_ENGINE_SET; | 
					
						
							| 
									
										
										
										
											2010-07-23 15:54:13 +01:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2010-07-25 11:19:07 +01:00
										 |  |  |   if (cwid >= 0) { | 
					
						
							|  |  |  |     if (!YAP_ThreadDetachEngine(cwid)) { | 
					
						
							|  |  |  |       *old = NULL; | 
					
						
							| 
									
										
										
										
											2011-05-09 20:19:49 +01:00
										 |  |  |       pthread_mutex_unlock(&(REMOTE_ThreadHandle(nwid).tlock)); | 
					
						
							| 
									
										
										
										
											2010-07-23 15:54:13 +01:00
										 |  |  |       return PL_ENGINE_INVAL; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (!YAP_ThreadAttachEngine(nwid)) { | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  |     return PL_ENGINE_INVAL; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return PL_ENGINE_SET; | 
					
						
							| 
									
										
										
										
											2010-07-25 11:19:07 +01:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2011-05-09 19:36:51 +01:00
										 |  |  |   if (old) *old = (PL_engine_t)&Yap_local; | 
					
						
							| 
									
										
										
										
											2010-07-25 11:19:07 +01:00
										 |  |  |   return FALSE; | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-12 17:03:59 +00:00
										 |  |  | X_API void * | 
					
						
							| 
									
										
										
										
											2010-11-24 08:44:03 +00:00
										 |  |  | PL_malloc(size_t sz) | 
					
						
							| 
									
										
										
										
											2008-02-12 17:03:59 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-11-24 08:44:03 +00:00
										 |  |  |   if ( sz == 0 ) | 
					
						
							|  |  |  |     return NULL; | 
					
						
							|  |  |  |   return (void *)malloc((long unsigned int)sz); | 
					
						
							| 
									
										
										
										
											2008-02-12 17:03:59 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-19 21:09:22 +00:00
										 |  |  | X_API void * | 
					
						
							| 
									
										
										
										
											2010-11-24 08:44:03 +00:00
										 |  |  | PL_realloc(void *ptr, size_t sz) | 
					
						
							| 
									
										
										
										
											2009-11-19 21:09:22 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-11-24 08:44:03 +00:00
										 |  |  |   if (ptr) { | 
					
						
							|  |  |  |     if (sz) { | 
					
						
							|  |  |  |       return realloc((char *)ptr,(long unsigned int)sz); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       free(ptr); | 
					
						
							|  |  |  |       return NULL; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     return PL_malloc(sz); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2009-11-19 21:09:22 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-12 17:03:59 +00:00
										 |  |  | X_API void | 
					
						
							|  |  |  | PL_free(void *obj) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-11-24 08:44:03 +00:00
										 |  |  |   if (obj) | 
					
						
							|  |  |  |     free(obj); | 
					
						
							| 
									
										
										
										
											2008-02-12 17:03:59 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-01 18:01:30 -05:00
										 |  |  | X_API int | 
					
						
							| 
									
										
										
										
											2009-07-18 13:38:38 -07:00
										 |  |  | PL_eval_expression_to_int64_ex(term_t t, int64_t *val) | 
					
						
							| 
									
										
										
										
											2009-06-01 18:01:30 -05:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   Term res = Yap_Eval(Yap_GetFromSlot(t PASS_REGS)); | 
					
						
							| 
									
										
										
										
											2009-06-01 18:01:30 -05:00
										 |  |  |   if (!res) { | 
					
						
							|  |  |  |     return FALSE; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (IsIntegerTerm(res)) { | 
					
						
							|  |  |  |     *val = IntegerOfTerm(res); | 
					
						
							|  |  |  |     return TRUE; | 
					
						
							| 
									
										
										
										
											2009-06-03 20:21:45 -05:00
										 |  |  | #if  SIZEOF_LONG_INT==4 && USE_GMP
 | 
					
						
							| 
									
										
										
										
											2009-06-01 18:01:30 -05:00
										 |  |  |   } else if (YAP_IsBigNumTerm(res)) { | 
					
						
							|  |  |  |     MP_INT g; | 
					
						
							|  |  |  |     char s[64]; | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     YAP_BigNumOfTerm(t, (void *)&g); | 
					
						
							|  |  |  |     if (mpz_sizeinbase(&g,2) > 64) { | 
					
						
							|  |  |  |       return PL_error(NULL,0,NULL, ERR_EVALUATION, AtomToSWIAtom(Yap_LookupAtom("int_overflow"))); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     mpz_get_str (s, 10, &g); | 
					
						
							| 
									
										
										
										
											2010-02-10 03:03:03 -06:00
										 |  |  | #ifdef _WIN32
 | 
					
						
							|  |  |  |     sscanf(s, "%I64d", (long long int *)val); | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2009-06-01 18:01:30 -05:00
										 |  |  |     sscanf(s, "%lld", (long long int *)val); | 
					
						
							| 
									
										
										
										
											2010-02-10 03:03:03 -06:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2009-06-01 18:01:30 -05:00
										 |  |  |     return 1; | 
					
						
							| 
									
										
										
										
											2009-06-03 20:21:45 -05:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2009-06-04 10:21:24 -05:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2009-06-01 18:01:30 -05:00
										 |  |  |   PL_error(NULL,0,NULL, ERR_TYPE, AtomToSWIAtom(Yap_LookupAtom("integer_expression"))); | 
					
						
							|  |  |  |   return FALSE; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-06 11:25:15 -02:00
										 |  |  | foreign_t | 
					
						
							| 
									
										
										
										
											2011-03-15 23:49:28 +00:00
										 |  |  | _PL_retry(intptr_t v) | 
					
						
							| 
									
										
										
										
											2010-01-06 11:25:15 -02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-15 23:49:28 +00:00
										 |  |  |   return (((uintptr_t)(v)<<FRG_REDO_BITS)|REDO_INT); | 
					
						
							| 
									
										
										
										
											2010-01-06 11:25:15 -02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | foreign_t | 
					
						
							|  |  |  | _PL_retry_address(void *addr) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-15 23:49:28 +00:00
										 |  |  |   return (((uintptr_t)(addr))|REDO_PTR); | 
					
						
							| 
									
										
										
										
											2010-01-06 11:25:15 -02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-17 00:34:29 +01:00
										 |  |  | X_API int | 
					
						
							| 
									
										
										
										
											2010-01-06 11:25:15 -02:00
										 |  |  | PL_foreign_control(control_t ctx) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   switch (ctx->control) { | 
					
						
							|  |  |  |   case FRG_REDO: | 
					
						
							|  |  |  |     return PL_REDO; | 
					
						
							|  |  |  |   case FRG_FIRST_CALL: | 
					
						
							|  |  |  |     return PL_FIRST_CALL; | 
					
						
							|  |  |  |   default: | 
					
						
							|  |  |  |     return PL_CUTTED; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-17 00:34:29 +01:00
										 |  |  | X_API intptr_t | 
					
						
							| 
									
										
										
										
											2010-01-06 11:25:15 -02:00
										 |  |  | PL_foreign_context(control_t ctx) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   switch (ctx->control) { | 
					
						
							|  |  |  |   case FRG_FIRST_CALL: | 
					
						
							|  |  |  |     return 0L; | 
					
						
							|  |  |  |   default: | 
					
						
							|  |  |  |     return (intptr_t)(ctx->context); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-17 00:34:29 +01:00
										 |  |  | X_API void * | 
					
						
							| 
									
										
										
										
											2010-01-06 11:25:15 -02:00
										 |  |  | PL_foreign_context_address(control_t ctx) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   switch (ctx->control) { | 
					
						
							|  |  |  |   case FRG_FIRST_CALL: | 
					
						
							|  |  |  |     return NULL; | 
					
						
							|  |  |  |   default: | 
					
						
							|  |  |  |     return (void *)(ctx->context); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-17 00:34:29 +01:00
										 |  |  | X_API int | 
					
						
							|  |  |  | PL_get_signum_ex(term_t sig, int *n) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   char *s; | 
					
						
							|  |  |  |   int i = -1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if ( PL_get_integer(sig, &i) ) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |   } else if ( PL_get_chars(sig, &s, CVT_ATOM) ) | 
					
						
							|  |  |  |   { i = Yap_signal_index(s); | 
					
						
							|  |  |  |   } else | 
					
						
							|  |  |  |   { return PL_error(NULL, 0, NULL, ERR_TYPE, ATOM_signal, sig); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if ( i > 0 && i < 32 )		/* where to get these? */ | 
					
						
							|  |  |  |   { *n = i; | 
					
						
							|  |  |  |     return TRUE; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return PL_error(NULL, 0, NULL, ERR_DOMAIN, ATOM_signal, sig); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2008-07-24 16:02:04 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-17 00:34:29 +01:00
										 |  |  | typedef struct blob { | 
					
						
							|  |  |  |   Functor f; | 
					
						
							|  |  |  |   CELL type; | 
					
						
							|  |  |  |   MP_INT blinfo;  /* total size should go here */ | 
					
						
							|  |  |  |   PL_blob_t *blb; | 
					
						
							|  |  |  |   size_t size; | 
					
						
							|  |  |  |   CELL  blob_data[1]; | 
					
						
							|  |  |  | } blob_t; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-15 23:35:37 +01:00
										 |  |  | X_API intptr_t | 
					
						
							|  |  |  | PL_query(int query) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   switch(query) { | 
					
						
							|  |  |  |   case PL_QUERY_ARGC: | 
					
						
							| 
									
										
										
										
											2011-05-25 16:40:36 +01:00
										 |  |  |     return (intptr_t)GLOBAL_argc; | 
					
						
							| 
									
										
										
										
											2010-07-15 23:35:37 +01:00
										 |  |  |   case PL_QUERY_ARGV: | 
					
						
							| 
									
										
										
										
											2011-05-25 16:40:36 +01:00
										 |  |  |     return (intptr_t)GLOBAL_argv; | 
					
						
							| 
									
										
										
										
											2010-07-15 23:35:37 +01:00
										 |  |  |   case PL_QUERY_USER_CPU: | 
					
						
							|  |  |  |     return (intptr_t)Yap_cputime(); | 
					
						
							| 
									
										
										
										
											2011-03-11 19:49:32 +00:00
										 |  |  |   case PL_QUERY_VERSION: | 
					
						
							| 
									
										
										
										
											2011-07-26 23:32:38 +01:00
										 |  |  |     return (intptr_t)60300; | 
					
						
							| 
									
										
										
										
											2010-07-15 23:35:37 +01:00
										 |  |  |   default: | 
					
						
							|  |  |  |     fprintf(stderr,"Unimplemented PL_query %d\n",query); | 
					
						
							|  |  |  |     return (intptr_t)0; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | }   | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-17 00:34:29 +01:00
										 |  |  | X_API void (*PL_signal(int sig, void (*func)(int)))(int) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   //  return Yap_signal2(sig,func);
 | 
					
						
							|  |  |  |   return NULL; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API void PL_on_halt(void (*f)(int, void *), void *closure) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-09-24 14:00:53 +01:00
										 |  |  |   Yap_HaltRegisterHook((HaltHookFunc)f,closure); | 
					
						
							| 
									
										
										
										
											2010-06-17 00:34:29 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-03 11:23:12 +00:00
										 |  |  | X_API char *PL_atom_generator(const char *prefix, int state) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   return NULL; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | X_API pl_wchar_t *PL_atom_generator_w(const pl_wchar_t *pref, pl_wchar_t *buffer, size_t buflen, int state) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   return NULL; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-11 19:01:18 +00:00
										 |  |  | const char *Yap_GetCurrentPredName(void); | 
					
						
							|  |  |  | Int Yap_GetCurrentPredArity(void); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const char * | 
					
						
							|  |  |  | Yap_GetCurrentPredName(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2011-02-11 19:01:18 +00:00
										 |  |  |   if (!PP) | 
					
						
							|  |  |  |     return NULL; | 
					
						
							|  |  |  |   if (PP->ArityOfPE) | 
					
						
							|  |  |  |     return NameOfFunctor(PP->FunctorOfPred)->StrOfAE; | 
					
						
							|  |  |  |   return   RepAtom((Atom)(PP->FunctorOfPred))->StrOfAE; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Int | 
					
						
							|  |  |  | Yap_GetCurrentPredArity(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2011-02-11 19:01:18 +00:00
										 |  |  |   if (!PP) | 
					
						
							|  |  |  |     return (Int)0; | 
					
						
							|  |  |  |   return PP->ArityOfPE; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2011-02-03 11:23:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | void | 
					
						
							| 
									
										
										
										
											2007-10-18 08:24:16 +00:00
										 |  |  | Yap_swi_install(void) | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-11-29 23:17:06 +00:00
										 |  |  |   Yap_install_blobs(); | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-26 18:34:44 -08:00
										 |  |  | int Yap_read_term(term_t t, IOSTREAM *st, term_t *excep, term_t vs); | 
					
						
							| 
									
										
										
										
											2011-02-12 18:42:44 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | int | 
					
						
							| 
									
										
										
										
											2011-02-26 18:34:44 -08:00
										 |  |  | Yap_read_term(term_t t, IOSTREAM *st, term_t *excep, term_t vs) | 
					
						
							| 
									
										
										
										
											2011-02-12 18:42:44 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2011-02-12 18:42:44 +00:00
										 |  |  |   Term varnames, out, tpos; | 
					
						
							| 
									
										
										
										
											2011-02-26 18:34:44 -08:00
										 |  |  |   Term error; | 
					
						
							| 
									
										
										
										
											2011-02-12 18:42:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-26 18:34:44 -08:00
										 |  |  |   if (!Yap_readTerm(st, &out, &varnames, &error, &tpos)) { | 
					
						
							|  |  |  |     if (excep) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       *excep = Yap_InitSlot(error PASS_REGS); | 
					
						
							| 
									
										
										
										
											2011-02-26 18:34:44 -08:00
										 |  |  |     } | 
					
						
							|  |  |  |     return FALSE; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (!out) { | 
					
						
							|  |  |  |     if (excep) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       *excep = Yap_InitSlot(error PASS_REGS); | 
					
						
							| 
									
										
										
										
											2011-02-26 18:34:44 -08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-02-12 18:42:44 +00:00
										 |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2011-02-26 18:34:44 -08:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   if (!Yap_unify(out, Yap_GetFromSlot(t PASS_REGS))) { | 
					
						
							| 
									
										
										
										
											2011-02-12 18:42:44 +00:00
										 |  |  |     return FALSE; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   if (!Yap_unify(varnames, Yap_GetFromSlot(vs PASS_REGS))) { | 
					
						
							| 
									
										
										
										
											2011-02-12 18:42:44 +00:00
										 |  |  |     return FALSE; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return TRUE; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Term | 
					
						
							|  |  |  | Yap_TermToString(Term t, char *s, unsigned int sz, int flags) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2011-02-12 18:42:44 +00:00
										 |  |  |   IOSTREAM *stream = Sopen_string(NULL, s, sz, "w"); | 
					
						
							| 
									
										
										
										
											2011-02-15 05:54:19 -08:00
										 |  |  |   int out; | 
					
						
							| 
									
										
										
										
											2011-02-12 18:42:44 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   if (!stream) | 
					
						
							|  |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   Yap_StartSlots( PASS_REGS1 ); | 
					
						
							|  |  |  |   out = PL_write_term(stream, Yap_InitSlot(t PASS_REGS), 1200, 0); | 
					
						
							|  |  |  |   Yap_CloseSlots( PASS_REGS1 ); | 
					
						
							| 
									
										
										
										
											2011-02-15 05:54:19 -08:00
										 |  |  |   Sclose(stream); | 
					
						
							|  |  |  |   return out; | 
					
						
							| 
									
										
										
										
											2011-02-12 18:42:44 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-15 06:43:28 -08:00
										 |  |  | extern atom_t 		fileNameStream(IOSTREAM *s); | 
					
						
							|  |  |  | extern Atom 		Yap_FileName(IOSTREAM *s); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-14 23:39:27 -08:00
										 |  |  | Atom  | 
					
						
							|  |  |  | Yap_FileName(IOSTREAM *s) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   atom_t a = fileNameStream(s); | 
					
						
							| 
									
										
										
										
											2011-02-26 18:34:44 -08:00
										 |  |  |   if (!a) { | 
					
						
							|  |  |  |     return AtomEmptyAtom; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2011-02-14 23:39:27 -08:00
										 |  |  |   return SWIAtomToAtom(a); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-15 06:43:28 -08:00
										 |  |  | extern void closeFiles(int); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void | 
					
						
							|  |  |  | Yap_CloseStreams(int loud) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   closeFiles(FALSE); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-15 18:14:18 +00:00
										 |  |  | Int Yap_StreamToFileNo(Term t) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2011-02-15 06:43:28 -08:00
										 |  |  |   IOSTREAM *s; | 
					
						
							|  |  |  |   int rc; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   if ( (rc=PL_get_stream_handle(Yap_InitSlot(t PASS_REGS), &s)) ) { | 
					
						
							| 
									
										
										
										
											2011-02-15 06:43:28 -08:00
										 |  |  |     return Sfileno(s); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return -1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | FILE *Yap_FileDescriptorFromStream(Term t) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2011-02-15 06:43:28 -08:00
										 |  |  |   IOSTREAM *s; | 
					
						
							|  |  |  |   int rc; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   if ( (rc=PL_get_stream_handle(Yap_InitSlot(t PASS_REGS), &s)) ) { | 
					
						
							| 
									
										
										
										
											2011-02-15 06:43:28 -08:00
										 |  |  |     fprintf(stderr,"Unimplemented\n"); | 
					
						
							|  |  |  |     //    return Sfileno(s);
 | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2011-02-15 18:14:18 +00:00
										 |  |  |   return NULL; | 
					
						
							| 
									
										
										
										
											2011-02-15 06:43:28 -08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-27 15:06:10 -08:00
										 |  |  | #if THREADS
 | 
					
						
							|  |  |  | void Yap_LockStream(IOSTREAM *s) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   if ( s->mutex ) recursiveMutexLock(s->mutex); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void Yap_UnLockStream(IOSTREAM *s) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   if ( s->mutex ) recursiveMutexUnlock(s->mutex); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-27 03:40:27 -08:00
										 |  |  | extern term_t Yap_CvtTerm(term_t ts); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | term_t Yap_CvtTerm(term_t ts) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   Term t = Yap_GetFromSlot(ts PASS_REGS); | 
					
						
							| 
									
										
										
										
											2011-02-27 03:40:27 -08:00
										 |  |  |   if (IsVarTerm(t)) return ts; | 
					
						
							|  |  |  |   if (IsPairTerm(t)) return ts; | 
					
						
							|  |  |  |   if (IsAtomTerm(t)) return ts; | 
					
						
							|  |  |  |   if (IsIntTerm(t)) return ts; | 
					
						
							|  |  |  |   if (IsApplTerm(t)) { | 
					
						
							|  |  |  |     Functor f = FunctorOfTerm(t); | 
					
						
							|  |  |  |     if (IsExtensionFunctor(f)) { | 
					
						
							|  |  |  |       if (f == FunctorBigInt) { | 
					
						
							|  |  |  | 	big_blob_type flag = RepAppl(t)[1]; | 
					
						
							|  |  |  | 	switch (flag) { | 
					
						
							|  |  |  | 	case BIG_INT: | 
					
						
							|  |  |  | 	  return ts; | 
					
						
							|  |  |  | 	case BIG_RATIONAL: | 
					
						
							|  |  |  | #if USE_GMP
 | 
					
						
							|  |  |  | 	  { | 
					
						
							|  |  |  | 	    MP_RAT *b = Yap_BigRatOfTerm(t); | 
					
						
							|  |  |  | 	    Term ta[2]; | 
					
						
							|  |  |  | 	    ta[0] = Yap_MkBigIntTerm(mpq_numref(b)); | 
					
						
							|  |  |  | 	    if (ta[0] == TermNil) | 
					
						
							|  |  |  | 	      return ts; | 
					
						
							|  |  |  | 	    ta[1] = Yap_MkBigIntTerm(mpq_denref(b)); | 
					
						
							|  |  |  | 	    if (ta[1] == TermNil) | 
					
						
							|  |  |  | 	      return ts; | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | 	    return Yap_InitSlot(Yap_MkApplTerm(FunctorRDiv, 2, ta) PASS_REGS); | 
					
						
							| 
									
										
										
										
											2011-02-27 03:40:27 -08:00
										 |  |  | 	  } | 
					
						
							|  |  |  | #endif	  
 | 
					
						
							|  |  |  | 	case EMPTY_ARENA: | 
					
						
							|  |  |  | 	case ARRAY_INT: | 
					
						
							|  |  |  | 	case ARRAY_FLOAT: | 
					
						
							|  |  |  | 	case CLAUSE_LIST: | 
					
						
							|  |  |  | 	case EXTERNAL_BLOB: | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | 	  return Yap_InitSlot(MkIntTerm(0) PASS_REGS); | 
					
						
							| 
									
										
										
										
											2011-02-27 03:40:27 -08:00
										 |  |  | 	default: | 
					
						
							|  |  |  | 	  return ts; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2011-03-11 19:49:32 +00:00
										 |  |  |       } else if (f == FunctorDBRef) { | 
					
						
							|  |  |  | 	Term ta[0]; | 
					
						
							| 
									
										
										
										
											2011-03-14 20:54:19 +00:00
										 |  |  | 	ta[0] = MkIntegerTerm((Int)DBRefOfTerm(t)); | 
					
						
							| 
									
										
										
										
											2011-03-11 19:49:32 +00:00
										 |  |  | 	return Yap_InitSlot(Yap_MkApplTerm(FunctorDBREF, 1, ta) PASS_REGS);	 | 
					
						
							| 
									
										
										
										
											2011-02-27 03:40:27 -08:00
										 |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return ts; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-10 09:44:28 +00:00
										 |  |  | #ifdef _WIN32
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <windows.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int WINAPI PROTO(win_yap2swi, (HANDLE, DWORD, LPVOID)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int WINAPI win_yap2swi(HANDLE hinst, DWORD reason, LPVOID reserved) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   switch (reason)  | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     case DLL_PROCESS_ATTACH: | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     case DLL_PROCESS_DETACH: | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     case DLL_THREAD_ATTACH: | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     case DLL_THREAD_DETACH: | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2008-07-24 16:02:04 +00:00
										 |  |  | 
 |