| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | /*************************************************************************
 | 
					
						
							|  |  |  | *									 * | 
					
						
							|  |  |  | *	 YAP Prolog 							 * | 
					
						
							|  |  |  | *									 * | 
					
						
							|  |  |  | *	Yap Prolog was developed at NCCUP - Universidade do Porto	 * | 
					
						
							|  |  |  | *									 * | 
					
						
							| 
									
										
										
										
											2004-05-14 16:33:47 +00:00
										 |  |  | * Copyright L.Damas, V. Santos Costa and Universidade do Porto 1985--	 * | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | *									 * | 
					
						
							|  |  |  | ************************************************************************** | 
					
						
							|  |  |  | *									 * | 
					
						
							|  |  |  | * File:		stdpreds.c						 * | 
					
						
							|  |  |  | * comments:	General-purpose C implemented system predicates		 * | 
					
						
							|  |  |  | *									 * | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | * Last rev:     $Date: 2008-07-24 16:02:00 $,$Author: vsc $ | 
					
						
							| 
									
										
										
										
											2016-01-31 10:21:10 +00:00
										 |  |  | *	 * | 
					
						
							| 
									
										
										
										
											2004-04-27 15:14:38 +00:00
										 |  |  | *									 * | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | *************************************************************************/ | 
					
						
							|  |  |  | #ifdef SCCS
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | static char SccsId[] = "%W% %G%"; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | #define HAS_CACHE_REGS 1
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | * This file includes the definition of a miscellania of standard predicates | 
					
						
							|  |  |  | * for yap refering to: Consulting, Executing a C predicate from call, | 
					
						
							|  |  |  | * Comparisons (both general and numeric), Structure manipulation, Direct | 
					
						
							|  |  |  | * access to atoms and predicates, Basic support for the debugger | 
					
						
							|  |  |  | * | 
					
						
							|  |  |  | * It also includes a table where all C-predicates are initializated | 
					
						
							|  |  |  | * | 
					
						
							|  |  |  | */ | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "Yap.h"
 | 
					
						
							| 
									
										
										
										
											2015-02-18 10:03:57 +00:00
										 |  |  | #if YAP_JIT
 | 
					
						
							|  |  |  | #include "amijit.h"
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2016-02-29 03:13:23 +00:00
										 |  |  | #include "Foreign.h"
 | 
					
						
							| 
									
										
										
										
											2009-10-23 14:22:17 +01:00
										 |  |  | #include "YapHeap.h"
 | 
					
						
							| 
									
										
										
										
											2016-02-29 03:13:23 +00:00
										 |  |  | #include "Yatom.h"
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #include "eval.h"
 | 
					
						
							|  |  |  | #include "yapio.h"
 | 
					
						
							| 
									
										
										
										
											2010-04-16 02:08:06 +01:00
										 |  |  | #ifdef TABLING
 | 
					
						
							|  |  |  | #include "tab.macros.h"
 | 
					
						
							|  |  |  | #endif /* TABLING */
 | 
					
						
							| 
									
										
										
										
											2015-06-19 00:41:29 +01:00
										 |  |  | #if HAVE_UNISTD_H
 | 
					
						
							|  |  |  | #include <unistd.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #include <stdio.h>
 | 
					
						
							|  |  |  | #if HAVE_STRING_H
 | 
					
						
							|  |  |  | #include <string.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2006-05-18 16:33:05 +00:00
										 |  |  | #if HAVE_MALLOC_H
 | 
					
						
							|  |  |  | #include <malloc.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2015-01-26 04:02:46 +00:00
										 |  |  | #if YAP_JIT
 | 
					
						
							|  |  |  | #include <JIT_Compiler.hpp>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #include <fcntl.h>
 | 
					
						
							| 
									
										
										
										
											2016-02-29 03:13:23 +00:00
										 |  |  | #include <wchar.h>
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | static Int p_setval(USES_REGS1); | 
					
						
							|  |  |  | static Int p_value(USES_REGS1); | 
					
						
							|  |  |  | static Int p_values(USES_REGS1); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #ifdef undefined
 | 
					
						
							| 
									
										
										
										
											2013-04-25 17:15:04 -05:00
										 |  |  | static CODEADDR *FindAtom(CODEADDR, int *); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #endif /* undefined */
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | static Int p_opdec(USES_REGS1); | 
					
						
							|  |  |  | static Int p_univ(USES_REGS1); | 
					
						
							|  |  |  | static Int p_abort(USES_REGS1); | 
					
						
							| 
									
										
										
										
											2005-09-08 22:06:45 +00:00
										 |  |  | #ifdef BEAM
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | Int p_halt(USES_REGS1); | 
					
						
							| 
									
										
										
										
											2005-09-08 22:06:45 +00:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | static Int p_halt(USES_REGS1); | 
					
						
							| 
									
										
										
										
											2005-09-08 22:06:45 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2015-08-07 16:57:53 -05:00
										 |  |  | static Int current_predicate(USES_REGS1); | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | static Int cont_current_predicate(USES_REGS1); | 
					
						
							|  |  |  | static OpEntry *NextOp(OpEntry *CACHE_TYPE); | 
					
						
							|  |  |  | static Int init_current_op(USES_REGS1); | 
					
						
							|  |  |  | static Int cont_current_op(USES_REGS1); | 
					
						
							|  |  |  | static Int init_current_atom_op(USES_REGS1); | 
					
						
							|  |  |  | static Int cont_current_atom_op(USES_REGS1); | 
					
						
							| 
									
										
										
										
											2013-04-25 17:15:04 -05:00
										 |  |  | static Int TrailMax(void); | 
					
						
							|  |  |  | static Int GlobalMax(void); | 
					
						
							|  |  |  | static Int LocalMax(void); | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | static Int p_statistics_heap_max(USES_REGS1); | 
					
						
							|  |  |  | static Int p_statistics_global_max(USES_REGS1); | 
					
						
							|  |  |  | static Int p_statistics_local_max(USES_REGS1); | 
					
						
							|  |  |  | static Int p_statistics_heap_info(USES_REGS1); | 
					
						
							|  |  |  | static Int p_statistics_stacks_info(USES_REGS1); | 
					
						
							|  |  |  | static Int p_statistics_trail_info(USES_REGS1); | 
					
						
							|  |  |  | static Int p_cputime(USES_REGS1); | 
					
						
							|  |  |  | static Int p_systime(USES_REGS1); | 
					
						
							|  |  |  | static Int p_runtime(USES_REGS1); | 
					
						
							|  |  |  | static Int p_walltime(USES_REGS1); | 
					
						
							|  |  |  | static Int p_break(USES_REGS1); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-26 04:02:46 +00:00
										 |  |  | #if YAP_JIT
 | 
					
						
							| 
									
										
										
										
											2015-10-22 00:45:21 +01:00
										 |  |  | void *(*Yap_JitCall)(JIT_Compiler *jc, yamop *p); | 
					
						
							|  |  |  | void (*Yap_llvmShutdown)(void); | 
					
						
							|  |  |  | Int (*Yap_traced_absmi)(void); | 
					
						
							| 
									
										
										
										
											2015-01-26 04:02:46 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | static Int p_jit(USES_REGS1) { /* '$set_value'(+Atom,+Atomic) */ | 
					
						
							| 
									
										
										
										
											2015-02-18 10:03:57 +00:00
										 |  |  |   void *jit_handle; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-22 00:45:21 +01:00
										 |  |  |   if ((jit_handle = Yap_LoadForeignFile(YAP_YAPJITLIB, 0))) { | 
					
						
							|  |  |  |     if (!Yap_CallForeignFile(jit_handle, "init_jit")) | 
					
						
							|  |  |  |       fprintf(stderr, "Could not load JIT\n"); | 
					
						
							| 
									
										
										
										
											2015-01-26 04:02:46 +00:00
										 |  |  |     return FALSE; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return TRUE; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif /* YAP_JIT */
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-09-08 22:06:45 +00:00
										 |  |  | #ifdef BEAM
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | Int use_eam(USES_REGS1); | 
					
						
							|  |  |  | Int eager_split(USES_REGS1); | 
					
						
							|  |  |  | Int force_wait(USES_REGS1); | 
					
						
							|  |  |  | Int commit(USES_REGS1); | 
					
						
							|  |  |  | Int skip_while_var(USES_REGS1); | 
					
						
							|  |  |  | Int wait_while_var(USES_REGS1); | 
					
						
							|  |  |  | Int show_time(USES_REGS1); | 
					
						
							|  |  |  | Int start_eam(USES_REGS1); | 
					
						
							|  |  |  | Int cont_eam(USES_REGS1); | 
					
						
							| 
									
										
										
										
											2005-09-08 22:06:45 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | extern int EAM; | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | extern int eam_am(PredEntry *); | 
					
						
							|  |  |  | extern int showTime(void); | 
					
						
							| 
									
										
										
										
											2005-09-08 22:06:45 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | Int start_eam(USES_REGS1) { | 
					
						
							|  |  |  |   if (eam_am((PredEntry *)0x1)) | 
					
						
							|  |  |  |     return (TRUE); | 
					
						
							|  |  |  |   else { | 
					
						
							|  |  |  |     cut_fail(); | 
					
						
							|  |  |  |     return (FALSE); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2005-09-08 22:06:45 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | Int cont_eam(USES_REGS1) { | 
					
						
							|  |  |  |   if (eam_am((PredEntry *)0x2)) | 
					
						
							|  |  |  |     return (TRUE); | 
					
						
							|  |  |  |   else { | 
					
						
							|  |  |  |     cut_fail(); | 
					
						
							|  |  |  |     return (FALSE); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2005-09-08 22:06:45 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | Int use_eam(USES_REGS1) { | 
					
						
							|  |  |  |   if (EAM) | 
					
						
							|  |  |  |     EAM = 0; | 
					
						
							|  |  |  |   else { | 
					
						
							|  |  |  |     Yap_PutValue(AtomCArith, 0); | 
					
						
							|  |  |  |     EAM = 1; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return (TRUE); | 
					
						
							| 
									
										
										
										
											2005-09-08 22:06:45 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | Int commit(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2005-09-08 22:06:45 +00:00
										 |  |  |   if (EAM) { | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |     printf("Nao deveria ter sido chamado commit do stdpreds\n"); | 
					
						
							|  |  |  |     exit(1); | 
					
						
							| 
									
										
										
										
											2005-09-08 22:06:45 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   return (TRUE); | 
					
						
							| 
									
										
										
										
											2005-09-08 22:06:45 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | Int skip_while_var(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2005-09-08 22:06:45 +00:00
										 |  |  |   if (EAM) { | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |     printf("Nao deveria ter sido chamado skip_while_var do stdpreds\n"); | 
					
						
							|  |  |  |     exit(1); | 
					
						
							| 
									
										
										
										
											2005-09-08 22:06:45 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   return (TRUE); | 
					
						
							| 
									
										
										
										
											2005-09-08 22:06:45 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | Int wait_while_var(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2005-09-08 22:06:45 +00:00
										 |  |  |   if (EAM) { | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |     printf("Nao deveria ter sido chamado wait_while_var do stdpreds\n"); | 
					
						
							|  |  |  |     exit(1); | 
					
						
							| 
									
										
										
										
											2005-09-08 22:06:45 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   return (TRUE); | 
					
						
							| 
									
										
										
										
											2005-09-08 22:06:45 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | Int force_wait(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2005-09-08 22:06:45 +00:00
										 |  |  |   if (EAM) { | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |     printf("Nao deveria ter sido chamado force_wait do stdpreds\n"); | 
					
						
							|  |  |  |     exit(1); | 
					
						
							| 
									
										
										
										
											2005-09-08 22:06:45 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   return (TRUE); | 
					
						
							| 
									
										
										
										
											2005-09-08 22:06:45 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | Int eager_split(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2005-09-08 22:06:45 +00:00
										 |  |  |   if (EAM) { | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |     printf("Nao deveria ter sido chamado eager_split do stdpreds\n"); | 
					
						
							|  |  |  |     exit(1); | 
					
						
							| 
									
										
										
										
											2005-09-08 22:06:45 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   return (TRUE); | 
					
						
							| 
									
										
										
										
											2005-09-08 22:06:45 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | Int show_time(USES_REGS1) /* MORE PRECISION */ | 
					
						
							| 
									
										
										
										
											2005-09-08 22:06:45 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   return (showTime()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | #endif /* BEAM */
 | 
					
						
							| 
									
										
										
										
											2015-10-22 00:45:21 +01:00
										 |  |  |        // @{
 | 
					
						
							| 
									
										
										
										
											2005-09-08 22:06:45 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-04 23:58:23 +00:00
										 |  |  | /**
 | 
					
						
							|  |  |  |    @defgroup YAPSetVal | 
					
						
							|  |  |  |    @ingroup Internal_Database | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-22 00:45:21 +01:00
										 |  |  |    Maintain a light-weight map where the key is an atom, and the value can be | 
					
						
							|  |  |  |    any constant. | 
					
						
							| 
									
										
										
										
											2015-01-04 23:58:23 +00:00
										 |  |  | */ | 
					
						
							| 
									
										
										
										
											2015-02-03 02:36:51 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-04 23:58:23 +00:00
										 |  |  | /** @pred  set_value(+ _A_,+ _C_)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Associate atom  _A_ with constant  _C_. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     The `set_value` and `get_value` built-ins give a fast alternative to | 
					
						
							|  |  |  |     the internal data-base. This is a simple form of implementing a global | 
					
						
							|  |  |  |     counter. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ~~~~~ | 
					
						
							|  |  |  |     read_and_increment_counter(Value) :- | 
					
						
							|  |  |  |     get_value(counter, Value), | 
					
						
							|  |  |  |     Value1 is Value+1, | 
					
						
							|  |  |  |     set_value(counter, Value1). | 
					
						
							|  |  |  |     ~~~~~ | 
					
						
							|  |  |  |     This predicate is YAP specific. | 
					
						
							|  |  |  | */ | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | static Int p_setval(USES_REGS1) { /* '$set_value'(+Atom,+Atomic) */ | 
					
						
							|  |  |  |   Term t1 = Deref(ARG1), t2 = Deref(ARG2); | 
					
						
							|  |  |  |   if (!IsVarTerm(t1) && IsAtomTerm(t1) && | 
					
						
							|  |  |  |       (!IsVarTerm(t2) && (IsAtomTerm(t2) || IsNumTerm(t2)))) { | 
					
						
							|  |  |  |     Yap_PutValue(AtomOfTerm(t1), t2); | 
					
						
							|  |  |  |     return (TRUE); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return (FALSE); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-04 23:58:23 +00:00
										 |  |  | /** @pred  get_value(+ _A_,- _V_)
 | 
					
						
							|  |  |  |     In YAP, atoms can be associated with constants. If one such | 
					
						
							|  |  |  |     association exists for atom  _A_, unify the second argument with the | 
					
						
							|  |  |  |     constant. Otherwise, unify  _V_ with `[]`. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     This predicate is YAP specific. | 
					
						
							|  |  |  | */ | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | static Int p_value(USES_REGS1) { /* '$get_value'(+Atom,?Val) */ | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   Term t1 = Deref(ARG1); | 
					
						
							| 
									
										
										
										
											2002-09-13 21:30:06 +00:00
										 |  |  |   if (IsVarTerm(t1)) { | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |     Yap_Error(INSTANTIATION_ERROR, t1, "get_value/2"); | 
					
						
							| 
									
										
										
										
											2002-09-13 21:30:06 +00:00
										 |  |  |     return (FALSE); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (!IsAtomTerm(t1)) { | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |     Yap_Error(TYPE_ERROR_ATOM, t1, "get_value/2"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     return (FALSE); | 
					
						
							| 
									
										
										
										
											2002-09-13 21:30:06 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   return (Yap_unify_constant(ARG2, Yap_GetValue(AtomOfTerm(t1)))); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | static Int p_values(USES_REGS1) { /* '$values'(Atom,Old,New) */ | 
					
						
							|  |  |  |   Term t1 = Deref(ARG1), t3 = Deref(ARG3); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-09-13 21:30:06 +00:00
										 |  |  |   if (IsVarTerm(t1)) { | 
					
						
							| 
									
										
										
										
											2015-01-05 16:06:32 +00:00
										 |  |  |     Yap_Error(INSTANTIATION_ERROR, t1, "set_value/2"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     return (FALSE); | 
					
						
							| 
									
										
										
										
											2002-09-13 21:30:06 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   if (!IsAtomTerm(t1)) { | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |     Yap_Error(TYPE_ERROR_ATOM, t1, "set_value/2"); | 
					
						
							| 
									
										
										
										
											2002-09-13 21:30:06 +00:00
										 |  |  |     return (FALSE); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   if (!Yap_unify_constant(ARG2, Yap_GetValue(AtomOfTerm(t1)))) { | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     return (FALSE); | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   if (!IsVarTerm(t3)) { | 
					
						
							|  |  |  |     if (IsAtomTerm(t3) || IsNumTerm(t3)) { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |       Yap_PutValue(AtomOfTerm(t1), t3); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     } else | 
					
						
							|  |  |  |       return (FALSE); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return (TRUE); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-04 23:58:23 +00:00
										 |  |  | //@}
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | static Int p_opdec(USES_REGS1) { /* '$opdec'(p,type,atom)		 */ | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   /* we know the arguments are integer, atom, atom */ | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   Term p = Deref(ARG1), t = Deref(ARG2), at = Deref(ARG3); | 
					
						
							| 
									
										
										
										
											2005-10-21 16:09:03 +00:00
										 |  |  |   Term tmod = Deref(ARG4); | 
					
						
							|  |  |  |   if (tmod == TermProlog) { | 
					
						
							|  |  |  |     tmod = PROLOG_MODULE; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2015-09-21 17:05:36 -05:00
										 |  |  |   return Yap_OpDec((int)IntOfTerm(p), (char *)RepAtom(AtomOfTerm(t))->StrOfAE, | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |                    AtomOfTerm(at), tmod); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef NO_STRTOD
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if HAVE_CTYPE_H
 | 
					
						
							|  |  |  | #include <ctype.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | double strtod(s, pe) char *s, **pe; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   double r = atof(s); | 
					
						
							|  |  |  |   *pe = s; | 
					
						
							|  |  |  |   while (*s == ' ') { | 
					
						
							|  |  |  |     ++s; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (*s == '+' || *s == '-') { | 
					
						
							|  |  |  |     ++s; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (!isdigit(*s)) { | 
					
						
							|  |  |  |     return (r); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   while (isdigit(*s)) { | 
					
						
							|  |  |  |     ++s; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (*s == '.') { | 
					
						
							|  |  |  |     ++s; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   while (isdigit(*s)) { | 
					
						
							|  |  |  |     ++s; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (*s == 'e' || *s == 'E') { | 
					
						
							|  |  |  |     ++s; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (*s == '+' || *s == '-') { | 
					
						
							|  |  |  |     ++s; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   while (isdigit(*s)) { | 
					
						
							|  |  |  |     ++s; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   *pe = s; | 
					
						
							|  |  |  |   return (r); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <stdlib.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-11-16 14:26:00 +00:00
										 |  |  | #ifndef INFINITY
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | #define INFINITY (1.0 / 0.0)
 | 
					
						
							| 
									
										
										
										
											2006-11-16 14:26:00 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | static UInt runtime(USES_REGS1) { | 
					
						
							|  |  |  |   return (Yap_cputime() - Yap_total_gc_time() - Yap_total_stack_shift_time()); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-09 18:00:41 -05:00
										 |  |  | /* $runtime(-SinceInterval,-SinceStart)	 */ | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | static Int p_runtime(USES_REGS1) { | 
					
						
							|  |  |  |   Int now, interval, gc_time, ss_time; | 
					
						
							| 
									
										
										
										
											2013-05-09 18:00:41 -05:00
										 |  |  |   Term tnow, tinterval; | 
					
						
							| 
									
										
										
										
											2005-03-02 19:48:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-09 18:00:41 -05:00
										 |  |  |   Yap_cputime_interval(&now, &interval); | 
					
						
							|  |  |  |   gc_time = Yap_total_gc_time(); | 
					
						
							|  |  |  |   now -= gc_time; | 
					
						
							|  |  |  |   ss_time = Yap_total_stack_shift_time(); | 
					
						
							|  |  |  |   now -= ss_time; | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   interval -= (gc_time - LOCAL_LastGcTime) + (ss_time - LOCAL_LastSSTime); | 
					
						
							| 
									
										
										
										
											2013-05-09 18:00:41 -05:00
										 |  |  |   LOCAL_LastGcTime = gc_time; | 
					
						
							|  |  |  |   LOCAL_LastSSTime = ss_time; | 
					
						
							|  |  |  |   tnow = MkIntegerTerm(now); | 
					
						
							|  |  |  |   tinterval = MkIntegerTerm(interval); | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   return (Yap_unify_constant(ARG1, tnow) && | 
					
						
							|  |  |  |           Yap_unify_constant(ARG2, tinterval)); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-09 18:00:41 -05:00
										 |  |  | /* $cputime(-SinceInterval,-SinceStart)	 */ | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | static Int p_cputime(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2013-05-09 18:00:41 -05:00
										 |  |  |   Int now, interval; | 
					
						
							|  |  |  |   Yap_cputime_interval(&now, &interval); | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   return (Yap_unify_constant(ARG1, MkIntegerTerm(now)) && | 
					
						
							|  |  |  |           Yap_unify_constant(ARG2, MkIntegerTerm(interval))); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | static Int p_systime(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2013-05-09 18:00:41 -05:00
										 |  |  |   Int now, interval; | 
					
						
							|  |  |  |   Yap_systime_interval(&now, &interval); | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   return (Yap_unify_constant(ARG1, MkIntegerTerm(now)) && | 
					
						
							|  |  |  |           Yap_unify_constant(ARG2, MkIntegerTerm(interval))); | 
					
						
							| 
									
										
										
										
											2013-05-09 18:00:41 -05:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2012-02-17 11:31:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | static Int p_walltime(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2016-02-28 19:32:55 +00:00
										 |  |  |   uint64_t now, interval; | 
					
						
							| 
									
										
										
										
											2016-02-29 03:13:23 +00:00
										 |  |  |   uint64_t t = Yap_walltime(); | 
					
						
							|  |  |  |   now = t - Yap_StartOfWTimes; | 
					
						
							|  |  |  |   interval = t - LOCAL_LastWTime; | 
					
						
							|  |  |  |   return (Yap_unify_constant(ARG1, MkIntegerTerm(now / 1000)) && | 
					
						
							|  |  |  |           Yap_unify_constant(ARG2, MkIntegerTerm(interval / 1000))); | 
					
						
							| 
									
										
										
										
											2007-10-08 23:02:16 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | static Int p_univ(USES_REGS1) { /* A =.. L			 */ | 
					
						
							|  |  |  |   unsigned int arity; | 
					
						
							|  |  |  |   register Term tin; | 
					
						
							|  |  |  |   Term twork, t2; | 
					
						
							|  |  |  |   Atom at; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   tin = Deref(ARG1); | 
					
						
							|  |  |  |   t2 = Deref(ARG2); | 
					
						
							|  |  |  |   if (IsVarTerm(tin)) { | 
					
						
							|  |  |  |     /* we need to have a list */ | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |     Term *Ar; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     if (IsVarTerm(t2)) { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |       Yap_Error(INSTANTIATION_ERROR, t2, "(=..)/2"); | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |       return (FALSE); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |     if (!IsPairTerm(t2)) { | 
					
						
							|  |  |  |       if (t2 == TermNil) | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |         Yap_Error(DOMAIN_ERROR_NON_EMPTY_LIST, t2, "(=..)/2"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       else | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |         Yap_Error(TYPE_ERROR_LIST, ARG2, "(=..)/2"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       return (FALSE); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     twork = HeadOfTerm(t2); | 
					
						
							|  |  |  |     if (IsVarTerm(twork)) { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |       Yap_Error(INSTANTIATION_ERROR, twork, "(=..)/2"); | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |       return (FALSE); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |     if (IsNumTerm(twork)) { | 
					
						
							|  |  |  |       Term tt = TailOfTerm(t2); | 
					
						
							| 
									
										
										
										
											2014-10-22 10:43:38 +01:00
										 |  |  |       if (IsVarTerm(tt)) { | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |         Yap_Error(INSTANTIATION_ERROR, tt, "(=..)/2"); | 
					
						
							|  |  |  |         return (FALSE); | 
					
						
							| 
									
										
										
										
											2014-10-22 10:43:38 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |       if (tt != MkAtomTerm(AtomNil)) { | 
					
						
							|  |  |  |         Yap_Error(TYPE_ERROR_ATOMIC, twork, "(=..)/2"); | 
					
						
							|  |  |  |         return (FALSE); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |       return (Yap_unify_constant(ARG1, twork)); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |     if (!IsAtomTerm(twork)) { | 
					
						
							| 
									
										
										
										
											2014-10-22 10:43:38 +01:00
										 |  |  |       Term tt = TailOfTerm(t2); | 
					
						
							|  |  |  |       if (IsVarTerm(tt)) { | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |         Yap_Error(INSTANTIATION_ERROR, twork, "(=..)/2"); | 
					
						
							|  |  |  |         return (FALSE); | 
					
						
							| 
									
										
										
										
											2014-10-22 10:43:38 +01:00
										 |  |  |       } else if (tt == MkAtomTerm(AtomNil)) { | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |         Yap_Error(TYPE_ERROR_ATOMIC, twork, "(=..)/2"); | 
					
						
							|  |  |  |         return (FALSE); | 
					
						
							| 
									
										
										
										
											2014-10-22 10:43:38 +01:00
										 |  |  |       } else { | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |         Yap_Error(TYPE_ERROR_ATOM, twork, "(=..)/2"); | 
					
						
							|  |  |  |         return (FALSE); | 
					
						
							| 
									
										
										
										
											2014-10-22 10:43:38 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     at = AtomOfTerm(twork); | 
					
						
							|  |  |  |     twork = TailOfTerm(t2); | 
					
						
							|  |  |  |     if (IsVarTerm(twork)) { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |       Yap_Error(INSTANTIATION_ERROR, twork, "(=..)/2"); | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |       return (FALSE); | 
					
						
							|  |  |  |     } else if (!IsPairTerm(twork)) { | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       if (twork != TermNil) { | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |         Yap_Error(TYPE_ERROR_LIST, ARG2, "(=..)/2"); | 
					
						
							|  |  |  |         return (FALSE); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |       return (Yap_unify_constant(ARG1, MkAtomTerm(at))); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-05-07 21:19:52 +00:00
										 |  |  |   build_compound: | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     /* build the term directly on the heap */ | 
					
						
							| 
									
										
										
										
											2014-01-19 21:15:05 +00:00
										 |  |  |     Ar = HR; | 
					
						
							|  |  |  |     HR++; | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     while (!IsVarTerm(twork) && IsPairTerm(twork)) { | 
					
						
							| 
									
										
										
										
											2014-01-19 21:15:05 +00:00
										 |  |  |       *HR++ = HeadOfTerm(twork); | 
					
						
							|  |  |  |       if (HR > ASP - 1024) { | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |         /* restore space */ | 
					
						
							|  |  |  |         HR = Ar; | 
					
						
							|  |  |  |         if (!Yap_gcl((ASP - HR) * sizeof(CELL), 2, ENV, gc_P(P, CP))) { | 
					
						
							| 
									
										
										
										
											2015-09-25 10:57:26 +01:00
										 |  |  |           Yap_Error(RESOURCE_ERROR_STACK, TermNil, LOCAL_ErrorMessage); | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |           return FALSE; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         twork = TailOfTerm(Deref(ARG2)); | 
					
						
							|  |  |  |         goto build_compound; | 
					
						
							| 
									
										
										
										
											2002-05-07 21:19:52 +00:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       twork = TailOfTerm(twork); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if (IsVarTerm(twork)) { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |       Yap_Error(INSTANTIATION_ERROR, twork, "(=..)/2"); | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |       return (FALSE); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |     if (twork != TermNil) { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |       Yap_Error(TYPE_ERROR_LIST, ARG2, "(=..)/2"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       return (FALSE); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | #ifdef SFUNC
 | 
					
						
							|  |  |  |     DOES_NOT_WORK(); | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |       SFEntry *pe = (SFEntry *)Yap_GetAProp(at, SFProperty); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       if (pe) | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |         twork = MkSFTerm(Yap_MkFunctor(at, SFArity), arity, CellPtr(TR), | 
					
						
							|  |  |  |                          pe->NilValue); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       else | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |         twork = Yap_MkApplTerm(Yap_MkFunctor(at, arity), arity, CellPtr(TR)); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |     arity = HR - Ar - 1; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     if (at == AtomDot && arity == 2) { | 
					
						
							|  |  |  |       Ar[0] = Ar[1]; | 
					
						
							|  |  |  |       Ar[1] = Ar[2]; | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |       HR--; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       twork = AbsPair(Ar); | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |       *Ar = (CELL)(Yap_MkFunctor(at, arity)); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       twork = AbsAppl(Ar); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     return (Yap_unify(ARG1, twork)); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   if (IsAtomicTerm(tin)) { | 
					
						
							|  |  |  |     twork = MkPairTerm(tin, MkAtomTerm(AtomNil)); | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     return (Yap_unify(twork, ARG2)); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   if (IsRefTerm(tin)) | 
					
						
							|  |  |  |     return (FALSE); | 
					
						
							|  |  |  |   if (IsApplTerm(tin)) { | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |     Functor fun = FunctorOfTerm(tin); | 
					
						
							|  |  |  |     if (IsExtensionFunctor(fun)) { | 
					
						
							| 
									
										
										
										
											2014-02-02 21:45:47 +00:00
										 |  |  |       twork = MkPairTerm(tin, MkAtomTerm(AtomNil)); | 
					
						
							|  |  |  |       return (Yap_unify(twork, ARG2)); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     arity = ArityOfFunctor(fun); | 
					
						
							|  |  |  |     at = NameOfFunctor(fun); | 
					
						
							|  |  |  | #ifdef SFUNC
 | 
					
						
							|  |  |  |     if (arity == SFArity) { | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |       CELL *p = CellPtr(TR); | 
					
						
							|  |  |  |       CELL *q = ArgsOfSFTerm(tin); | 
					
						
							|  |  |  |       int argno = 1; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       while (*q) { | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |         while (*q > argno++) | 
					
						
							|  |  |  |           *p++ = MkVarTerm(); | 
					
						
							|  |  |  |         ++q; | 
					
						
							|  |  |  |         *p++ = Deref(*q++); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |       twork = Yap_ArrayToList(CellPtr(TR), argno - 1); | 
					
						
							| 
									
										
										
										
											2002-10-29 04:19:09 +00:00
										 |  |  |       while (IsIntTerm(twork)) { | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |         if (!Yap_gc(2, ENV, gc_P(P, CP))) { | 
					
						
							| 
									
										
										
										
											2015-09-25 10:57:26 +01:00
										 |  |  |           Yap_Error(RESOURCE_ERROR_STACK, TermNil, LOCAL_ErrorMessage); | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |           return (FALSE); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         twork = Yap_ArrayToList(CellPtr(TR), argno - 1); | 
					
						
							| 
									
										
										
										
											2002-10-29 04:19:09 +00:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     } else | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |       while (HR + arity * 2 > ASP - 1024) { | 
					
						
							|  |  |  |         if (!Yap_gcl((arity * 2) * sizeof(CELL), 2, ENV, gc_P(P, CP))) { | 
					
						
							| 
									
										
										
										
											2015-09-25 10:57:26 +01:00
										 |  |  |           Yap_Error(RESOURCE_ERROR_STACK, TermNil, LOCAL_ErrorMessage); | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |           return (FALSE); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         tin = Deref(ARG1); | 
					
						
							| 
									
										
										
										
											2002-05-07 21:19:52 +00:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |       twork = Yap_ArrayToList(RepAppl(tin) + 1, arity); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } else { | 
					
						
							|  |  |  |     /* We found a list */ | 
					
						
							|  |  |  |     at = AtomDot; | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     twork = Yap_ArrayToList(RepPair(tin), 2); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   twork = MkPairTerm(MkAtomTerm(at), twork); | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   return (Yap_unify(ARG2, twork)); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | static Int p_abort(USES_REGS1) { /* abort			 */ | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   /* make sure we won't go creeping around */ | 
					
						
							| 
									
										
										
										
											2015-09-25 10:57:26 +01:00
										 |  |  |   Yap_Error(ABORT_EVENT, TermNil, ""); | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   return (FALSE); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-09-08 22:06:45 +00:00
										 |  |  | #ifdef BEAM
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | extern void exit_eam(char *s); | 
					
						
							| 
									
										
										
										
											2005-09-08 22:06:45 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | Int | 
					
						
							| 
									
										
										
										
											2005-09-08 22:06:45 +00:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | static Int | 
					
						
							| 
									
										
										
										
											2005-09-08 22:06:45 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |     p_halt(USES_REGS1) { /* halt				 */ | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   Term t = Deref(ARG1); | 
					
						
							|  |  |  |   Int out; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-09-08 22:06:45 +00:00
										 |  |  | #ifdef BEAM
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   if (EAM) | 
					
						
							|  |  |  |     exit_eam("\n\n[ Prolog execution halted ]\n"); | 
					
						
							| 
									
										
										
										
											2005-09-08 22:06:45 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   if (IsVarTerm(t)) { | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |     Yap_Error(INSTANTIATION_ERROR, t, "halt/1"); | 
					
						
							|  |  |  |     return (FALSE); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   if (!IsIntegerTerm(t)) { | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |     Yap_Error(TYPE_ERROR_INTEGER, t, "halt/1"); | 
					
						
							|  |  |  |     return (FALSE); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   out = IntegerOfTerm(t); | 
					
						
							| 
									
										
										
										
											2015-01-26 04:02:46 +00:00
										 |  |  | #if YAP_JIT
 | 
					
						
							| 
									
										
										
										
											2015-10-22 00:45:21 +01:00
										 |  |  |   if (ExpEnv.analysis_struc.stats_enabled || | 
					
						
							|  |  |  |       ExpEnv.analysis_struc.time_pass_enabled) { | 
					
						
							|  |  |  |     if (strcmp(((char *)ExpEnv.analysis_struc.outfile), "STDERR")) { | 
					
						
							| 
									
										
										
										
											2015-01-26 04:02:46 +00:00
										 |  |  |       int stderrcopy = dup(2); | 
					
						
							| 
									
										
										
										
											2015-10-22 00:45:21 +01:00
										 |  |  |       if (strcmp(((char *)ExpEnv.analysis_struc.outfile), "STDOUT") == 0) { | 
					
						
							| 
									
										
										
										
											2015-01-26 04:02:46 +00:00
										 |  |  |         dup2(1, 2); | 
					
						
							|  |  |  | #pragma GCC diagnostic push
 | 
					
						
							|  |  |  | #pragma GCC diagnostic ignored "-Wimplicit-function-declaration"
 | 
					
						
							|  |  |  |         shutdown_llvm(); | 
					
						
							|  |  |  | #pragma GCC diagnostic pop
 | 
					
						
							|  |  |  |         dup2(stderrcopy, 2); | 
					
						
							| 
									
										
										
										
											2015-10-22 00:45:21 +01:00
										 |  |  |       } else { | 
					
						
							|  |  |  |         int Outputfile = open(((char *)ExpEnv.analysis_struc.outfile), | 
					
						
							|  |  |  |                               O_CREAT | O_APPEND | O_WRONLY, 0777); | 
					
						
							| 
									
										
										
										
											2015-01-26 04:02:46 +00:00
										 |  |  |         if (Outputfile < 0) { | 
					
						
							| 
									
										
										
										
											2015-10-22 00:45:21 +01:00
										 |  |  |           fprintf(stderr, | 
					
						
							|  |  |  |                   "Error:: I can not write analysis passes's output on %s...\n", | 
					
						
							|  |  |  |                   ((char *)ExpEnv.analysis_struc.outfile)); | 
					
						
							| 
									
										
										
										
											2015-01-26 04:02:46 +00:00
										 |  |  |           fprintf(stderr, "        %s...\n", strerror(errno)); | 
					
						
							|  |  |  |           errno = 0; | 
					
						
							|  |  |  |           exit(1); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         dup2(Outputfile, 2); | 
					
						
							|  |  |  |         shutdown_llvm(); | 
					
						
							|  |  |  |         close(Outputfile); | 
					
						
							|  |  |  |         dup2(stderrcopy, 2); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       close(stderrcopy); | 
					
						
							| 
									
										
										
										
											2015-10-22 00:45:21 +01:00
										 |  |  |     } else | 
					
						
							| 
									
										
										
										
											2015-01-26 04:02:46 +00:00
										 |  |  |       shutdown_llvm(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2015-02-03 02:36:51 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-04-27 15:14:38 +00:00
										 |  |  |   Yap_exit(out); | 
					
						
							|  |  |  |   return TRUE; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-22 00:45:21 +01:00
										 |  |  | static bool valid_prop(Prop p, Term task) { | 
					
						
							| 
									
										
										
										
											2016-08-05 16:34:05 -05:00
										 |  |  |   PredEntry *pe = RepPredProp(p); | 
					
						
							|  |  |  |   if ((pe->PredFlags & HiddenPredFlag) || (pe->OpcodeOfPred == UNDEF_OPCODE)) { | 
					
						
							| 
									
										
										
										
											2015-04-21 16:06:24 -06:00
										 |  |  |     return false; | 
					
						
							| 
									
										
										
										
											2015-07-22 19:27:29 -05:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2016-02-29 03:13:23 +00:00
										 |  |  |   if (task == TermSystem || task == TermProlog) { | 
					
						
							| 
									
										
										
										
											2016-08-05 16:34:05 -05:00
										 |  |  |     return pe->PredFlags & StandardPredFlag; | 
					
						
							| 
									
										
										
										
											2016-01-08 03:18:36 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2016-02-29 03:13:23 +00:00
										 |  |  |   if (task == TermUser) { | 
					
						
							| 
									
										
										
										
											2016-08-05 16:34:05 -05:00
										 |  |  |     return !(pe->PredFlags & StandardPredFlag); | 
					
						
							| 
									
										
										
										
											2016-01-08 03:18:36 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   if (IsVarTerm(task)) { | 
					
						
							|  |  |  |     return true; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return false; | 
					
						
							| 
									
										
										
										
											2015-04-21 16:06:24 -06:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-22 00:45:21 +01:00
										 |  |  | static PropEntry *followLinkedListOfProps(PropEntry *p, Term task) { | 
					
						
							| 
									
										
										
										
											2015-04-13 13:28:17 +01:00
										 |  |  |   while (p) { | 
					
						
							| 
									
										
										
										
											2015-10-22 00:45:21 +01:00
										 |  |  |     if (p->KindOfPE == PEProp && valid_prop(p, task)) { | 
					
						
							| 
									
										
										
										
											2015-04-13 13:28:17 +01:00
										 |  |  |       // found our baby..
 | 
					
						
							|  |  |  |       return p; | 
					
						
							| 
									
										
										
										
											2015-07-22 19:27:29 -05:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-04-21 16:06:24 -06:00
										 |  |  |     p = p->NextOfPE; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return NIL; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-22 00:45:21 +01:00
										 |  |  | static PropEntry *getPredProp(PropEntry *p, Term task) { | 
					
						
							| 
									
										
										
										
											2015-04-21 16:06:24 -06:00
										 |  |  |   PredEntry *pe; | 
					
						
							|  |  |  |   if (p == NIL) | 
					
						
							|  |  |  |     return NIL; | 
					
						
							|  |  |  |   pe = RepPredProp(p); | 
					
						
							|  |  |  |   while (p != NIL) { | 
					
						
							| 
									
										
										
										
											2015-07-22 19:27:29 -05:00
										 |  |  |     if (p->KindOfPE == PEProp && valid_prop(p, task)) { | 
					
						
							| 
									
										
										
										
											2015-04-21 16:06:24 -06:00
										 |  |  |       return p; | 
					
						
							| 
									
										
										
										
											2015-04-13 13:28:17 +01:00
										 |  |  |     } else if (p->KindOfPE == FunctorProperty) { | 
					
						
							| 
									
										
										
										
											2015-04-21 16:06:24 -06:00
										 |  |  |       // first search remainder of functor list
 | 
					
						
							|  |  |  |       Prop pf; | 
					
						
							| 
									
										
										
										
											2015-07-22 19:27:29 -05:00
										 |  |  |       if ((pf = followLinkedListOfProps(RepFunctorProp(p)->PropsOfFE, task))) { | 
					
						
							| 
									
										
										
										
											2015-10-22 00:45:21 +01:00
										 |  |  |         return pf; | 
					
						
							| 
									
										
										
										
											2015-04-13 13:28:17 +01:00
										 |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     p = p->NextOfPE; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return NIL; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-22 00:45:21 +01:00
										 |  |  | static PropEntry *nextPredForAtom(PropEntry *p, Term task) { | 
					
						
							| 
									
										
										
										
											2015-04-13 13:28:17 +01:00
										 |  |  |   PredEntry *pe; | 
					
						
							|  |  |  |   if (p == NIL) | 
					
						
							|  |  |  |     return NIL; | 
					
						
							|  |  |  |   pe = RepPredProp(p); | 
					
						
							| 
									
										
										
										
											2016-01-04 14:11:09 +00:00
										 |  |  |   if (pe->ArityOfPE == 0 || | 
					
						
							| 
									
										
										
										
											2016-02-29 03:13:23 +00:00
										 |  |  |       (pe->PredFlags & (NumberDBPredFlag | AtomDBPredFlag))) { | 
					
						
							|  |  |  |     // if atom prop, search atom list
 | 
					
						
							| 
									
										
										
										
											2015-07-22 19:27:29 -05:00
										 |  |  |     return followLinkedListOfProps(p->NextOfPE, task); | 
					
						
							| 
									
										
										
										
											2015-04-13 13:28:17 +01:00
										 |  |  |   } else { | 
					
						
							|  |  |  |     FunctorEntry *f = pe->FunctorOfPred; | 
					
						
							|  |  |  |     // first search remainder of functor list
 | 
					
						
							| 
									
										
										
										
											2015-04-21 16:06:24 -06:00
										 |  |  |     PropEntry *pf; | 
					
						
							| 
									
										
										
										
											2015-11-05 16:12:07 +00:00
										 |  |  |     if ((pf = followLinkedListOfProps(p->NextOfPE, task))) { | 
					
						
							| 
									
										
										
										
											2015-04-21 16:06:24 -06:00
										 |  |  |       return pf; | 
					
						
							| 
									
										
										
										
											2015-04-13 13:28:17 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-07-22 19:27:29 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-13 13:28:17 +01:00
										 |  |  |     // if that fails, follow the functor
 | 
					
						
							| 
									
										
										
										
											2015-10-22 00:45:21 +01:00
										 |  |  |     return getPredProp(f->NextOfPE, task); | 
					
						
							| 
									
										
										
										
											2015-04-21 16:06:24 -06:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-22 00:45:21 +01:00
										 |  |  | static Prop initFunctorSearch(Term t3, Term t2, Term task) { | 
					
						
							| 
									
										
										
										
											2015-04-21 16:06:24 -06:00
										 |  |  |   if (IsAtomTerm(t3)) { | 
					
						
							|  |  |  |     Atom at = AtomOfTerm(t3); | 
					
						
							|  |  |  |     // access the entry at key address.
 | 
					
						
							| 
									
										
										
										
											2015-10-22 00:45:21 +01:00
										 |  |  |     return followLinkedListOfProps(RepAtom(at)->PropsOfAE, task); | 
					
						
							| 
									
										
										
										
											2015-04-21 16:06:24 -06:00
										 |  |  |   } else if (IsIntTerm(t3)) { | 
					
						
							|  |  |  |     if (IsNonVarTerm(t2) && t2 != IDB_MODULE) { | 
					
						
							|  |  |  |       Yap_Error(TYPE_ERROR_CALLABLE, t3, "current_predicate/2"); | 
					
						
							|  |  |  |       return NULL; | 
					
						
							|  |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2015-07-22 19:27:29 -05:00
										 |  |  |       Prop p; | 
					
						
							| 
									
										
										
										
											2015-04-21 16:06:24 -06:00
										 |  |  |       // access the entry at key address.
 | 
					
						
							|  |  |  |       // a single property (this will be deterministic
 | 
					
						
							| 
									
										
										
										
											2015-10-22 00:45:21 +01:00
										 |  |  |       p = AbsPredProp(Yap_FindLUIntKey(IntOfTerm(t3))); | 
					
						
							|  |  |  |       if (valid_prop(p, task)) | 
					
						
							|  |  |  |         return p; | 
					
						
							| 
									
										
										
										
											2015-04-21 16:06:24 -06:00
										 |  |  |     } | 
					
						
							|  |  |  |     Yap_Error(TYPE_ERROR_CALLABLE, t3, "current_predicate/2"); | 
					
						
							|  |  |  |     return NULL; | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     Functor f; | 
					
						
							|  |  |  |     if (IsPairTerm(t3)) { | 
					
						
							|  |  |  |       f = FunctorDot; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       f = FunctorOfTerm(t3); | 
					
						
							|  |  |  |       if (IsExtensionFunctor(f)) { | 
					
						
							| 
									
										
										
										
											2015-10-22 00:45:21 +01:00
										 |  |  |         Yap_Error(TYPE_ERROR_CALLABLE, t3, "current_predicate/2"); | 
					
						
							|  |  |  |         return NULL; | 
					
						
							| 
									
										
										
										
											2015-04-21 16:06:24 -06:00
										 |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-10-22 00:45:21 +01:00
										 |  |  |     return followLinkedListOfProps(f->PropsOfFE, task); | 
					
						
							| 
									
										
										
										
											2015-04-13 13:28:17 +01:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-22 00:45:21 +01:00
										 |  |  | static PredEntry *firstModulePred(PredEntry *npp, Term task) { | 
					
						
							| 
									
										
										
										
											2015-04-21 16:06:24 -06:00
										 |  |  |   if (!npp) | 
					
						
							|  |  |  |     return NULL; | 
					
						
							|  |  |  |   do { | 
					
						
							| 
									
										
										
										
											2015-07-22 19:27:29 -05:00
										 |  |  |     npp = npp->NextPredOfModule; | 
					
						
							| 
									
										
										
										
											2015-10-22 00:45:21 +01:00
										 |  |  |   } while (npp && !valid_prop(AbsPredProp(npp), task)); | 
					
						
							| 
									
										
										
										
											2015-04-21 16:06:24 -06:00
										 |  |  |   return npp; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | static PredEntry *firstModulesPred(PredEntry *npp, ModEntry *m, Term task) { | 
					
						
							| 
									
										
										
										
											2015-04-21 16:06:24 -06:00
										 |  |  |   do { | 
					
						
							| 
									
										
										
										
											2015-10-22 00:45:21 +01:00
										 |  |  |     while (npp && !valid_prop(AbsPredProp(npp), task)) | 
					
						
							| 
									
										
										
										
											2015-04-21 16:06:24 -06:00
										 |  |  |       npp = npp->NextPredOfModule; | 
					
						
							|  |  |  |     if (npp) | 
					
						
							|  |  |  |       return npp; | 
					
						
							|  |  |  |     m = m->NextME; | 
					
						
							|  |  |  |     if (m) { | 
					
						
							| 
									
										
										
										
											2015-07-22 19:27:29 -05:00
										 |  |  |       npp = m->PredForME; | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |     } else | 
					
						
							|  |  |  |       return NULL; | 
					
						
							| 
									
										
										
										
											2015-04-21 16:06:24 -06:00
										 |  |  |   } while (npp || m); | 
					
						
							|  |  |  |   return npp; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | static Int cont_current_predicate(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2001-10-03 13:39:16 +00:00
										 |  |  |   UInt Arity; | 
					
						
							| 
									
										
										
										
											2015-07-22 19:27:29 -05:00
										 |  |  |   Term name, task; | 
					
						
							| 
									
										
										
										
											2016-01-31 10:21:10 +00:00
										 |  |  |   Term t1 = ARG1, t2 = Deref(ARG2), t3 = ARG3; | 
					
						
							| 
									
										
										
										
											2015-10-22 00:45:21 +01:00
										 |  |  |   bool rc, will_cut = false; | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   Functor f; | 
					
						
							| 
									
										
										
										
											2015-04-21 16:06:24 -06:00
										 |  |  |   PredEntry *pp; | 
					
						
							|  |  |  |   t1 = Yap_YapStripModule(t1, &t2); | 
					
						
							|  |  |  |   t3 = Yap_YapStripModule(t3, &t2); | 
					
						
							| 
									
										
										
										
											2016-02-01 02:46:39 +00:00
										 |  |  |   t1 = Deref(t1); | 
					
						
							|  |  |  |   t2 = Deref(t2); | 
					
						
							| 
									
										
										
										
											2015-07-22 19:27:29 -05:00
										 |  |  |   task = Deref(ARG4); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-21 16:06:24 -06:00
										 |  |  |   pp = AddressOfTerm(EXTRA_CBACK_ARG(4, 1)); | 
					
						
							| 
									
										
										
										
											2015-10-22 00:45:21 +01:00
										 |  |  |   if (IsNonVarTerm(t3)) { | 
					
						
							| 
									
										
										
										
											2015-04-21 16:06:24 -06:00
										 |  |  |     PropEntry *np, *p; | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-05 16:12:07 +00:00
										 |  |  |     if (IsNonVarTerm(t2)) { | 
					
						
							|  |  |  |       // module and functor known, should be easy
 | 
					
						
							| 
									
										
										
										
											2016-05-12 11:50:30 +01:00
										 |  |  |       if (IsAtomTerm(t3)) { | 
					
						
							| 
									
										
										
										
											2015-11-05 16:12:07 +00:00
										 |  |  |         if ((p = Yap_GetPredPropByAtom(AtomOfTerm(t3), t2)) && | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |             valid_prop(p, task)) { | 
					
						
							| 
									
										
										
										
											2015-11-05 16:12:07 +00:00
										 |  |  |           cut_succeed(); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |           cut_fail(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       } else { | 
					
						
							|  |  |  |         if ((p = Yap_GetPredPropByFunc(FunctorOfTerm(t3), t2)) && | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |             valid_prop(p, task)) { | 
					
						
							| 
									
										
										
										
											2015-11-05 16:12:07 +00:00
										 |  |  |           cut_succeed(); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |           cut_fail(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-04-21 16:06:24 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // t3 is a functor, or compound term,
 | 
					
						
							|  |  |  |     // just follow the functor chain
 | 
					
						
							| 
									
										
										
										
											2015-10-22 00:45:21 +01:00
										 |  |  |     p = AbsPredProp(pp); | 
					
						
							| 
									
										
										
										
											2015-04-21 16:06:24 -06:00
										 |  |  |     if (!p) { | 
					
						
							|  |  |  |       // initial search, tracks down what is the first call with
 | 
					
						
							|  |  |  |       // that name, functor..
 | 
					
						
							| 
									
										
										
										
											2015-10-22 00:45:21 +01:00
										 |  |  |       p = initFunctorSearch(t3, t2, task); | 
					
						
							|  |  |  |       // now, we can do lookahead.
 | 
					
						
							| 
									
										
										
										
											2015-07-22 19:27:29 -05:00
										 |  |  |       if (p == NIL) | 
					
						
							|  |  |  |         cut_fail(); | 
					
						
							| 
									
										
										
										
											2015-10-22 00:45:21 +01:00
										 |  |  |       pp = RepPredProp(p); | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-11-05 16:12:07 +00:00
										 |  |  |     np = followLinkedListOfProps(p->NextOfPE, task); | 
					
						
							|  |  |  |     Term mod = pp->ModuleOfPred; | 
					
						
							|  |  |  |     if (mod == PROLOG_MODULE) | 
					
						
							|  |  |  |       mod = TermProlog; | 
					
						
							|  |  |  |     bool b = Yap_unify(t2, mod); | 
					
						
							|  |  |  |     if (!np) { | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |       if (b) | 
					
						
							|  |  |  |         cut_succeed(); | 
					
						
							|  |  |  |       else | 
					
						
							|  |  |  |         cut_fail(); | 
					
						
							| 
									
										
										
										
											2015-11-05 16:12:07 +00:00
										 |  |  |     } else { | 
					
						
							|  |  |  |       EXTRA_CBACK_ARG(4, 1) = MkAddressTerm(RepPredProp(np)); | 
					
						
							|  |  |  |       B->cp_h = HR; | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |       return b; | 
					
						
							| 
									
										
										
										
											2015-10-22 00:45:21 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-04-21 16:06:24 -06:00
										 |  |  |   } else if (IsNonVarTerm(t1)) { | 
					
						
							|  |  |  |     PropEntry *np, *p; | 
					
						
							| 
									
										
										
										
											2016-01-04 14:11:09 +00:00
										 |  |  |     // run over the same atom any predicate defined for that atom
 | 
					
						
							| 
									
										
										
										
											2015-04-21 16:06:24 -06:00
										 |  |  |     // may be fair bait, depends on whether we know the module.
 | 
					
						
							| 
									
										
										
										
											2015-10-22 00:45:21 +01:00
										 |  |  |     p = AbsPredProp(pp); | 
					
						
							| 
									
										
										
										
											2015-04-21 16:06:24 -06:00
										 |  |  |     if (!p) { | 
					
						
							|  |  |  |       // initialization time
 | 
					
						
							| 
									
										
										
										
											2015-10-22 00:45:21 +01:00
										 |  |  |       if (IsIntTerm(t1)) { | 
					
						
							|  |  |  |         // or this or nothing....
 | 
					
						
							|  |  |  |         p = AbsPredProp(Yap_FindLUIntKey(IntOfTerm(t3))); | 
					
						
							|  |  |  |       } else if (IsAtomTerm(t1)) { | 
					
						
							|  |  |  |         // should be the usual situation.
 | 
					
						
							|  |  |  |         Atom at = AtomOfTerm(t1); | 
					
						
							|  |  |  |         p = getPredProp(RepAtom(at)->PropsOfAE, task); | 
					
						
							| 
									
										
										
										
											2015-04-21 16:06:24 -06:00
										 |  |  |       } else { | 
					
						
							|  |  |  |         Yap_Error(TYPE_ERROR_CALLABLE, t1, "current_predicate/2"); | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |         return false; | 
					
						
							| 
									
										
										
										
											2015-04-21 16:06:24 -06:00
										 |  |  |       } | 
					
						
							|  |  |  |       if (!p) | 
					
						
							|  |  |  |         cut_fail(); | 
					
						
							|  |  |  |       pp = RepPredProp(p); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     // now, we can do lookahead.
 | 
					
						
							| 
									
										
										
										
											2015-07-22 19:27:29 -05:00
										 |  |  |     np = nextPredForAtom(p, task); | 
					
						
							| 
									
										
										
										
											2015-04-21 16:06:24 -06:00
										 |  |  |     if (!np) | 
					
						
							|  |  |  |       will_cut = true; | 
					
						
							|  |  |  |     else { | 
					
						
							|  |  |  |       EXTRA_CBACK_ARG(4, 1) = MkAddressTerm(RepPredProp(np)); | 
					
						
							| 
									
										
										
										
											2015-03-09 17:27:35 +00:00
										 |  |  |       B->cp_h = HR; | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |   } else if (IsNonVarTerm(t2)) { | 
					
						
							|  |  |  |     // operating within the same module.
 | 
					
						
							|  |  |  |     PredEntry *npp; | 
					
						
							| 
									
										
										
										
											2015-07-22 19:27:29 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-21 16:06:24 -06:00
										 |  |  |     if (!pp) { | 
					
						
							| 
									
										
										
										
											2015-10-22 00:45:21 +01:00
										 |  |  |       if (!IsAtomTerm(t2)) { | 
					
						
							| 
									
										
										
										
											2016-01-31 10:21:10 +00:00
										 |  |  |         Yap_Error(TYPE_ERROR_ATOM, t2, "module name"); | 
					
						
							| 
									
										
										
										
											2015-07-22 19:27:29 -05:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2015-04-21 16:06:24 -06:00
										 |  |  |       ModEntry *m = Yap_GetModuleEntry(t2); | 
					
						
							| 
									
										
										
										
											2016-08-05 16:34:05 -05:00
										 |  |  |       pp = m->PredForME; | 
					
						
							|  |  |  |       while (pp && !valid_prop(AbsPredProp(pp), task)) { | 
					
						
							|  |  |  |         pp = pp->NextPredOfModule; | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2016-01-31 10:21:10 +00:00
										 |  |  |       if (!pp) { | 
					
						
							| 
									
										
										
										
											2016-02-29 03:13:23 +00:00
										 |  |  |         /* try Prolog Module */ | 
					
						
							| 
									
										
										
										
											2016-03-05 23:18:57 +00:00
										 |  |  |         cut_fail(); | 
					
						
							| 
									
										
										
										
											2016-01-31 23:11:49 +00:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2015-04-21 16:06:24 -06:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-10-22 00:45:21 +01:00
										 |  |  |     npp = firstModulePred(pp, task); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-31 10:21:10 +00:00
										 |  |  |     if (!npp) { | 
					
						
							| 
									
										
										
										
											2016-03-05 23:18:57 +00:00
										 |  |  |       will_cut = true; | 
					
						
							| 
									
										
										
										
											2016-01-31 10:21:10 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-10-22 00:45:21 +01:00
										 |  |  |     // just try next one
 | 
					
						
							| 
									
										
										
										
											2015-04-21 16:06:24 -06:00
										 |  |  |     else { | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |       EXTRA_CBACK_ARG(4, 1) = MkAddressTerm(npp); | 
					
						
							| 
									
										
										
										
											2015-03-09 17:27:35 +00:00
										 |  |  |       B->cp_h = HR; | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2015-04-21 16:06:24 -06:00
										 |  |  |     // operating across all modules.
 | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |     PredEntry *npp = pp; | 
					
						
							|  |  |  |     ModEntry *me; | 
					
						
							| 
									
										
										
										
											2016-02-29 03:13:23 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-21 16:06:24 -06:00
										 |  |  |     if (!pp) { | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |       pp = firstModulesPred(CurrentModules->PredForME, CurrentModules, task); | 
					
						
							| 
									
										
										
										
											2015-04-21 16:06:24 -06:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |     if (!pp) | 
					
						
							|  |  |  |       cut_fail(); | 
					
						
							|  |  |  |     if (pp->ModuleOfPred == PROLOG_MODULE) | 
					
						
							|  |  |  |       me = Yap_GetModuleEntry(TermProlog); | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       me = Yap_GetModuleEntry(pp->ModuleOfPred); | 
					
						
							|  |  |  |     npp = firstModulesPred(pp->NextPredOfModule, me, task); | 
					
						
							| 
									
										
										
										
											2015-04-21 16:06:24 -06:00
										 |  |  |     if (!npp) | 
					
						
							|  |  |  |       will_cut = true; | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |     // just try next module.
 | 
					
						
							| 
									
										
										
										
											2015-04-13 13:28:17 +01:00
										 |  |  |     else { | 
					
						
							| 
									
										
										
										
											2015-04-21 16:06:24 -06:00
										 |  |  |       EXTRA_CBACK_ARG(4, 1) = MkAddressTerm(npp); | 
					
						
							| 
									
										
										
										
											2015-04-13 13:28:17 +01:00
										 |  |  |       B->cp_h = HR; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-08-14 16:00:54 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2015-04-13 13:28:17 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-02-12 12:37:12 +00:00
										 |  |  |   if (pp->ModuleOfPred != IDB_MODULE) { | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |     f = pp->FunctorOfPred; | 
					
						
							| 
									
										
										
										
											2003-10-28 01:16:03 +00:00
										 |  |  |     Arity = pp->ArityOfPE; | 
					
						
							|  |  |  |     if (Arity) | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |       name = MkAtomTerm(NameOfFunctor(f)); | 
					
						
							| 
									
										
										
										
											2003-10-28 01:16:03 +00:00
										 |  |  |     else | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |       name = MkAtomTerm((Atom)f); | 
					
						
							| 
									
										
										
										
											2003-10-28 01:16:03 +00:00
										 |  |  |   } else { | 
					
						
							|  |  |  |     if (pp->PredFlags & NumberDBPredFlag) { | 
					
						
							|  |  |  |       name = MkIntegerTerm(pp->src.IndxId); | 
					
						
							|  |  |  |       Arity = 0; | 
					
						
							|  |  |  |     } else if (pp->PredFlags & AtomDBPredFlag) { | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |       f = pp->FunctorOfPred; | 
					
						
							|  |  |  |       name = MkAtomTerm((Atom)f); | 
					
						
							| 
									
										
										
										
											2003-10-28 01:16:03 +00:00
										 |  |  |       Arity = 0; | 
					
						
							|  |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |       f = pp->FunctorOfPred; | 
					
						
							| 
									
										
										
										
											2003-10-28 01:16:03 +00:00
										 |  |  |       name = MkAtomTerm(NameOfFunctor(f)); | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |       Arity = ArityOfFunctor(pp->FunctorOfPred); | 
					
						
							| 
									
										
										
										
											2003-10-28 01:16:03 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   if (Arity) { | 
					
						
							| 
									
										
										
										
											2016-01-31 10:21:10 +00:00
										 |  |  |     rc = Yap_unify(ARG3, Yap_MkNewApplTerm(f, Arity)); | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2016-01-31 10:21:10 +00:00
										 |  |  |     rc = Yap_unify(ARG3, name); | 
					
						
							| 
									
										
										
										
											2015-04-21 16:06:24 -06:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2016-02-29 03:13:23 +00:00
										 |  |  |   rc = rc && (IsAtomTerm(t2) || Yap_unify(ARG2, ModToTerm(pp->ModuleOfPred))) && | 
					
						
							|  |  |  |        Yap_unify(ARG1, name); | 
					
						
							| 
									
										
										
										
											2015-04-21 16:06:24 -06:00
										 |  |  |   if (will_cut) { | 
					
						
							| 
									
										
										
										
											2015-10-22 00:45:21 +01:00
										 |  |  |     if (rc) | 
					
						
							|  |  |  |       cut_succeed(); | 
					
						
							| 
									
										
										
										
											2015-04-21 16:06:24 -06:00
										 |  |  |     cut_fail(); | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2015-04-21 16:06:24 -06:00
										 |  |  |   return rc; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-22 19:27:29 -05:00
										 |  |  | static Int current_predicate(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2015-04-21 16:06:24 -06:00
										 |  |  |   EXTRA_CBACK_ARG(4, 1) = MkAddressTerm(NULL); | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   // ensure deref access to choice-point fields.
 | 
					
						
							|  |  |  |   return cont_current_predicate(PASS_REGS1); | 
					
						
							| 
									
										
										
										
											2002-09-02 17:33:00 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | static OpEntry *NextOp(OpEntry *pp USES_REGS) { | 
					
						
							| 
									
										
										
										
											2009-11-27 16:09:48 +00:00
										 |  |  |   while (!EndOfPAEntr(pp) && pp->KindOfPE != OpProperty && | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |          (pp->OpModule != PROLOG_MODULE || pp->OpModule != CurrentModule)) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     pp = RepOpProp(pp->NextOfPE); | 
					
						
							|  |  |  |   return (pp); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | int Yap_IsOp(Atom at) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   OpEntry *op = NextOp(RepOpProp((Prop)(RepAtom(at)->PropsOfAE)) PASS_REGS); | 
					
						
							| 
									
										
										
										
											2009-11-27 16:09:48 +00:00
										 |  |  |   return (!EndOfPAEntr(op)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | int Yap_IsOpMaxPrio(Atom at) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   OpEntry *op = NextOp(RepOpProp((Prop)(RepAtom(at)->PropsOfAE)) PASS_REGS); | 
					
						
							| 
									
										
										
										
											2010-02-26 14:14:10 +00:00
										 |  |  |   int max; | 
					
						
							| 
									
										
										
										
											2015-04-13 13:28:17 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-26 14:14:10 +00:00
										 |  |  |   if (EndOfPAEntr(op)) | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  |   max = (op->Prefix & 0xfff); | 
					
						
							|  |  |  |   if ((op->Infix & 0xfff) > max) | 
					
						
							|  |  |  |     max = op->Infix & 0xfff; | 
					
						
							|  |  |  |   if ((op->Posfix & 0xfff) > max) | 
					
						
							|  |  |  |     max = op->Posfix & 0xfff; | 
					
						
							|  |  |  |   return max; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-28 19:32:55 +00:00
										 |  |  | static Int unify_op(OpEntry *op USES_REGS) { | 
					
						
							| 
									
										
										
										
											2009-11-25 00:38:47 +00:00
										 |  |  |   Term tmod = op->OpModule; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-28 19:32:55 +00:00
										 |  |  |   if (tmod == PROLOG_MODULE) | 
					
						
							|  |  |  |     tmod = TermProlog; | 
					
						
							|  |  |  |   return Yap_unify_constant(ARG2, tmod) && | 
					
						
							|  |  |  |          Yap_unify_constant(ARG3, MkIntegerTerm(op->Prefix)) && | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |          Yap_unify_constant(ARG4, MkIntegerTerm(op->Infix)) && | 
					
						
							|  |  |  |          Yap_unify_constant(ARG5, MkIntegerTerm(op->Posfix)); | 
					
						
							| 
									
										
										
										
											2009-11-25 00:38:47 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | static Int cont_current_op(USES_REGS1) { | 
					
						
							|  |  |  |   OpEntry *op = (OpEntry *)IntegerOfTerm(EXTRA_CBACK_ARG(5, 1)), *next; | 
					
						
							| 
									
										
										
										
											2016-02-28 19:32:55 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-25 00:38:47 +00:00
										 |  |  |   READ_LOCK(op->OpRWLock); | 
					
						
							|  |  |  |   next = op->OpNext; | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   if (Yap_unify_constant(ARG1, MkAtomTerm(op->OpName)) && | 
					
						
							| 
									
										
										
										
											2016-02-28 19:32:55 +00:00
										 |  |  |       unify_op(op PASS_REGS)) { | 
					
						
							| 
									
										
										
										
											2009-12-17 16:11:02 -02:00
										 |  |  |     READ_UNLOCK(op->OpRWLock); | 
					
						
							| 
									
										
										
										
											2009-11-25 00:38:47 +00:00
										 |  |  |     if (next) { | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |       EXTRA_CBACK_ARG(5, 1) = (CELL)MkIntegerTerm((CELL)next); | 
					
						
							| 
									
										
										
										
											2015-04-13 13:28:17 +01:00
										 |  |  |       B->cp_h = HR; | 
					
						
							| 
									
										
										
										
											2009-11-25 00:38:47 +00:00
										 |  |  |       return TRUE; | 
					
						
							|  |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       cut_succeed(); | 
					
						
							| 
									
										
										
										
											2009-11-25 00:38:47 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2009-12-17 16:11:02 -02:00
										 |  |  |     READ_UNLOCK(op->OpRWLock); | 
					
						
							| 
									
										
										
										
											2009-11-25 00:38:47 +00:00
										 |  |  |     if (next) { | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |       EXTRA_CBACK_ARG(5, 1) = (CELL)MkIntegerTerm((CELL)next); | 
					
						
							| 
									
										
										
										
											2016-02-28 19:32:55 +00:00
										 |  |  |       B->cp_h = HR; | 
					
						
							| 
									
										
										
										
											2009-11-25 00:38:47 +00:00
										 |  |  |       return FALSE; | 
					
						
							| 
									
										
										
										
											2006-04-28 13:23:23 +00:00
										 |  |  |     } else { | 
					
						
							|  |  |  |       cut_fail(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-11-25 00:38:47 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-22 00:45:21 +01:00
										 |  |  | static Int init_current_op( | 
					
						
							|  |  |  |     USES_REGS1) { /* current_op(-Precedence,-Type,-Atom)		 */ | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   EXTRA_CBACK_ARG(5, 1) = (CELL)MkIntegerTerm((CELL)OpList); | 
					
						
							| 
									
										
										
										
											2015-03-09 17:27:35 +00:00
										 |  |  |   B->cp_h = HR; | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   return cont_current_op(PASS_REGS1); | 
					
						
							| 
									
										
										
										
											2009-11-25 00:38:47 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | static Int cont_current_atom_op(USES_REGS1) { | 
					
						
							|  |  |  |   OpEntry *op = (OpEntry *)IntegerOfTerm(EXTRA_CBACK_ARG(5, 1)), *next; | 
					
						
							| 
									
										
										
										
											2015-04-13 13:28:17 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-25 00:38:47 +00:00
										 |  |  |   READ_LOCK(op->OpRWLock); | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   next = NextOp(RepOpProp(op->NextOfPE) PASS_REGS); | 
					
						
							| 
									
										
										
										
											2016-02-28 19:32:55 +00:00
										 |  |  |   if (unify_op(op PASS_REGS)) { | 
					
						
							| 
									
										
										
										
											2009-12-17 16:11:02 -02:00
										 |  |  |     READ_UNLOCK(op->OpRWLock); | 
					
						
							| 
									
										
										
										
											2009-11-25 00:38:47 +00:00
										 |  |  |     if (next) { | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |       EXTRA_CBACK_ARG(5, 1) = (CELL)MkIntegerTerm((CELL)next); | 
					
						
							| 
									
										
										
										
											2015-03-09 17:27:35 +00:00
										 |  |  |       B->cp_h = HR; | 
					
						
							| 
									
										
										
										
											2009-11-25 00:38:47 +00:00
										 |  |  |       return TRUE; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       cut_succeed(); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2006-04-28 13:23:23 +00:00
										 |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2009-12-17 16:11:02 -02:00
										 |  |  |     READ_UNLOCK(op->OpRWLock); | 
					
						
							| 
									
										
										
										
											2009-11-25 00:38:47 +00:00
										 |  |  |     if (next) { | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |       EXTRA_CBACK_ARG(5, 1) = (CELL)MkIntegerTerm((CELL)next); | 
					
						
							| 
									
										
										
										
											2015-03-09 17:27:35 +00:00
										 |  |  |       B->cp_h = HR; | 
					
						
							| 
									
										
										
										
											2009-11-25 00:38:47 +00:00
										 |  |  |       return FALSE; | 
					
						
							|  |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2006-04-28 13:23:23 +00:00
										 |  |  |       cut_fail(); | 
					
						
							| 
									
										
										
										
											2009-11-25 00:38:47 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2009-11-25 00:38:47 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | static Int init_current_atom_op( | 
					
						
							|  |  |  |     USES_REGS1) { /* current_op(-Precedence,-Type,-Atom)		 */ | 
					
						
							| 
									
										
										
										
											2009-11-25 00:38:47 +00:00
										 |  |  |   Term t = Deref(ARG1); | 
					
						
							|  |  |  |   AtomEntry *ae; | 
					
						
							|  |  |  |   OpEntry *ope; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (IsVarTerm(t) || !IsAtomTerm(t)) { | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |     Yap_Error(TYPE_ERROR_ATOM, t, "current_op/3"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     cut_fail(); | 
					
						
							| 
									
										
										
										
											2009-11-25 00:38:47 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   ae = RepAtom(AtomOfTerm(t)); | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   if (EndOfPAEntr((ope = NextOp(RepOpProp(ae->PropsOfAE) PASS_REGS)))) { | 
					
						
							| 
									
										
										
										
											2009-11-25 00:38:47 +00:00
										 |  |  |     cut_fail(); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   EXTRA_CBACK_ARG(5, 1) = (CELL)MkIntegerTerm((Int)ope); | 
					
						
							| 
									
										
										
										
											2015-03-09 17:27:35 +00:00
										 |  |  |   B->cp_h = HR; | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   return cont_current_atom_op(PASS_REGS1); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-03 11:15:17 -05:00
										 |  |  | #if 0
 | 
					
						
							| 
									
										
										
										
											2016-05-12 11:50:30 +01:00
										 |  |  | static Int | 
					
						
							|  |  |  |     copy_local_ops(USES_REGS1) { /* current_op(-Precedence,-Type,-Atom) */ | 
					
						
							|  |  |  |   Term tmodin = Deref(ARG1); | 
					
						
							|  |  |  |   Term t = Deref(ARG1); | 
					
						
							| 
									
										
										
										
											2016-04-28 15:01:16 +01:00
										 |  |  |   AtomEntry *ae; | 
					
						
							|  |  |  |   OpEntry *ope; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (IsVarTerm(t) || !IsAtomTerm(t)) { | 
					
						
							|  |  |  |     Yap_Error(TYPE_ERROR_ATOM, t, "current_op/3"); | 
					
						
							|  |  |  |     cut_fail(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   ae = RepAtom(AtomOfTerm(t)); | 
					
						
							|  |  |  |   if (EndOfPAEntr((ope = NextOp(RepOpProp(ae->PropsOfAE) PASS_REGS)))) { | 
					
						
							|  |  |  |     cut_fail(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   EXTRA_CBACK_ARG(5, 1) = (CELL)MkIntegerTerm((Int)ope); | 
					
						
							|  |  |  |   B->cp_h = HR; | 
					
						
							|  |  |  |   return cont_current_atom_op(PASS_REGS1); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2016-08-03 11:15:17 -05:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2016-04-28 15:01:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | void Yap_show_statistics(void) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2006-05-18 16:33:05 +00:00
										 |  |  |   unsigned long int heap_space_taken; | 
					
						
							|  |  |  |   double frag; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if USE_SYSTEM_MALLOC && HAVE_MALLINFO
 | 
					
						
							|  |  |  |   struct mallinfo mi = mallinfo(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   heap_space_taken = (mi.arena + mi.hblkhd) - Yap_HoleSize; | 
					
						
							| 
									
										
										
										
											2006-05-18 16:33:05 +00:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   heap_space_taken = | 
					
						
							|  |  |  |       (unsigned long int)(Unsigned(HeapTop) - Unsigned(Yap_HeapBase)) - | 
					
						
							|  |  |  |       Yap_HoleSize; | 
					
						
							| 
									
										
										
										
											2006-05-18 16:33:05 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   frag = (100.0 * (heap_space_taken - HeapUsed)) / heap_space_taken; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-19 00:40:48 +01:00
										 |  |  |   fprintf(stderr, "Code Space:  %ld (%ld bytes needed, %ld bytes used, " | 
					
						
							| 
									
										
										
										
											2015-10-22 00:45:21 +01:00
										 |  |  |                   "fragmentation %.3f%%).\n", | 
					
						
							|  |  |  |           (unsigned long int)(Unsigned(H0) - Unsigned(Yap_HeapBase)), | 
					
						
							|  |  |  |           (unsigned long int)(Unsigned(HeapTop) - Unsigned(Yap_HeapBase)), | 
					
						
							|  |  |  |           (unsigned long int)(HeapUsed), frag); | 
					
						
							| 
									
										
										
										
											2015-06-19 00:40:48 +01:00
										 |  |  |   fprintf(stderr, "Stack Space: %ld (%ld for Global, %ld for local).\n", | 
					
						
							| 
									
										
										
										
											2015-10-22 00:45:21 +01:00
										 |  |  |           (unsigned long int)(sizeof(CELL) * (LCL0 - H0)), | 
					
						
							|  |  |  |           (unsigned long int)(sizeof(CELL) * (HR - H0)), | 
					
						
							|  |  |  |           (unsigned long int)(sizeof(CELL) * (LCL0 - ASP))); | 
					
						
							| 
									
										
										
										
											2015-06-19 00:40:48 +01:00
										 |  |  |   fprintf(stderr, "Trail Space: %ld (%ld used).\n", | 
					
						
							| 
									
										
										
										
											2015-10-22 00:45:21 +01:00
										 |  |  |           (unsigned long int)(sizeof(tr_fr_ptr) * (Unsigned(LOCAL_TrailTop) - | 
					
						
							|  |  |  |                                                    Unsigned(LOCAL_TrailBase))), | 
					
						
							|  |  |  |           (unsigned long int)(sizeof(tr_fr_ptr) * | 
					
						
							|  |  |  |                               (Unsigned(TR) - Unsigned(LOCAL_TrailBase)))); | 
					
						
							|  |  |  |   fprintf(stderr, "Runtime: %lds.\n", (unsigned long int)(runtime(PASS_REGS1))); | 
					
						
							|  |  |  |   fprintf(stderr, "Cputime: %lds.\n", (unsigned long int)(Yap_cputime())); | 
					
						
							| 
									
										
										
										
											2016-08-21 23:31:21 -05:00
										 |  |  |   fprintf(stderr, "Walltime: "UInt_F".\n", (UInt)(Yap_walltime() / 1000)); | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static Int p_statistics_heap_max(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   Term tmax = MkIntegerTerm(HeapMax); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   return (Yap_unify(tmax, ARG1)); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* The results of the next routines are not to be trusted too */ | 
					
						
							|  |  |  | /* much. Basically, any stack shifting will seriously confuse the */ | 
					
						
							|  |  |  | /* results */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | static Int TrailTide = -1, LocalTide = -1, GlobalTide = -1; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* maximum Trail usage */ | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | static Int TrailMax(void) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   Int i; | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |   Int TrWidth = Unsigned(LOCAL_TrailTop) - Unsigned(LOCAL_TrailBase); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   CELL *pt; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (TrailTide != TrWidth) { | 
					
						
							|  |  |  |     pt = (CELL *)TR; | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |     while (pt + 2 < (CELL *)LOCAL_TrailTop) { | 
					
						
							|  |  |  |       if (pt[0] == 0 && pt[1] == 0 && pt[2] == 0) | 
					
						
							|  |  |  |         break; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       else | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |         pt++; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |     if (pt + 2 < (CELL *)LOCAL_TrailTop) | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |       i = Unsigned(pt) - Unsigned(LOCAL_TrailBase); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     else | 
					
						
							|  |  |  |       i = TrWidth; | 
					
						
							|  |  |  |   } else | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |     return (TrWidth); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   if (TrailTide > i) | 
					
						
							|  |  |  |     i = TrailTide; | 
					
						
							|  |  |  |   else | 
					
						
							|  |  |  |     TrailTide = i; | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   return (i); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | static Int p_statistics_trail_max(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   Term tmax = MkIntegerTerm(TrailMax()); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   return (Yap_unify(tmax, ARG1)); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* maximum Global usage */ | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | static Int GlobalMax(void) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   Int i; | 
					
						
							|  |  |  |   Int StkWidth = Unsigned(LCL0) - Unsigned(H0); | 
					
						
							|  |  |  |   CELL *pt; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (GlobalTide != StkWidth) { | 
					
						
							| 
									
										
										
										
											2014-01-19 21:15:05 +00:00
										 |  |  |     pt = HR; | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |     while (pt + 2 < ASP) { | 
					
						
							|  |  |  |       if (pt[0] == 0 && pt[1] == 0 && pt[2] == 0) | 
					
						
							|  |  |  |         break; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       else | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |         pt++; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |     if (pt + 2 < ASP) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       i = Unsigned(pt) - Unsigned(H0); | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       /* so that both Local and Global have reached maximum width */ | 
					
						
							|  |  |  |       GlobalTide = LocalTide = i = StkWidth; | 
					
						
							|  |  |  |   } else | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |     return (StkWidth); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   if (GlobalTide > i) | 
					
						
							|  |  |  |     i = GlobalTide; | 
					
						
							|  |  |  |   else | 
					
						
							|  |  |  |     GlobalTide = i; | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   return (i); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | static Int p_statistics_global_max(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   Term tmax = MkIntegerTerm(GlobalMax()); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   return (Yap_unify(tmax, ARG1)); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | static Int LocalMax(void) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   Int i; | 
					
						
							|  |  |  |   Int StkWidth = Unsigned(LCL0) - Unsigned(H0); | 
					
						
							|  |  |  |   CELL *pt; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (LocalTide != StkWidth) { | 
					
						
							|  |  |  |     pt = LCL0; | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |     while (pt - 3 > HR) { | 
					
						
							|  |  |  |       if (pt[-1] == 0 && pt[-2] == 0 && pt[-3] == 0) | 
					
						
							|  |  |  |         break; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       else | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |         --pt; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |     if (pt - 3 > HR) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       i = Unsigned(LCL0) - Unsigned(pt); | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       /* so that both Local and Global have reached maximum width */ | 
					
						
							|  |  |  |       GlobalTide = LocalTide = i = StkWidth; | 
					
						
							|  |  |  |   } else | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |     return (StkWidth); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   if (LocalTide > i) | 
					
						
							|  |  |  |     i = LocalTide; | 
					
						
							|  |  |  |   else | 
					
						
							|  |  |  |     LocalTide = i; | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   return (i); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | static Int p_statistics_local_max(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   Term tmax = MkIntegerTerm(LocalMax()); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   return (Yap_unify(tmax, ARG1)); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | static Int p_statistics_heap_info(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   Term tusage = MkIntegerTerm(HeapUsed); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-05-18 16:33:05 +00:00
										 |  |  | #if USE_SYSTEM_MALLOC && HAVE_MALLINFO
 | 
					
						
							|  |  |  |   struct mallinfo mi = mallinfo(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   UInt sstack = Yap_HoleSize + (LOCAL_TrailTop - LOCAL_GlobalBase); | 
					
						
							|  |  |  |   UInt mmax = (mi.arena + mi.hblkhd); | 
					
						
							|  |  |  |   Term tmax = MkIntegerTerm(mmax - sstack); | 
					
						
							|  |  |  |   tusage = MkIntegerTerm(mmax - (mi.fordblks + sstack)); | 
					
						
							| 
									
										
										
										
											2006-05-18 16:33:05 +00:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   Term tmax = MkIntegerTerm((LOCAL_GlobalBase - Yap_HeapBase) - Yap_HoleSize); | 
					
						
							| 
									
										
										
										
											2006-05-18 16:33:05 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   return (Yap_unify(tmax, ARG1) && Yap_unify(tusage, ARG2)); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | static Int p_statistics_stacks_info(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   Term tmax = MkIntegerTerm(Unsigned(LCL0) - Unsigned(H0)); | 
					
						
							| 
									
										
										
										
											2014-01-19 21:15:05 +00:00
										 |  |  |   Term tgusage = MkIntegerTerm(Unsigned(HR) - Unsigned(H0)); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   Term tlusage = MkIntegerTerm(Unsigned(LCL0) - Unsigned(ASP)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   return (Yap_unify(tmax, ARG1) && Yap_unify(tgusage, ARG2) && | 
					
						
							|  |  |  |           Yap_unify(tlusage, ARG3)); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | static Int p_statistics_trail_info(USES_REGS1) { | 
					
						
							|  |  |  |   Term tmax = | 
					
						
							|  |  |  |       MkIntegerTerm(Unsigned(LOCAL_TrailTop) - Unsigned(LOCAL_TrailBase)); | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |   Term tusage = MkIntegerTerm(Unsigned(TR) - Unsigned(LOCAL_TrailBase)); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   return (Yap_unify(tmax, ARG1) && Yap_unify(tusage, ARG2)); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | static Int p_statistics_atom_info(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2006-09-01 20:14:42 +00:00
										 |  |  |   UInt count = 0, spaceused = 0, i; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   for (i = 0; i < AtomHashTableSize; i++) { | 
					
						
							| 
									
										
										
										
											2006-09-01 20:14:42 +00:00
										 |  |  |     Atom catom; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-10-10 14:08:17 +00:00
										 |  |  |     READ_LOCK(HashChain[i].AERWLock); | 
					
						
							| 
									
										
										
										
											2006-09-01 20:14:42 +00:00
										 |  |  |     catom = HashChain[i].Entry; | 
					
						
							|  |  |  |     if (catom != NIL) { | 
					
						
							|  |  |  |       READ_LOCK(RepAtom(catom)->ARWLock); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     READ_UNLOCK(HashChain[i].AERWLock); | 
					
						
							|  |  |  |     while (catom != NIL) { | 
					
						
							|  |  |  |       Atom ncatom; | 
					
						
							|  |  |  |       count++; | 
					
						
							| 
									
										
										
										
											2015-10-22 00:45:21 +01:00
										 |  |  |       spaceused += | 
					
						
							|  |  |  |           sizeof(AtomEntry) + strlen((char *)RepAtom(catom)->StrOfAE) + 1; | 
					
						
							| 
									
										
										
										
											2006-09-01 20:14:42 +00:00
										 |  |  |       ncatom = RepAtom(catom)->NextOfAE; | 
					
						
							|  |  |  |       if (ncatom != NIL) { | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |         READ_LOCK(RepAtom(ncatom)->ARWLock); | 
					
						
							| 
									
										
										
										
											2006-09-01 20:14:42 +00:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2013-01-23 09:55:11 +00:00
										 |  |  |       READ_UNLOCK(RepAtom(catom)->ARWLock); | 
					
						
							| 
									
										
										
										
											2006-09-01 20:14:42 +00:00
										 |  |  |       catom = ncatom; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   for (i = 0; i < WideAtomHashTableSize; i++) { | 
					
						
							| 
									
										
										
										
											2006-11-27 17:42:03 +00:00
										 |  |  |     Atom catom; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     READ_LOCK(WideHashChain[i].AERWLock); | 
					
						
							|  |  |  |     catom = WideHashChain[i].Entry; | 
					
						
							|  |  |  |     if (catom != NIL) { | 
					
						
							|  |  |  |       READ_LOCK(RepAtom(catom)->ARWLock); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     READ_UNLOCK(WideHashChain[i].AERWLock); | 
					
						
							|  |  |  |     while (catom != NIL) { | 
					
						
							|  |  |  |       Atom ncatom; | 
					
						
							|  |  |  |       count++; | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |       spaceused += | 
					
						
							|  |  |  |           sizeof(AtomEntry) + | 
					
						
							|  |  |  |           sizeof(wchar_t) * (wcslen((wchar_t *)(RepAtom(catom)->StrOfAE) + 1)); | 
					
						
							| 
									
										
										
										
											2006-11-27 17:42:03 +00:00
										 |  |  |       ncatom = RepAtom(catom)->NextOfAE; | 
					
						
							|  |  |  |       if (ncatom != NIL) { | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |         READ_LOCK(RepAtom(ncatom)->ARWLock); | 
					
						
							| 
									
										
										
										
											2006-11-27 17:42:03 +00:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2013-01-23 09:55:11 +00:00
										 |  |  |       READ_UNLOCK(RepAtom(catom)->ARWLock); | 
					
						
							| 
									
										
										
										
											2006-11-27 17:42:03 +00:00
										 |  |  |       catom = ncatom; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2006-09-01 20:14:42 +00:00
										 |  |  |   return Yap_unify(ARG1, MkIntegerTerm(count)) && | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |          Yap_unify(ARG2, MkIntegerTerm(spaceused)); | 
					
						
							| 
									
										
										
										
											2006-09-01 20:14:42 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | static Int p_statistics_db_size(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2006-11-06 18:35:05 +00:00
										 |  |  |   Term t = MkIntegerTerm(Yap_ClauseSpace); | 
					
						
							|  |  |  |   Term tit = MkIntegerTerm(Yap_IndexSpace_Tree); | 
					
						
							|  |  |  |   Term tis = MkIntegerTerm(Yap_IndexSpace_SW); | 
					
						
							|  |  |  |   Term tie = MkIntegerTerm(Yap_IndexSpace_EXT); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   return Yap_unify(t, ARG1) && Yap_unify(tit, ARG2) && Yap_unify(tis, ARG3) && | 
					
						
							|  |  |  |          Yap_unify(tie, ARG4); | 
					
						
							| 
									
										
										
										
											2006-11-06 18:35:05 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | static Int p_statistics_lu_db_size(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2006-11-06 18:35:05 +00:00
										 |  |  |   Term t = MkIntegerTerm(Yap_LUClauseSpace); | 
					
						
							|  |  |  |   Term tit = MkIntegerTerm(Yap_LUIndexSpace_Tree); | 
					
						
							|  |  |  |   Term tic = MkIntegerTerm(Yap_LUIndexSpace_CP); | 
					
						
							|  |  |  |   Term tix = MkIntegerTerm(Yap_LUIndexSpace_EXT); | 
					
						
							|  |  |  |   Term tis = MkIntegerTerm(Yap_LUIndexSpace_SW); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   return Yap_unify(t, ARG1) && Yap_unify(tit, ARG2) && Yap_unify(tic, ARG3) && | 
					
						
							|  |  |  |          Yap_unify(tis, ARG4) && Yap_unify(tix, ARG5); | 
					
						
							| 
									
										
										
										
											2006-11-06 18:35:05 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | static Int p_executable(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2013-01-13 17:55:13 +00:00
										 |  |  |   if (GLOBAL_argv && GLOBAL_argv[0]) | 
					
						
							| 
									
										
										
										
											2016-05-12 11:50:30 +01:00
										 |  |  |     Yap_findFile(GLOBAL_argv[0], NULL, NULL, LOCAL_FileNameBuf, true, YAP_EXE, | 
					
						
							|  |  |  |                  true, true); | 
					
						
							| 
									
										
										
										
											2013-01-13 17:55:13 +00:00
										 |  |  |   else | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |     strncpy(LOCAL_FileNameBuf, Yap_FindExecutable(), YAP_FILENAME_MAX - 1); | 
					
						
							| 
									
										
										
										
											2013-01-13 17:55:13 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   return Yap_unify(MkAtomTerm(Yap_LookupAtom(LOCAL_FileNameBuf)), ARG1); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | static Int p_system_mode(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2013-12-10 22:58:02 +00:00
										 |  |  |   Term t1 = Deref(ARG1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (IsVarTerm(t1)) { | 
					
						
							|  |  |  |     if (LOCAL_PrologMode & SystemMode) | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |       return Yap_unify(t1, MkAtomTerm(AtomTrue)); | 
					
						
							| 
									
										
										
										
											2013-12-10 22:58:02 +00:00
										 |  |  |     else | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |       return Yap_unify(t1, MkAtomTerm(AtomFalse)); | 
					
						
							| 
									
										
										
										
											2013-12-10 22:58:02 +00:00
										 |  |  |   } else { | 
					
						
							|  |  |  |     Atom at = AtomOfTerm(t1); | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |     if (at == AtomFalse) | 
					
						
							| 
									
										
										
										
											2013-12-10 22:58:02 +00:00
										 |  |  |       LOCAL_PrologMode &= ~SystemMode; | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       LOCAL_PrologMode |= SystemMode; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2006-12-13 16:10:26 +00:00
										 |  |  |   return TRUE; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | static Int p_lock_system(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2011-05-10 10:06:51 +01:00
										 |  |  |   LOCK(GLOBAL_BGL); | 
					
						
							| 
									
										
										
										
											2003-12-01 17:27:42 +00:00
										 |  |  |   return TRUE; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | static Int p_unlock_system(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2011-05-10 10:06:51 +01:00
										 |  |  |   UNLOCK(GLOBAL_BGL); | 
					
						
							| 
									
										
										
										
											2003-12-01 17:27:42 +00:00
										 |  |  |   return TRUE; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  | static Int enter_undefp(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |   if (LOCAL_DoingUndefp) { | 
					
						
							| 
									
										
										
										
											2004-12-08 04:45:04 +00:00
										 |  |  |     return FALSE; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |   LOCAL_DoingUndefp = TRUE; | 
					
						
							| 
									
										
										
										
											2004-12-08 04:45:04 +00:00
										 |  |  |   return TRUE; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  | static Int exit_undefp(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |   if (LOCAL_DoingUndefp) { | 
					
						
							|  |  |  |     LOCAL_DoingUndefp = FALSE; | 
					
						
							| 
									
										
										
										
											2004-12-08 04:45:04 +00:00
										 |  |  |     return TRUE; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return FALSE; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #ifdef DEBUG
 | 
					
						
							|  |  |  | extern void DumpActiveGoals(void); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | static Int p_dump_active_goals(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   DumpActiveGoals(); | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   return (TRUE); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-03-04 03:25:41 +00:00
										 |  |  | #ifdef INES
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | static Int p_euc_dist(USES_REGS1) { | 
					
						
							| 
									
										
										
										
											2002-03-04 03:25:41 +00:00
										 |  |  |   Term t1 = Deref(ARG1); | 
					
						
							|  |  |  |   Term t2 = Deref(ARG2); | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   double d1 = (double)(IntegerOfTerm(ArgOfTerm(1, t1)) - | 
					
						
							|  |  |  |                        IntegerOfTerm(ArgOfTerm(1, t2))); | 
					
						
							|  |  |  |   double d2 = (double)(IntegerOfTerm(ArgOfTerm(2, t1)) - | 
					
						
							|  |  |  |                        IntegerOfTerm(ArgOfTerm(2, t2))); | 
					
						
							|  |  |  |   double d3 = (double)(IntegerOfTerm(ArgOfTerm(3, t1)) - | 
					
						
							|  |  |  |                        IntegerOfTerm(ArgOfTerm(3, t2))); | 
					
						
							|  |  |  |   Int result = (Int)sqrt(d1 * d1 + d2 * d2 + d3 * d3); | 
					
						
							|  |  |  |   return (Yap_unify(ARG3, MkIntegerTerm(result))); | 
					
						
							| 
									
										
										
										
											2002-03-04 03:25:41 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2002-03-08 06:32:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | volatile int loop_counter = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | static Int p_loop(USES_REGS1) { | 
					
						
							|  |  |  |   while (loop_counter == 0) | 
					
						
							|  |  |  |     ; | 
					
						
							|  |  |  |   return (TRUE); | 
					
						
							| 
									
										
										
										
											2002-03-08 06:32:11 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2002-03-04 03:25:41 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | static Int p_break(USES_REGS1) { | 
					
						
							|  |  |  |   Atom at = AtomOfTerm(Deref(ARG1)); | 
					
						
							| 
									
										
										
										
											2013-11-15 15:45:55 +00:00
										 |  |  |   if (at == AtomTrue) { | 
					
						
							| 
									
										
										
										
											2015-06-19 00:37:09 +01:00
										 |  |  |     LOCAL_BreakLevel++; | 
					
						
							| 
									
										
										
										
											2013-11-15 15:45:55 +00:00
										 |  |  |     return TRUE; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (at == AtomFalse) { | 
					
						
							| 
									
										
										
										
											2015-06-19 00:41:12 +01:00
										 |  |  |     LOCAL_BreakLevel--; | 
					
						
							| 
									
										
										
										
											2013-11-15 15:45:55 +00:00
										 |  |  |     return TRUE; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return FALSE; | 
					
						
							| 
									
										
										
										
											2005-10-28 17:38:50 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | void Yap_InitBackCPreds(void) { | 
					
						
							| 
									
										
										
										
											2016-05-12 11:50:30 +01:00
										 |  |  |   Yap_InitCPredBack("$current_predicate", 4, 1, current_predicate, | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |                     cont_current_predicate, SafePredFlag | SyncPredFlag); | 
					
						
							| 
									
										
										
										
											2009-11-25 00:38:47 +00:00
										 |  |  |   Yap_InitCPredBack("$current_op", 5, 1, init_current_op, cont_current_op, | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |                     SafePredFlag | SyncPredFlag); | 
					
						
							|  |  |  |   Yap_InitCPredBack("$current_atom_op", 5, 1, init_current_atom_op, | 
					
						
							|  |  |  |                     cont_current_atom_op, SafePredFlag | SyncPredFlag); | 
					
						
							| 
									
										
										
										
											2005-09-08 22:06:45 +00:00
										 |  |  | #ifdef BEAM
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   Yap_InitCPredBack("eam", 1, 0, start_eam, cont_eam, SafePredFlag); | 
					
						
							| 
									
										
										
										
											2005-09-08 22:06:45 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-09 18:00:41 -05:00
										 |  |  |   Yap_InitBackAtoms(); | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   Yap_InitBackIO(); | 
					
						
							|  |  |  |   Yap_InitBackDB(); | 
					
						
							|  |  |  |   Yap_InitUserBacks(); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef void (*Proc)(void); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | Proc E_Modules[] = {/* init_fc,*/ (Proc)0}; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-03 02:36:51 +00:00
										 |  |  | #ifdef YAPOR
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | static Int p_parallel_mode(USES_REGS1) { return FALSE; } | 
					
						
							| 
									
										
										
										
											2011-06-21 15:19:07 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | static Int p_yapor_workers(USES_REGS1) { return FALSE; } | 
					
						
							| 
									
										
										
										
											2011-06-21 15:19:07 +01:00
										 |  |  | #endif /* YAPOR */
 | 
					
						
							| 
									
										
										
										
											2010-01-15 01:03:34 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | void Yap_InitCPreds(void) { | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   /* numerical comparison */ | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   Yap_InitCPred("set_value", 2, p_setval, SafePredFlag | SyncPredFlag); | 
					
						
							| 
									
										
										
										
											2015-10-22 00:45:21 +01:00
										 |  |  |   Yap_InitCPred("get_value", 2, p_value, | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |                 TestPredFlag | SafePredFlag | SyncPredFlag); | 
					
						
							| 
									
										
										
										
											2015-10-22 00:45:21 +01:00
										 |  |  |   Yap_InitCPred("$values", 3, p_values, SafePredFlag | SyncPredFlag); | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   /* general purpose */ | 
					
						
							|  |  |  |   Yap_InitCPred("$opdec", 4, p_opdec, SafePredFlag | SyncPredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("=..", 2, p_univ, 0); | 
					
						
							|  |  |  |   /** @pred  _T_ =..  _L_ is iso
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   The list  _L_ is built with the functor and arguments of the term | 
					
						
							|  |  |  |   _T_. If  _T_ is instantiated to a variable, then  _L_ must be | 
					
						
							|  |  |  |   instantiated either to a list whose head is an atom, or to a list | 
					
						
							|  |  |  |   consisting of just a number. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   */ | 
					
						
							|  |  |  |   Yap_InitCPred("$statistics_trail_max", 1, p_statistics_trail_max, | 
					
						
							|  |  |  |                 SafePredFlag | SyncPredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("$statistics_heap_max", 1, p_statistics_heap_max, | 
					
						
							|  |  |  |                 SafePredFlag | SyncPredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("$statistics_global_max", 1, p_statistics_global_max, | 
					
						
							|  |  |  |                 SafePredFlag | SyncPredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("$statistics_local_max", 1, p_statistics_local_max, | 
					
						
							|  |  |  |                 SafePredFlag | SyncPredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("$statistics_heap_info", 2, p_statistics_heap_info, | 
					
						
							|  |  |  |                 SafePredFlag | SyncPredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("$statistics_stacks_info", 3, p_statistics_stacks_info, | 
					
						
							|  |  |  |                 SafePredFlag | SyncPredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("$statistics_trail_info", 2, p_statistics_trail_info, | 
					
						
							|  |  |  |                 SafePredFlag | SyncPredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("$statistics_atom_info", 2, p_statistics_atom_info, | 
					
						
							|  |  |  |                 SafePredFlag | SyncPredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("$statistics_db_size", 4, p_statistics_db_size, | 
					
						
							|  |  |  |                 SafePredFlag | SyncPredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("$statistics_lu_db_size", 5, p_statistics_lu_db_size, | 
					
						
							|  |  |  |                 SafePredFlag | SyncPredFlag); | 
					
						
							| 
									
										
										
										
											2012-10-19 18:10:48 +01:00
										 |  |  |   Yap_InitCPred("$executable", 1, p_executable, SafePredFlag); | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   Yap_InitCPred("$runtime", 2, p_runtime, SafePredFlag | SyncPredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("$cputime", 2, p_cputime, SafePredFlag | SyncPredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("$systime", 2, p_systime, SafePredFlag | SyncPredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("$walltime", 2, p_walltime, SafePredFlag | SyncPredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("$system_mode", 1, p_system_mode, SafePredFlag | SyncPredFlag); | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   Yap_InitCPred("abort", 0, p_abort, SyncPredFlag); | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   /** @pred  abort
 | 
					
						
							| 
									
										
										
										
											2014-09-11 14:06:57 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   Abandons the execution of the current goal and returns to top level. All | 
					
						
							|  |  |  |   break levels (see break/0 below) are terminated. It is mainly | 
					
						
							|  |  |  |   used during debugging or after a serious execution error, to return to | 
					
						
							|  |  |  |   the top-level. | 
					
						
							| 
									
										
										
										
											2014-09-11 14:06:57 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   */ | 
					
						
							| 
									
										
										
										
											2013-11-15 15:45:55 +00:00
										 |  |  |   Yap_InitCPred("$break", 1, p_break, SafePredFlag); | 
					
						
							| 
									
										
										
										
											2005-09-08 22:06:45 +00:00
										 |  |  | #ifdef BEAM
 | 
					
						
							|  |  |  |   Yap_InitCPred("@", 0, eager_split, SafePredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred(":", 0, force_wait, SafePredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("/", 0, commit, SafePredFlag); | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   Yap_InitCPred("skip_while_var", 1, skip_while_var, SafePredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("wait_while_var", 1, wait_while_var, SafePredFlag); | 
					
						
							| 
									
										
										
										
											2005-09-08 22:06:45 +00:00
										 |  |  |   Yap_InitCPred("eamtime", 0, show_time, SafePredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("eam", 0, use_eam, SafePredFlag); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2012-10-19 18:10:48 +01:00
										 |  |  |   Yap_InitCPred("$halt", 1, p_halt, SyncPredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("$lock_system", 0, p_lock_system, SafePredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("$unlock_system", 0, p_unlock_system, SafePredFlag); | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  |   Yap_InitCPred("$enter_undefp", 0, enter_undefp, SafePredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("$exit_undefp", 0, exit_undefp, SafePredFlag); | 
					
						
							| 
									
										
										
										
											2015-06-19 00:37:09 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-26 04:02:46 +00:00
										 |  |  | #ifdef YAP_JIT
 | 
					
						
							| 
									
										
										
										
											2015-10-22 00:45:21 +01:00
										 |  |  |   Yap_InitCPred("$jit_init", 1, p_jit, SafePredFlag | SyncPredFlag); | 
					
						
							| 
									
										
										
										
											2015-02-03 02:36:51 +00:00
										 |  |  | #endif /* YAPOR */
 | 
					
						
							| 
									
										
										
										
											2002-03-04 03:25:41 +00:00
										 |  |  | #ifdef INES
 | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   Yap_InitCPred("euc_dist", 3, p_euc_dist, SafePredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("loop", 0, p_loop, SafePredFlag); | 
					
						
							| 
									
										
										
										
											2002-03-04 03:25:41 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2006-06-05 19:36:00 +00:00
										 |  |  | #if QSAR
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   Yap_InitCPred("in_range", 8, p_in_range, TestPredFlag | SafePredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("in_range", 4, p_in_range2, TestPredFlag | SafePredFlag); | 
					
						
							| 
									
										
										
										
											2006-06-05 19:36:00 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #ifdef DEBUG
 | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |   Yap_InitCPred("dump_active_goals", 0, p_dump_active_goals, | 
					
						
							|  |  |  |                 SafePredFlag | SyncPredFlag); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-08-22 16:12:46 +00:00
										 |  |  |   Yap_InitArrayPreds(); | 
					
						
							| 
									
										
										
										
											2013-05-09 18:00:41 -05:00
										 |  |  |   Yap_InitAtomPreds(); | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   Yap_InitBBPreds(); | 
					
						
							|  |  |  |   Yap_InitBigNums(); | 
					
						
							| 
									
										
										
										
											2006-08-22 16:12:46 +00:00
										 |  |  |   Yap_InitCdMgr(); | 
					
						
							|  |  |  |   Yap_InitCmpPreds(); | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   Yap_InitCoroutPreds(); | 
					
						
							| 
									
										
										
										
											2006-08-22 16:12:46 +00:00
										 |  |  |   Yap_InitDBPreds(); | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  |   Yap_InitErrorPreds(); | 
					
						
							| 
									
										
										
										
											2006-08-22 16:12:46 +00:00
										 |  |  |   Yap_InitExecFs(); | 
					
						
							|  |  |  |   Yap_InitGlobals(); | 
					
						
							|  |  |  |   Yap_InitInlines(); | 
					
						
							|  |  |  |   Yap_InitIOPreds(); | 
					
						
							| 
									
										
										
										
											2013-01-07 09:47:14 +00:00
										 |  |  |   Yap_InitExoPreds(); | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   Yap_InitLoadForeign(); | 
					
						
							| 
									
										
										
										
											2004-02-06 02:26:23 +00:00
										 |  |  |   Yap_InitModulesC(); | 
					
						
							| 
									
										
										
										
											2006-08-22 16:12:46 +00:00
										 |  |  |   Yap_InitSavePreds(); | 
					
						
							| 
									
										
										
										
											2012-10-23 14:55:44 +01:00
										 |  |  |   Yap_InitRange(); | 
					
						
							| 
									
										
										
										
											2006-08-22 16:12:46 +00:00
										 |  |  |   Yap_InitSysPreds(); | 
					
						
							|  |  |  |   Yap_InitUnify(); | 
					
						
							| 
									
										
										
										
											2011-08-03 08:23:00 +01:00
										 |  |  |   Yap_InitQLY(); | 
					
						
							| 
									
										
										
										
											2011-08-24 00:11:54 -03:00
										 |  |  |   Yap_InitQLYR(); | 
					
						
							| 
									
										
										
										
											2015-09-21 17:05:36 -05:00
										 |  |  |   Yap_InitStInfo(); | 
					
						
							| 
									
										
										
										
											2009-02-20 11:42:48 +00:00
										 |  |  |   Yap_udi_init(); | 
					
						
							| 
									
										
										
										
											2013-04-25 14:21:41 -05:00
										 |  |  |   Yap_udi_Interval_init(); | 
					
						
							| 
									
										
										
										
											2013-02-08 10:36:45 -06:00
										 |  |  |   Yap_InitSignalCPreds(); | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   Yap_InitUserCPreds(); | 
					
						
							|  |  |  |   Yap_InitUtilCPreds(); | 
					
						
							|  |  |  |   Yap_InitSortPreds(); | 
					
						
							|  |  |  |   Yap_InitMaVarCPreds(); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #ifdef DEPTH_LIMIT
 | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   Yap_InitItDeepenPreds(); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | #ifdef ANALYST
 | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   Yap_InitAnalystPreds(); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   Yap_InitLowLevelTrace(); | 
					
						
							|  |  |  |   Yap_InitEval(); | 
					
						
							|  |  |  |   Yap_InitGrowPreds(); | 
					
						
							| 
									
										
										
										
											2005-12-17 03:25:39 +00:00
										 |  |  |   Yap_InitLowProf(); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #if defined(YAPOR) || defined(TABLING)
 | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   Yap_init_optyap_preds(); | 
					
						
							| 
									
										
										
										
											2003-11-07 16:31:08 +00:00
										 |  |  | #endif /* YAPOR || TABLING */
 | 
					
						
							| 
									
										
										
										
											2015-01-26 04:02:46 +00:00
										 |  |  | #if YAP_JIT
 | 
					
						
							| 
									
										
										
										
											2015-10-22 00:45:21 +01:00
										 |  |  |   Yap_InitCPred("jit", 0, p_jit, SafePredFlag | SyncPredFlag); | 
					
						
							| 
									
										
										
										
											2015-01-26 04:02:46 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2004-01-23 02:23:51 +00:00
										 |  |  |   Yap_InitThreadPreds(); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   { | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |     void (*(*(p)))(void) = E_Modules; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     while (*p) | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  |       (*(*p++))(); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2016-08-03 11:15:17 -05:00
										 |  |  | #if USE_MYDDAS
 | 
					
						
							|  |  |  |   init_myddas(); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #if CAMACHO
 | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     extern void InitForeignPreds(void); | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     Yap_InitForeignPreds(); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2002-09-25 04:29:01 +00:00
										 |  |  | #if APRIL
 | 
					
						
							| 
									
										
										
										
											2002-09-24 19:01:29 +00:00
										 |  |  |   { | 
					
						
							|  |  |  |     extern void init_ol(void), init_time(void); | 
					
						
							| 
									
										
										
										
											2014-11-25 12:03:48 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-09-24 19:01:29 +00:00
										 |  |  |     init_ol(); | 
					
						
							|  |  |  |     init_time(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2006-04-28 17:53:44 +00:00
										 |  |  | #if SUPPORT_CONDOR
 | 
					
						
							|  |  |  |   init_sys(); | 
					
						
							|  |  |  |   init_random(); | 
					
						
							|  |  |  |   //  init_tries();
 | 
					
						
							|  |  |  |   init_regexp(); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } |