| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | /*************************************************************************
 | 
					
						
							|  |  |  | *									 * | 
					
						
							|  |  |  | *	 YAP Prolog 							 * | 
					
						
							|  |  |  | *									 * | 
					
						
							|  |  |  | *	Yap Prolog was developed at NCCUP - Universidade do Porto	 * | 
					
						
							|  |  |  | *									 * | 
					
						
							|  |  |  | * Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997	 * | 
					
						
							|  |  |  | *									 * | 
					
						
							|  |  |  | ************************************************************************** | 
					
						
							|  |  |  | *									 * | 
					
						
							|  |  |  | * File:		arrays.c						 * | 
					
						
							|  |  |  | * Last rev:								 * | 
					
						
							|  |  |  | * mods:									 * | 
					
						
							|  |  |  | * comments:	Array Manipulation Routines	                         * | 
					
						
							|  |  |  | *									 * | 
					
						
							|  |  |  | *************************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "Yap.h"
 | 
					
						
							| 
									
										
										
										
											2004-06-18 16:35:18 +00:00
										 |  |  | #include "clause.h"
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #include "eval.h"
 | 
					
						
							|  |  |  | #include "heapgc.h"
 | 
					
						
							|  |  |  | #if HAVE_ERRNO_H
 | 
					
						
							|  |  |  | #include <errno.h>
 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | extern int errno; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #if HAVE_STRING_H
 | 
					
						
							|  |  |  | #include <string.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if __simplescalar__
 | 
					
						
							|  |  |  | #ifdef HAVE_MMAP
 | 
					
						
							|  |  |  | #undef HAVE_MMAP
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | STATIC_PROTO(Int  p_compile_array_refs, ( USES_REGS1 )); | 
					
						
							|  |  |  | STATIC_PROTO(Int  p_array_refs_compiled, ( USES_REGS1 )); | 
					
						
							|  |  |  | STATIC_PROTO(Int  p_sync_mmapped_arrays, ( USES_REGS1 )); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * This file works together with pl/arrays.yap and arrays.h. | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * YAP now supports a very simple notion of arrays. Arrays may be | 
					
						
							|  |  |  |  * allocated dynamically or statically: | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * o anonymous arrays are created during execution and allocated | 
					
						
							|  |  |  |  * in the heap. They have the lifetime of any other other heap | 
					
						
							|  |  |  |  * object. Any term can be an argument to a dynamic array. | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * Dynamic arrays are named as a free variable and are | 
					
						
							|  |  |  |  * initialised with free variables.  | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * o named arrays are created during execution but allocated | 
					
						
							|  |  |  |  * in the code space. They have the lifetime of an heap | 
					
						
							|  |  |  |  * object. Any term can be an argument to a dynamic array. | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * Named arrays are named with atoms and are initialised with | 
					
						
							|  |  |  |  * free variables. | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * o static arrays are allocated in the heap. Their space is | 
					
						
							|  |  |  |  * never recovered unless explictly said so by the | 
					
						
							|  |  |  |  * program. Arguments to these arrays must have fixed size, | 
					
						
							|  |  |  |  * and can only be atomic (at least for now). | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * Static arrays can be named through an  atom. They are | 
					
						
							|  |  |  |  * initialised with []. | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * Users create arrays by a declaration X array Arity. If X is an atom | 
					
						
							|  |  |  |  * A, then this it is a static array and A's the array name, otherwise | 
					
						
							|  |  |  |  * X refers to a dynamic array. | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * As in C, arrays start counting from 0. | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * Users access arrays by a token X[I] or a[I], this token can appear | 
					
						
							|  |  |  |  * anywhere within the computation, so a[2] = X[3*4] means that the | 
					
						
							|  |  |  |  * second element of global array a should unify with the 12th element | 
					
						
							|  |  |  |  * of array X. The mechanism used to implement this is the same | 
					
						
							|  |  |  |  * mechanism used to implement suspension variables. | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * Representation: | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * Dynamic Arrays are represented as a compound term of arity N, where | 
					
						
							|  |  |  |  * N is the size of the array. Even so, I will not include array bound | 
					
						
							|  |  |  |  * checking for now. | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * |--------------------------------------------------------------| | 
					
						
							|  |  |  |  * | $ARRAY/N|.... | 
					
						
							|  |  |  |  * |______________________________________________________________ | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * Unbound Var is used as a place to point to. | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * Static Arrays are represented as a special property for an atom, | 
					
						
							|  |  |  |  * with field size and  | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * A term of the form X[I] is represented as a Reference pointing to | 
					
						
							|  |  |  |  * the compound term: | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * '$array_arg'(X,I) | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * Dereferecing will automatically find X[I]. | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * The only exception is the compiler, which uses a different | 
					
						
							|  |  |  |  * dereferencing routine. The clause cl(a[2], Y[X], Y) will be | 
					
						
							|  |  |  |  * compiled as: | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * cl(A, B, Y) :- '$access_array'(a, A, 2), '$access_array'(Y, B, X). | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * There are three operations to access arrays: | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * X[I] = A, This is normal unification. | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * X[I] := A, This is multiassignment, and therefore | 
					
						
							|  |  |  |  * backtrackable. | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * X[I] ::= A, This is non-backtrackable multiassignment, ans most | 
					
						
							|  |  |  |  * useful for static arrays. | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * The LHS of := and of ::= must be an array element! | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | STATIC_PROTO(Int  p_create_array, ( USES_REGS1 )); | 
					
						
							|  |  |  | STATIC_PROTO(Int  p_create_mmapped_array, ( USES_REGS1 )); | 
					
						
							|  |  |  | STATIC_PROTO(Int  p_array_references, ( USES_REGS1 )); | 
					
						
							|  |  |  | STATIC_PROTO(Int  p_create_static_array, ( USES_REGS1 )); | 
					
						
							|  |  |  | STATIC_PROTO(Int  p_resize_static_array, ( USES_REGS1 )); | 
					
						
							|  |  |  | STATIC_PROTO(Int  p_close_static_array, ( USES_REGS1 )); | 
					
						
							|  |  |  | STATIC_PROTO(Int  p_access_array, ( USES_REGS1 )); | 
					
						
							|  |  |  | STATIC_PROTO(Int  p_assign_static, ( USES_REGS1 )); | 
					
						
							|  |  |  | STATIC_PROTO(Int  p_assign_dynamic, ( USES_REGS1 )); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #if HAVE_MMAP
 | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #if HAVE_UNISTD_H
 | 
					
						
							|  |  |  | #include <unistd.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #if HAVE_SYS_MMAN_H
 | 
					
						
							|  |  |  | #include <sys/mman.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #if HAVE_SYS_STAT_H
 | 
					
						
							|  |  |  | #include <sys/stat.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #if HAVE_FCNTL_H
 | 
					
						
							|  |  |  | #include <fcntl.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* keep a list of mmaped blocks to synch on exit */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct MMAP_ARRAY_BLOCK { | 
					
						
							|  |  |  |   Atom name; | 
					
						
							|  |  |  |   void *start; | 
					
						
							|  |  |  |   size_t  size; | 
					
						
							|  |  |  |   Int items; | 
					
						
							|  |  |  |   int  fd; | 
					
						
							|  |  |  |   struct MMAP_ARRAY_BLOCK *next; | 
					
						
							|  |  |  | } mmap_array_block; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static Int | 
					
						
							|  |  |  | CloseMmappedArray(StaticArrayEntry *pp, void *area USES_REGS) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-05-25 16:40:36 +01:00
										 |  |  |   mmap_array_block *ptr = GLOBAL_mmap_arrays, *optr = GLOBAL_mmap_arrays; | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   while (ptr != NULL && ptr->start != area) { | 
					
						
							|  |  |  |     ptr = ptr->next; | 
					
						
							|  |  |  |     optr = ptr; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (ptr == NULL) { | 
					
						
							| 
									
										
										
										
											2011-04-16 00:31:51 +01:00
										 |  |  | #if !defined(USE_SYSTEM_MALLOC)
 | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |     Yap_Error(SYSTEM_ERROR,ARG1,"close_mmapped_array (array chain incoherent)", strerror(errno)); | 
					
						
							| 
									
										
										
										
											2011-04-16 00:31:51 +01:00
										 |  |  | #endif
 | 
					
						
							|  |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   if (munmap(ptr->start, ptr->size) == -1) { | 
					
						
							|  |  |  |       Yap_Error(SYSTEM_ERROR,ARG1,"close_mmapped_array (munmap: %s)", strerror(errno)); | 
					
						
							|  |  |  |       return(FALSE); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   optr->next = ptr->next; | 
					
						
							|  |  |  |   pp->ValueOfVE.ints = NULL; | 
					
						
							|  |  |  |   pp->ArrayEArity = 0; | 
					
						
							|  |  |  |   if (close(ptr->fd) < 0) { | 
					
						
							|  |  |  |     Yap_Error(SYSTEM_ERROR,ARG1,"close_mmapped_array (close: %s)", strerror(errno)); | 
					
						
							|  |  |  |     return(FALSE); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   Yap_FreeAtomSpace((char *)ptr); | 
					
						
							|  |  |  |   return(TRUE); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							|  |  |  | ResizeMmappedArray(StaticArrayEntry *pp, Int dim, void *area USES_REGS) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-05-25 16:40:36 +01:00
										 |  |  |   mmap_array_block *ptr = GLOBAL_mmap_arrays; | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   size_t total_size;  | 
					
						
							|  |  |  |   while (ptr != NULL && ptr->start != area) { | 
					
						
							|  |  |  |     ptr = ptr->next; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (ptr == NULL) | 
					
						
							|  |  |  |     return; | 
					
						
							|  |  |  |   /* This is a very stupid algorithm to change size for an array.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |      First, we unmap it, then we actually change the size for the file, | 
					
						
							|  |  |  |      and last we initialise again | 
					
						
							|  |  |  |   */ | 
					
						
							|  |  |  |   if (munmap(ptr->start, ptr->size) == -1) { | 
					
						
							|  |  |  |       Yap_Error(SYSTEM_ERROR,ARG1,"resize_mmapped_array (munmap: %s)", strerror(errno)); | 
					
						
							|  |  |  |       return; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   total_size = (ptr->size / ptr->items)*dim; | 
					
						
							|  |  |  |   if (ftruncate(ptr->fd, total_size) < 0) { | 
					
						
							|  |  |  |     Yap_Error(SYSTEM_ERROR,ARG1,"resize_mmapped_array (ftruncate: %s)", strerror(errno)); | 
					
						
							|  |  |  |     return; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (lseek(ptr->fd, total_size-1, SEEK_SET) < 0) { | 
					
						
							|  |  |  |     Yap_Error(SYSTEM_ERROR,ARG1,"resize_mmapped_array (lseek: %s)", strerror(errno)); | 
					
						
							|  |  |  |     return; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (write(ptr->fd, "", 1) < 0) { | 
					
						
							|  |  |  |     Yap_Error(SYSTEM_ERROR,ARG1,"resize_mmapped_array (write: %s)", strerror(errno)); | 
					
						
							|  |  |  |     return; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if ((ptr->start = (void *)mmap(0, (size_t) total_size, PROT_READ | PROT_WRITE, MAP_SHARED, ptr->fd, 0)) == (void *) - 1) { | 
					
						
							|  |  |  |     Yap_Error(SYSTEM_ERROR,ARG1,"resize_mmapped_array (mmap: %s)", strerror(errno)); | 
					
						
							|  |  |  |     return; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   ptr->size = total_size; | 
					
						
							|  |  |  |   ptr->items = dim; | 
					
						
							|  |  |  |   pp->ValueOfVE.chars = ptr->start; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-10-19 19:00:48 +00:00
										 |  |  | static Term | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | GetTermFromArray(DBTerm *ref USES_REGS) | 
					
						
							| 
									
										
										
										
											2005-10-19 19:00:48 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   if (ref != NULL) { | 
					
						
							|  |  |  |     Term TRef; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     while ((TRef = Yap_FetchTermFromDB(ref)) == 0L) { | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |       if (LOCAL_Error_TYPE == OUT_OF_ATTVARS_ERROR) { | 
					
						
							|  |  |  | 	LOCAL_Error_TYPE = YAP_NO_ERROR; | 
					
						
							| 
									
										
										
										
											2005-10-19 19:00:48 +00:00
										 |  |  | 	if (!Yap_growglobal(NULL)) { | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  | 	  Yap_Error(OUT_OF_ATTVARS_ERROR, TermNil, LOCAL_ErrorMessage); | 
					
						
							| 
									
										
										
										
											2005-10-19 19:00:48 +00:00
										 |  |  | 	  return TermNil; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  |       } else { | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  | 	LOCAL_Error_TYPE = YAP_NO_ERROR; | 
					
						
							|  |  |  | 	if (!Yap_gcl(LOCAL_Error_Size, 3, ENV, gc_P(P,CP))) { | 
					
						
							|  |  |  | 	  Yap_Error(OUT_OF_STACK_ERROR, TermNil, LOCAL_ErrorMessage); | 
					
						
							| 
									
										
										
										
											2005-10-19 19:00:48 +00:00
										 |  |  | 	  return TermNil; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return TRef; | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     P = (yamop *)FAILCODE; | 
					
						
							|  |  |  |     return TermNil; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static Term | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | GetNBTerm(live_term *ar, Int indx USES_REGS) | 
					
						
							| 
									
										
										
										
											2005-10-19 19:00:48 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   /* The object is now in use */ | 
					
						
							|  |  |  |   Term livet = ar[indx].tlive; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-10-28 17:38:50 +00:00
										 |  |  |   if (!IsVarTerm(livet)) { | 
					
						
							|  |  |  |     if (!IsApplTerm(livet)) { | 
					
						
							|  |  |  |       return livet; | 
					
						
							|  |  |  |     } else if (FunctorOfTerm(livet) == FunctorAtFoundOne) { | 
					
						
							|  |  |  |       return Yap_ReadTimedVar(livet); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       return livet; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2005-10-19 19:00:48 +00:00
										 |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2005-10-28 17:38:50 +00:00
										 |  |  |     Term termt = ar[indx].tstore; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (!IsUnboundVar(&(ar[indx].tlive))) { | 
					
						
							|  |  |  |       return livet; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if (IsVarTerm(termt)) { | 
					
						
							|  |  |  |       livet = MkVarTerm(); | 
					
						
							|  |  |  |     } else if (IsAtomicTerm(termt)) { | 
					
						
							|  |  |  |       livet = termt; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       DBTerm *ref = (DBTerm *)RepAppl(termt); | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       if ((livet = GetTermFromArray(ref PASS_REGS)) == TermNil) { | 
					
						
							| 
									
										
										
										
											2005-10-28 17:38:50 +00:00
										 |  |  | 	return TermNil; | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2005-10-19 19:00:48 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2005-10-28 17:38:50 +00:00
										 |  |  |     Bind(&(ar[indx].tlive), livet); | 
					
						
							| 
									
										
										
										
											2005-10-19 19:00:48 +00:00
										 |  |  |     return livet; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | static Term | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | AccessNamedArray(Atom a, Int indx USES_REGS) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   AtomEntry *ae = RepAtom(a); | 
					
						
							|  |  |  |   ArrayEntry *pp;  | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   READ_LOCK(ae->ARWLock); | 
					
						
							| 
									
										
										
										
											2001-10-30 16:42:05 +00:00
										 |  |  |   pp = RepArrayProp(ae->PropsOfAE); | 
					
						
							| 
									
										
										
										
											2005-09-22 03:26:13 +00:00
										 |  |  |   while (!EndOfPAEntr(pp) && | 
					
						
							|  |  |  | 	 pp->KindOfPE != ArrayProperty | 
					
						
							|  |  |  | #if THREADS
 | 
					
						
							|  |  |  | 	 && pp->owner_id != worker_id | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 	 ) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     pp = RepArrayProp(pp->NextOfPE); | 
					
						
							|  |  |  |   READ_UNLOCK(ae->ARWLock); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (!EndOfPAEntr(pp)) { | 
					
						
							|  |  |  |     if (ArrayIsDynamic(pp)) { | 
					
						
							|  |  |  |       Term out; | 
					
						
							|  |  |  |       READ_LOCK(pp->ArRWLock); | 
					
						
							| 
									
										
										
										
											2002-04-23 23:23:45 +00:00
										 |  |  |       if (IsVarTerm(pp->ValueOfVE) || | 
					
						
							|  |  |  | 	  pp->ArrayEArity <= indx || | 
					
						
							|  |  |  | 	  indx < 0) { | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 	READ_UNLOCK(pp->ArRWLock); | 
					
						
							| 
									
										
										
										
											2002-04-23 23:23:45 +00:00
										 |  |  | 	P = (yamop *)FAILCODE; | 
					
						
							| 
									
										
										
										
											2002-02-01 15:48:17 +00:00
										 |  |  | 	return(MkAtomTerm(AtomFoundVar)); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       } | 
					
						
							|  |  |  |       out = RepAppl(pp->ValueOfVE)[indx+1]; | 
					
						
							|  |  |  |       READ_UNLOCK(pp->ArRWLock); | 
					
						
							|  |  |  |       return(out); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       StaticArrayEntry *ptr = (StaticArrayEntry *)pp; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       READ_LOCK(ptr->ArRWLock); | 
					
						
							|  |  |  |       if (-(pp->ArrayEArity) <= indx || indx < 0) { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  | 	/*	Yap_Error(DOMAIN_ERROR_ARRAY_OVERFLOW, MkIntegerTerm(indx), "access_array");*/ | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 	READ_UNLOCK(ptr->ArRWLock); | 
					
						
							|  |  |  | 	P = (yamop *)FAILCODE; | 
					
						
							| 
									
										
										
										
											2002-04-23 23:23:45 +00:00
										 |  |  | 	return(MkAtomTerm(AtomFoundVar)); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       } | 
					
						
							|  |  |  |       switch (ptr->ArrayType) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       case array_of_ints: | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 	  Term out; | 
					
						
							|  |  |  | 	  out = MkIntegerTerm(ptr->ValueOfVE.ints[indx]); | 
					
						
							|  |  |  | 	  READ_UNLOCK(ptr->ArRWLock); | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  | 	  return out; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  |       case array_of_doubles: | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 	  Term out; | 
					
						
							|  |  |  | 	  out = MkEvalFl(ptr->ValueOfVE.floats[indx]); | 
					
						
							|  |  |  | 	  READ_UNLOCK(ptr->ArRWLock); | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  | 	  return out; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  |       case array_of_ptrs: | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 	  Term out; | 
					
						
							|  |  |  | 	  out = MkIntegerTerm((Int)(ptr->ValueOfVE.ptrs[indx])); | 
					
						
							|  |  |  | 	  READ_UNLOCK(ptr->ArRWLock); | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  | 	  return out; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  |       case array_of_atoms: | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 	  Term out; | 
					
						
							|  |  |  | 	  out = ptr->ValueOfVE.atoms[indx]; | 
					
						
							|  |  |  | 	  READ_UNLOCK(ptr->ArRWLock); | 
					
						
							|  |  |  | 	  if (out == 0L) | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  | 	    return TermNil; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 	  else | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  | 	    return out; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	/* just return the atom */ | 
					
						
							|  |  |  |       case array_of_chars: | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 	  Term out; | 
					
						
							|  |  |  | 	  out = MkIntegerTerm((Int)(ptr->ValueOfVE.chars[indx])); | 
					
						
							|  |  |  | 	  READ_UNLOCK(ptr->ArRWLock); | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  | 	  return out; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  |       case array_of_uchars: | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 	  Term out; | 
					
						
							|  |  |  | 	  out = MkIntegerTerm((Int)(ptr->ValueOfVE.uchars[indx])); | 
					
						
							|  |  |  | 	  READ_UNLOCK(ptr->ArRWLock); | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  | 	  return out; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  |       case array_of_dbrefs: | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 	  /* The object is now in use */ | 
					
						
							|  |  |  | 	  Term TRef = ptr->ValueOfVE.dbrefs[indx]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	  READ_UNLOCK(ptr->ArRWLock); | 
					
						
							|  |  |  | 	  if (TRef != 0L) { | 
					
						
							|  |  |  | 	    DBRef ref = DBRefOfTerm(TRef); | 
					
						
							| 
									
										
										
										
											2004-06-23 17:24:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-14 18:51:11 +01:00
										 |  |  | #if MULTIPLE_STACKS
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 	    LOCK(ref->lock); | 
					
						
							|  |  |  | 	    INC_DBREF_COUNT(ref); | 
					
						
							| 
									
										
										
										
											2001-06-08 14:52:54 +00:00
										 |  |  | 	    TRAIL_REF(ref);	/* So that fail will erase it */ | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 	    UNLOCK(ref->lock); | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2004-06-23 17:24:20 +00:00
										 |  |  | 	    if (ref->Flags & LogUpdMask) { | 
					
						
							|  |  |  | 	      LogUpdClause *cl = (LogUpdClause *)ref; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-09-28 18:37:05 +00:00
										 |  |  | 	      if (!(cl->ClFlags & InUseMask)) { | 
					
						
							|  |  |  | 		cl->ClFlags |= InUseMask; | 
					
						
							|  |  |  | 		TRAIL_CLREF(cl); | 
					
						
							|  |  |  | 	      } | 
					
						
							| 
									
										
										
										
											2004-06-23 17:24:20 +00:00
										 |  |  | 	    } else { | 
					
						
							|  |  |  | 	      if (!(ref->Flags & InUseMask)) { | 
					
						
							|  |  |  | 		ref->Flags |= InUseMask; | 
					
						
							|  |  |  | 		TRAIL_REF(ref);	/* So that fail will erase it */ | 
					
						
							|  |  |  | 	      } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 	    } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 	  } else { | 
					
						
							|  |  |  | 	    P = (yamop *)FAILCODE; | 
					
						
							|  |  |  | 	    TRef = TermNil; | 
					
						
							|  |  |  | 	  } | 
					
						
							| 
									
										
										
										
											2005-10-19 19:00:48 +00:00
										 |  |  | 	  return TRef; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  |       case array_of_nb_terms: | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 	  /* The object is now in use */ | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | 	  Term out = GetNBTerm(ptr->ValueOfVE.lterms, indx PASS_REGS); | 
					
						
							| 
									
										
										
										
											2005-10-19 19:00:48 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	  READ_UNLOCK(ptr->ArRWLock); | 
					
						
							|  |  |  | 	  return out; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  |       case array_of_terms: | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 	  /* The object is now in use */ | 
					
						
							| 
									
										
										
										
											2003-08-27 13:37:10 +00:00
										 |  |  | 	  DBTerm *ref = ptr->ValueOfVE.terms[indx]; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	  READ_UNLOCK(ptr->ArRWLock); | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | 	  return GetTermFromArray(ref PASS_REGS); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  |       default: | 
					
						
							|  |  |  | 	READ_UNLOCK(ptr->ArRWLock); | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  | 	return TermNil; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       } | 
					
						
							|  |  |  |     }       | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   else { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     Yap_Error(EXISTENCE_ERROR_ARRAY,MkAtomTerm(a),"named array"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     return (TermNil); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static Int  | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | p_access_array( USES_REGS1 ) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   Term t = Deref(ARG1); | 
					
						
							|  |  |  |   Term ti = Deref(ARG2); | 
					
						
							|  |  |  |   Term tf; | 
					
						
							| 
									
										
										
										
											2002-02-04 16:12:54 +00:00
										 |  |  |   Int indx; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   if (IsNonVarTerm(ti)) { | 
					
						
							| 
									
										
										
										
											2008-12-04 23:33:32 +00:00
										 |  |  |     Term nti; | 
					
						
							|  |  |  |     if (IsIntegerTerm(nti=Yap_Eval(ti))) | 
					
						
							|  |  |  |       indx = IntegerOfTerm(nti); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     else { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |       Yap_Error(TYPE_ERROR_INTEGER,ti,"access_array"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       return (FALSE); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   else { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     Yap_Error(INSTANTIATION_ERROR,ti,"access_array"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     return (TermNil); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (IsNonVarTerm(t)) { | 
					
						
							|  |  |  |     if (IsApplTerm(t)) { | 
					
						
							| 
									
										
										
										
											2002-04-23 23:23:45 +00:00
										 |  |  |       if (indx >= ArityOfFunctor(FunctorOfTerm(t)) || indx < 0) { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  | 	/*	Yap_Error(DOMAIN_ERROR_ARRAY_OVERFLOW, MkIntegerTerm(indx), "access_array");*/ | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 	P = (yamop *)FAILCODE; | 
					
						
							|  |  |  | 	return(FALSE); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       tf = (RepAppl(t))[indx + 1]; | 
					
						
							|  |  |  |     } else if (IsAtomTerm(t)) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       tf = AccessNamedArray(AtomOfTerm(t), indx PASS_REGS); | 
					
						
							| 
									
										
										
										
											2002-02-01 15:48:17 +00:00
										 |  |  |       if (tf == MkAtomTerm(AtomFoundVar)) { | 
					
						
							|  |  |  | 	return(FALSE); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |       Yap_Error(TYPE_ERROR_ARRAY,t,"access_array"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       return(FALSE); | 
					
						
							|  |  |  |     }     | 
					
						
							|  |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     Yap_Error(INSTANTIATION_ERROR,t,"access_array"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     return(FALSE); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2005-10-28 17:38:50 +00:00
										 |  |  |   return Yap_unify(tf, ARG3); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static Int  | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | p_array_arg( USES_REGS1 ) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   register Term ti = Deref(ARG3), t; | 
					
						
							|  |  |  |   register Int indx; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (IsNonVarTerm(ti)) { | 
					
						
							| 
									
										
										
										
											2008-12-04 23:33:32 +00:00
										 |  |  |     Term nti; | 
					
						
							|  |  |  |     if (IsIntegerTerm(nti=Yap_Eval(ti))) | 
					
						
							|  |  |  |       indx = IntegerOfTerm(nti); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     else { | 
					
						
							| 
									
										
										
										
											2008-12-04 23:33:32 +00:00
										 |  |  |       Yap_Error(TYPE_ERROR_INTEGER,ti,"access_array"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       return (FALSE); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   else { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     Yap_Error(INSTANTIATION_ERROR,ti,"array_arg"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     return (FALSE); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   t = Deref(ARG2); | 
					
						
							|  |  |  |   if (IsNonVarTerm(t)) { | 
					
						
							|  |  |  |     if (IsApplTerm(t)) { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |       return (Yap_unify(((RepAppl(t))[indx + 1]), ARG1)); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |     else if (IsAtomTerm(t)) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       Term tf = AccessNamedArray(AtomOfTerm(t), indx PASS_REGS); | 
					
						
							| 
									
										
										
										
											2002-02-01 15:48:17 +00:00
										 |  |  |       if (tf == MkAtomTerm(AtomFoundVar)) { | 
					
						
							|  |  |  | 	return(FALSE); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |       return (Yap_unify(tf, ARG1)); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |     else | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |       Yap_Error(TYPE_ERROR_ARRAY,t,"array_arg"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   else | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     Yap_Error(INSTANTIATION_ERROR,t,"array_arg"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   return (FALSE); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | InitNamedArray(ArrayEntry * p, Int dim USES_REGS) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   Term *tp; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   WRITE_LOCK(p->ArRWLock); | 
					
						
							|  |  |  |   /* Leave a pointer so that we can reclaim array space when
 | 
					
						
							|  |  |  |    * we backtrack or when we abort */ | 
					
						
							|  |  |  |   /* place terms in reverse order */ | 
					
						
							|  |  |  |   Bind_Global(&(p->ValueOfVE),AbsAppl(H)); | 
					
						
							|  |  |  |   tp = H; | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   tp[0] =  (CELL)Yap_MkFunctor(AtomArray, dim); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   tp++; | 
					
						
							|  |  |  |   p->ArrayEArity = dim; | 
					
						
							|  |  |  |   /* Initialise the array as a set of variables */ | 
					
						
							|  |  |  |   H = tp+dim; | 
					
						
							|  |  |  |   for (; tp < H; tp++) { | 
					
						
							|  |  |  |     RESET_VARIABLE(tp); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   WRITE_UNLOCK(p->ArRWLock); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* we assume the atom ae is already locked */ | 
					
						
							|  |  |  | static void | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | CreateNamedArray(PropEntry * pp, Int dim, AtomEntry *ae USES_REGS) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   ArrayEntry *p; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   p = (ArrayEntry *) Yap_AllocAtomSpace(sizeof(*p)); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   p->KindOfPE = ArrayProperty; | 
					
						
							| 
									
										
										
										
											2011-08-17 11:16:21 -07:00
										 |  |  |   AddPropToAtom(ae, (PropEntry *)p); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   INIT_RWLOCK(p->ArRWLock); | 
					
						
							| 
									
										
										
										
											2005-09-22 03:26:13 +00:00
										 |  |  | #if THREADS
 | 
					
						
							|  |  |  |   p->owner_id = worker_id; | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |   p->NextAE = LOCAL_DynamicArrays; | 
					
						
							|  |  |  |   LOCAL_DynamicArrays = p; | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   InitNamedArray(p, dim PASS_REGS); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | AllocateStaticArraySpace(StaticArrayEntry *p, static_array_types atype, Int array_size USES_REGS) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   Int asize = 0; | 
					
						
							|  |  |  |   switch (atype) { | 
					
						
							|  |  |  |   case array_of_doubles: | 
					
						
							|  |  |  |     asize = array_size*sizeof(Float); | 
					
						
							|  |  |  |     break; | 
					
						
							|  |  |  |   case array_of_ints: | 
					
						
							|  |  |  |     asize = array_size*sizeof(Int); | 
					
						
							|  |  |  |     break; | 
					
						
							|  |  |  |   case array_of_chars: | 
					
						
							|  |  |  |     asize = array_size*sizeof(char); | 
					
						
							|  |  |  |     break; | 
					
						
							|  |  |  |   case array_of_uchars: | 
					
						
							|  |  |  |     asize = array_size*sizeof(unsigned char); | 
					
						
							|  |  |  |     break; | 
					
						
							|  |  |  |   case array_of_ptrs: | 
					
						
							|  |  |  |     asize = array_size*sizeof(AtomEntry *); | 
					
						
							|  |  |  |     break; | 
					
						
							|  |  |  |   case array_of_atoms: | 
					
						
							|  |  |  |   case array_of_terms: | 
					
						
							| 
									
										
										
										
											2005-10-19 19:00:48 +00:00
										 |  |  |   case array_of_nb_terms: | 
					
						
							|  |  |  |     asize = array_size*sizeof(live_term); | 
					
						
							|  |  |  |     break; | 
					
						
							|  |  |  |   case array_of_dbrefs: | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     asize = array_size*sizeof(DBRef); | 
					
						
							|  |  |  |     break; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   while ((p->ValueOfVE.floats = (Float *) Yap_AllocAtomSpace(asize) ) == NULL) { | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     YAPLeaveCriticalSection(); | 
					
						
							| 
									
										
										
										
											2004-01-23 02:23:51 +00:00
										 |  |  |     if (!Yap_growheap(FALSE, asize, NULL)) { | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |       Yap_Error(OUT_OF_HEAP_ERROR, TermNil, LOCAL_ErrorMessage); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     YAPEnterCriticalSection(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ae and p are assumed to be locked, if they exist */ | 
					
						
							| 
									
										
										
										
											2003-03-20 15:10:18 +00:00
										 |  |  | static StaticArrayEntry * | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | CreateStaticArray(AtomEntry *ae, Int dim, static_array_types type, CODEADDR start_addr, StaticArrayEntry *p USES_REGS) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   if (EndOfPAEntr(p)) { | 
					
						
							| 
									
										
										
										
											2003-03-20 15:10:18 +00:00
										 |  |  |     while ((p = (StaticArrayEntry *) Yap_AllocAtomSpace(sizeof(*p))) == NULL) { | 
					
						
							| 
									
										
										
										
											2004-01-23 02:23:51 +00:00
										 |  |  |       if (!Yap_growheap(FALSE, sizeof(*p), NULL)) { | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  | 	Yap_Error(OUT_OF_HEAP_ERROR, TermNil, LOCAL_ErrorMessage); | 
					
						
							| 
									
										
										
										
											2003-03-20 15:10:18 +00:00
										 |  |  | 	return NULL; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     p->KindOfPE = ArrayProperty; | 
					
						
							|  |  |  |     INIT_RWLOCK(p->ArRWLock); | 
					
						
							| 
									
										
										
										
											2011-08-17 11:16:21 -07:00
										 |  |  |     AddPropToAtom(ae, (PropEntry *)p); | 
					
						
							| 
									
										
										
										
											2011-05-04 10:11:41 +01:00
										 |  |  |     p->NextAE = LOCAL_StaticArrays; | 
					
						
							|  |  |  |     LOCAL_StaticArrays = p; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |   WRITE_LOCK(p->ArRWLock); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   p->ArrayEArity = -dim; | 
					
						
							|  |  |  |   p->ArrayType = type; | 
					
						
							|  |  |  |   if (start_addr == NULL) { | 
					
						
							| 
									
										
										
										
											2011-12-05 21:04:31 +00:00
										 |  |  |     Int i; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |     AllocateStaticArraySpace(p, type, dim PASS_REGS); | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |     if (p->ValueOfVE.ints == NULL) { | 
					
						
							|  |  |  |       WRITE_UNLOCK(p->ArRWLock); | 
					
						
							| 
									
										
										
										
											2003-03-20 15:10:18 +00:00
										 |  |  |       return p; | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     switch(type) { | 
					
						
							|  |  |  |     case array_of_ints: | 
					
						
							|  |  |  |       for (i = 0; i < dim; i++) | 
					
						
							|  |  |  | 	p->ValueOfVE.ints[i] = 0; | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     case array_of_chars: | 
					
						
							|  |  |  |       for (i = 0; i < dim; i++) | 
					
						
							|  |  |  | 	p->ValueOfVE.chars[i] = '\0'; | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     case array_of_uchars: | 
					
						
							|  |  |  |       for (i = 0; i < dim; i++) | 
					
						
							|  |  |  | 	p->ValueOfVE.uchars[i] = '\0'; | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     case array_of_doubles: | 
					
						
							|  |  |  |       for (i = 0; i < dim; i++) | 
					
						
							|  |  |  | 	p->ValueOfVE.floats[i] = 0.0; | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     case array_of_ptrs: | 
					
						
							|  |  |  |       for (i = 0; i < dim; i++) | 
					
						
							|  |  |  | 	p->ValueOfVE.ptrs[i] = NULL; | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     case array_of_atoms: | 
					
						
							|  |  |  |     case array_of_dbrefs: | 
					
						
							|  |  |  |       for (i = 0; i < dim; i++) | 
					
						
							|  |  |  | 	p->ValueOfVE.atoms[i] = 0L; | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     case array_of_terms: | 
					
						
							|  |  |  |       for (i = 0; i < dim; i++) | 
					
						
							|  |  |  | 	p->ValueOfVE.terms[i] = NULL; | 
					
						
							|  |  |  |       break; | 
					
						
							| 
									
										
										
										
											2005-10-19 19:00:48 +00:00
										 |  |  |     case array_of_nb_terms: | 
					
						
							|  |  |  |       for (i = 0; i < dim; i++) { | 
					
						
							|  |  |  | 	RESET_VARIABLE(&(p->ValueOfVE.lterms[i].tlive)); | 
					
						
							|  |  |  | 	p->ValueOfVE.lterms[i].tstore = TermNil; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       break; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     /* external array */ | 
					
						
							|  |  |  |     p->ValueOfVE.chars = (char *)start_addr; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   WRITE_UNLOCK(p->ArRWLock); | 
					
						
							| 
									
										
										
										
											2003-03-20 15:10:18 +00:00
										 |  |  |   return p; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | ResizeStaticArray(StaticArrayEntry *pp, Int dim USES_REGS) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   statarray_elements old_v = pp->ValueOfVE; | 
					
						
							|  |  |  |   static_array_types type = pp->ArrayType; | 
					
						
							|  |  |  |   Int old_dim = - pp->ArrayEArity; | 
					
						
							|  |  |  |   Int mindim = (dim < old_dim ? dim : old_dim), i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* change official size */ | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |   if (pp->ArrayEArity >= 0){ | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     return; | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   WRITE_LOCK(pp->ArRWLock); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   pp->ArrayEArity = -dim; | 
					
						
							|  |  |  | #if HAVE_MMAP
 | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   if (pp->ValueOfVE.chars < (char *)Yap_HeapBase ||  | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       pp->ValueOfVE.chars > (char *)HeapTop) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |     ResizeMmappedArray(pp, dim, (void *)(pp->ValueOfVE.chars) PASS_REGS); | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |     WRITE_UNLOCK(pp->ArRWLock); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     return; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   AllocateStaticArraySpace(pp, type, dim PASS_REGS); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   switch(type) { | 
					
						
							|  |  |  |   case array_of_ints: | 
					
						
							|  |  |  |     for (i = 0; i <mindim; i++) | 
					
						
							|  |  |  |       pp->ValueOfVE.ints[i] = old_v.ints[i]; | 
					
						
							|  |  |  |     for (i = mindim; i<dim; i++) | 
					
						
							|  |  |  |       pp->ValueOfVE.ints[i] = 0; | 
					
						
							|  |  |  |     break; | 
					
						
							|  |  |  |   case array_of_chars: | 
					
						
							|  |  |  |     for (i = 0; i <mindim; i++) | 
					
						
							|  |  |  |       pp->ValueOfVE.chars[i] = old_v.chars[i]; | 
					
						
							|  |  |  |     for (i = mindim; i<dim; i++) | 
					
						
							|  |  |  |       pp->ValueOfVE.chars[i] = '\0'; | 
					
						
							|  |  |  |     break; | 
					
						
							|  |  |  |   case array_of_uchars: | 
					
						
							|  |  |  |     for (i = 0; i <mindim; i++) | 
					
						
							|  |  |  |       pp->ValueOfVE.uchars[i] = old_v.uchars[i]; | 
					
						
							|  |  |  |     for (i = mindim; i<dim; i++) | 
					
						
							|  |  |  |       pp->ValueOfVE.uchars[i] = '\0'; | 
					
						
							|  |  |  |     break; | 
					
						
							|  |  |  |   case array_of_doubles: | 
					
						
							|  |  |  |     for (i = 0; i <mindim; i++) | 
					
						
							|  |  |  |       pp->ValueOfVE.floats[i] = old_v.floats[i]; | 
					
						
							|  |  |  |     for (i = mindim; i<dim; i++) | 
					
						
							|  |  |  |       pp->ValueOfVE.floats[i] = 0.0; | 
					
						
							|  |  |  |     break; | 
					
						
							|  |  |  |   case array_of_ptrs: | 
					
						
							|  |  |  |     for (i = 0; i <mindim; i++) | 
					
						
							|  |  |  |       pp->ValueOfVE.ptrs[i] = old_v.ptrs[i]; | 
					
						
							|  |  |  |     for (i = mindim; i<dim; i++) | 
					
						
							|  |  |  |       pp->ValueOfVE.ptrs[i] = NULL; | 
					
						
							|  |  |  |     break; | 
					
						
							|  |  |  |   case array_of_atoms: | 
					
						
							|  |  |  |     for (i = 0; i <mindim; i++) | 
					
						
							|  |  |  |       pp->ValueOfVE.atoms[i] = old_v.atoms[i]; | 
					
						
							|  |  |  |     for (i = mindim; i<dim; i++) | 
					
						
							|  |  |  |       pp->ValueOfVE.atoms[i] = TermNil; | 
					
						
							|  |  |  |     break; | 
					
						
							|  |  |  |   case array_of_dbrefs: | 
					
						
							|  |  |  |     for (i = 0; i <mindim; i++) | 
					
						
							|  |  |  |       pp->ValueOfVE.dbrefs[i] = old_v.dbrefs[i]; | 
					
						
							|  |  |  |     for (i = mindim; i<dim; i++) | 
					
						
							|  |  |  |       pp->ValueOfVE.dbrefs[i] = 0L; | 
					
						
							|  |  |  |     break; | 
					
						
							|  |  |  |   case array_of_terms: | 
					
						
							|  |  |  |     for (i = 0; i <mindim; i++) | 
					
						
							|  |  |  |       pp->ValueOfVE.terms[i] = old_v.terms[i]; | 
					
						
							|  |  |  |     for (i = mindim; i<dim; i++) | 
					
						
							|  |  |  |       pp->ValueOfVE.terms[i] = NULL; | 
					
						
							|  |  |  |     break; | 
					
						
							| 
									
										
										
										
											2005-10-19 19:00:48 +00:00
										 |  |  |   case array_of_nb_terms: | 
					
						
							|  |  |  |     for (i = 0; i <mindim; i++) { | 
					
						
							|  |  |  |       Term tlive = pp->ValueOfVE.lterms[i].tlive; | 
					
						
							|  |  |  |       if (IsVarTerm(tlive) && IsUnboundVar(&(pp->ValueOfVE.lterms[i].tlive))) { | 
					
						
							|  |  |  | 	RESET_VARIABLE(&(pp->ValueOfVE.lterms[i].tlive)); | 
					
						
							|  |  |  |       } else { | 
					
						
							|  |  |  | 	pp->ValueOfVE.lterms[i].tlive = tlive; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       pp->ValueOfVE.lterms[i].tstore = old_v.lterms[i].tstore; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     break; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   WRITE_UNLOCK(pp->ArRWLock); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-11 11:08:25 +00:00
										 |  |  | static void | 
					
						
							|  |  |  | ClearStaticArray(StaticArrayEntry *pp) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   statarray_elements old_v = pp->ValueOfVE; | 
					
						
							|  |  |  |   static_array_types type = pp->ArrayType; | 
					
						
							|  |  |  |   Int dim = - pp->ArrayEArity, i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* change official size */ | 
					
						
							|  |  |  |   if (pp->ArrayEArity >= 0){ | 
					
						
							|  |  |  |     return; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   WRITE_LOCK(pp->ArRWLock); | 
					
						
							|  |  |  |   switch(type) { | 
					
						
							|  |  |  |   case array_of_ints: | 
					
						
							| 
									
										
										
										
											2011-12-05 21:04:31 +00:00
										 |  |  |     memset((void *)pp->ValueOfVE.ints,0,sizeof(Int)*dim); | 
					
						
							| 
									
										
										
										
											2008-06-11 11:08:25 +00:00
										 |  |  |     break; | 
					
						
							|  |  |  |   case array_of_chars: | 
					
						
							|  |  |  |     memset((void *)pp->ValueOfVE.chars,0,sizeof(char)*dim); | 
					
						
							|  |  |  |     break; | 
					
						
							|  |  |  |   case array_of_uchars: | 
					
						
							|  |  |  |     memset((void *)pp->ValueOfVE.uchars,0,sizeof(unsigned char)*dim); | 
					
						
							|  |  |  |     break; | 
					
						
							|  |  |  |   case array_of_doubles: | 
					
						
							|  |  |  |     memset((void *)pp->ValueOfVE.floats,0,sizeof(double)*dim); | 
					
						
							|  |  |  |     break; | 
					
						
							|  |  |  |   case array_of_ptrs: | 
					
						
							|  |  |  |     memset((void *)pp->ValueOfVE.ptrs,0,sizeof(void *)*dim); | 
					
						
							|  |  |  |     break; | 
					
						
							|  |  |  |   case array_of_atoms: | 
					
						
							|  |  |  |     for (i = 0;  i< dim; i++) | 
					
						
							|  |  |  |       pp->ValueOfVE.atoms[i] = TermNil; | 
					
						
							|  |  |  |     break; | 
					
						
							|  |  |  |   case array_of_dbrefs: | 
					
						
							|  |  |  |     for (i = 0; i < dim; i++) { | 
					
						
							|  |  |  |       Term t0 = pp->ValueOfVE.dbrefs[i]; | 
					
						
							|  |  |  |       if (t0 != 0L) { | 
					
						
							|  |  |  | 	DBRef ptr = DBRefOfTerm(t0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (ptr->Flags & LogUpdMask) { | 
					
						
							|  |  |  | 	  LogUpdClause *lup = (LogUpdClause *)ptr; | 
					
						
							| 
									
										
										
										
											2008-08-07 20:51:23 +00:00
										 |  |  | 	  //	  LOCK(lup->ClLock);
 | 
					
						
							| 
									
										
										
										
											2008-06-11 11:08:25 +00:00
										 |  |  | 	  lup->ClRefCount--; | 
					
						
							|  |  |  | 	  if (lup->ClRefCount == 0 && | 
					
						
							|  |  |  | 	      (lup->ClFlags & ErasedMask) && | 
					
						
							|  |  |  | 	      !(lup->ClFlags & InUseMask)) { | 
					
						
							| 
									
										
										
										
											2008-08-07 20:51:23 +00:00
										 |  |  | 	    //	    UNLOCK(lup->ClLock);
 | 
					
						
							| 
									
										
										
										
											2008-06-11 11:08:25 +00:00
										 |  |  | 	    Yap_ErLogUpdCl(lup); | 
					
						
							|  |  |  | 	  } else { | 
					
						
							| 
									
										
										
										
											2008-08-07 20:51:23 +00:00
										 |  |  | 	    //	    UNLOCK(lup->ClLock);
 | 
					
						
							| 
									
										
										
										
											2008-06-11 11:08:25 +00:00
										 |  |  | 	  } | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 	  ptr->NOfRefsTo--; | 
					
						
							|  |  |  | 	  if (ptr->NOfRefsTo == 0 && | 
					
						
							|  |  |  | 	      (ptr->Flags & ErasedMask) && | 
					
						
							|  |  |  | 	      !(ptr->Flags & InUseMask)) { | 
					
						
							|  |  |  | 	    Yap_ErDBE(ptr); | 
					
						
							|  |  |  | 	  } | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       pp->ValueOfVE.dbrefs[i] = 0L; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     break; | 
					
						
							|  |  |  |   case array_of_terms: | 
					
						
							|  |  |  |     for (i = 0; i < dim; i++) { | 
					
						
							|  |  |  |       DBTerm *ref = pp->ValueOfVE.terms[i]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if (ref != NULL) { | 
					
						
							|  |  |  | 	Yap_ReleaseTermFromDB(ref); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       pp->ValueOfVE.terms[i] = NULL; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     break; | 
					
						
							|  |  |  |   case array_of_nb_terms: | 
					
						
							|  |  |  |     for (i = 0; i < dim; i++) { | 
					
						
							|  |  |  |       Term told = pp->ValueOfVE.lterms[i].tstore; | 
					
						
							|  |  |  |       CELL *livep = &(pp->ValueOfVE.lterms[i].tlive); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       RESET_VARIABLE(livep); | 
					
						
							|  |  |  |       /* recover space */ | 
					
						
							|  |  |  |       if (IsApplTerm(told)) { | 
					
						
							|  |  |  | 	Yap_ReleaseTermFromDB((DBTerm *)RepAppl(told)); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       pp->ValueOfVE.lterms[i].tstore = old_v.lterms[i].tstore; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     break; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   WRITE_UNLOCK(pp->ArRWLock); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | /* create an array (?Name, + Size) */ | 
					
						
							|  |  |  | static Int  | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | p_create_array( USES_REGS1 ) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   Term ti; | 
					
						
							|  |  |  |   Term t; | 
					
						
							|  |  |  |   Int size; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  restart: | 
					
						
							|  |  |  |   ti = Deref(ARG2); | 
					
						
							|  |  |  |   t = Deref(ARG1); | 
					
						
							|  |  |  |   { | 
					
						
							| 
									
										
										
										
											2008-12-04 23:33:32 +00:00
										 |  |  |     Term nti; | 
					
						
							|  |  |  |     if (IsVarTerm(ti)) { | 
					
						
							|  |  |  |       Yap_Error(INSTANTIATION_ERROR,ti,"create_array"); | 
					
						
							|  |  |  |       return (FALSE); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if (IsIntegerTerm(nti=Yap_Eval(ti))) | 
					
						
							|  |  |  |       size = IntegerOfTerm(nti); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     else { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |       Yap_Error(TYPE_ERROR_INTEGER,ti,"create_array"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       return (FALSE); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (IsVarTerm(t)) { | 
					
						
							|  |  |  |     /* Create an anonymous array */ | 
					
						
							|  |  |  |     Functor farray; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     farray = Yap_MkFunctor(AtomArray, size); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     if (H+1+size > ASP-1024) { | 
					
						
							| 
									
										
										
										
											2008-08-28 04:43:00 +01:00
										 |  |  |       if (!Yap_gcl((1+size)*sizeof(CELL), 2, ENV, gc_P(P,CP))) { | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  | 	Yap_Error(OUT_OF_STACK_ERROR,TermNil,LOCAL_ErrorMessage); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 	return(FALSE); | 
					
						
							|  |  |  |       } else { | 
					
						
							|  |  |  | 	if (H+1+size > ASP-1024) { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  | 	  if (!Yap_growstack( sizeof(CELL) * (size+1-(H-ASP-1024)))) { | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  | 	    Yap_Error(OUT_OF_HEAP_ERROR, TermNil, LOCAL_ErrorMessage); | 
					
						
							| 
									
										
										
										
											2002-10-10 05:58:49 +00:00
										 |  |  | 	    return FALSE; | 
					
						
							|  |  |  | 	  } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       goto restart; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     t = AbsAppl(H); | 
					
						
							|  |  |  |     *H++ = (CELL) farray; | 
					
						
							|  |  |  |     for (; size >= 0; size--) { | 
					
						
							|  |  |  |       RESET_VARIABLE(H); | 
					
						
							|  |  |  |       H++; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     return (Yap_unify(t, ARG1)); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   else if (IsAtomTerm(t)) { | 
					
						
							|  |  |  |     /* Create a named array */ | 
					
						
							|  |  |  |     AtomEntry *ae = RepAtom(AtomOfTerm(t)); | 
					
						
							|  |  |  |     PropEntry *pp; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     WRITE_LOCK(ae->ARWLock); | 
					
						
							| 
									
										
										
										
											2001-10-30 16:42:05 +00:00
										 |  |  |     pp = RepProp(ae->PropsOfAE); | 
					
						
							| 
									
										
										
										
											2005-09-22 03:26:13 +00:00
										 |  |  |     while (!EndOfPAEntr(pp) && | 
					
						
							|  |  |  | 	   pp->KindOfPE != ArrayProperty | 
					
						
							|  |  |  | #if THREADS
 | 
					
						
							| 
									
										
										
										
											2005-11-16 01:55:03 +00:00
										 |  |  | 	   && ((ArrayEntry *)pp)->owner_id != worker_id | 
					
						
							| 
									
										
										
										
											2005-09-22 03:26:13 +00:00
										 |  |  | #endif	   
 | 
					
						
							|  |  |  | 	   ) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       pp = RepProp(pp->NextOfPE); | 
					
						
							|  |  |  |     if (EndOfPAEntr(pp)) { | 
					
						
							|  |  |  |       if (H+1+size > ASP-1024) { | 
					
						
							|  |  |  | 	WRITE_UNLOCK(ae->ARWLock); | 
					
						
							| 
									
										
										
										
											2008-08-28 04:43:00 +01:00
										 |  |  | 	if (!Yap_gcl((1+size)*sizeof(CELL), 2, ENV, gc_P(P,CP))) { | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  | 	  Yap_Error(OUT_OF_STACK_ERROR,TermNil,LOCAL_ErrorMessage); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 	  return(FALSE); | 
					
						
							|  |  |  | 	} else | 
					
						
							|  |  |  | 	  goto restart; | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       CreateNamedArray(pp, size, ae PASS_REGS); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       WRITE_UNLOCK(ae->ARWLock); | 
					
						
							|  |  |  |       return (TRUE); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       ArrayEntry *app = (ArrayEntry *) pp; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       WRITE_UNLOCK(ae->ARWLock); | 
					
						
							| 
									
										
										
										
											2005-09-22 03:26:13 +00:00
										 |  |  |       if (!IsVarTerm(app->ValueOfVE) | 
					
						
							|  |  |  | 	  || !IsUnboundVar(&app->ValueOfVE)) { | 
					
						
							| 
									
										
										
										
											2005-10-28 17:38:50 +00:00
										 |  |  | 	if (size == app->ArrayEArity || | 
					
						
							|  |  |  | 	    size == -app->ArrayEArity) | 
					
						
							| 
									
										
										
										
											2005-09-22 03:26:13 +00:00
										 |  |  | 	  return TRUE; | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  | 	Yap_Error(PERMISSION_ERROR_CREATE_ARRAY,t,"create_array", | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 	      ae->StrOfAE); | 
					
						
							| 
									
										
										
										
											2005-09-22 03:26:13 +00:00
										 |  |  |       } else { | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 	if (H+1+size > ASP-1024) { | 
					
						
							| 
									
										
										
										
											2008-08-28 04:43:00 +01:00
										 |  |  | 	  if (!Yap_gcl((1+size)*sizeof(CELL), 2, ENV, gc_P(P,CP))) { | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  | 	    Yap_Error(OUT_OF_STACK_ERROR,TermNil,LOCAL_ErrorMessage); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 	    return(FALSE); | 
					
						
							|  |  |  | 	  } else | 
					
						
							|  |  |  | 	    goto restart; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | 	InitNamedArray(app, size PASS_REGS); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 	return (TRUE); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return (FALSE); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* create an array (+Name, + Size, +Props) */ | 
					
						
							|  |  |  | static Int  | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | p_create_static_array( USES_REGS1 ) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   Term ti = Deref(ARG2); | 
					
						
							|  |  |  |   Term t = Deref(ARG1); | 
					
						
							|  |  |  |   Term tprops = Deref(ARG3); | 
					
						
							|  |  |  |   Int size; | 
					
						
							|  |  |  |   static_array_types props; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (IsVarTerm(ti)) { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     Yap_Error(INSTANTIATION_ERROR,ti,"create static array"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     return (FALSE); | 
					
						
							| 
									
										
										
										
											2008-12-04 23:33:32 +00:00
										 |  |  |   } else { | 
					
						
							|  |  |  |     Term nti; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (IsIntegerTerm(nti=Yap_Eval(ti))) | 
					
						
							|  |  |  |       size = IntegerOfTerm(nti); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     else { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |       Yap_Error(TYPE_ERROR_INTEGER,ti,"create static array"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       return (FALSE); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (IsVarTerm(tprops)) { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     Yap_Error(INSTANTIATION_ERROR,tprops,"create static array"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     return (FALSE); | 
					
						
							|  |  |  |   } else if (IsAtomTerm(tprops)) { | 
					
						
							|  |  |  |     char *atname = RepAtom(AtomOfTerm(tprops))->StrOfAE; | 
					
						
							|  |  |  |     if (!strcmp(atname, "int")) | 
					
						
							|  |  |  |       props = array_of_ints; | 
					
						
							|  |  |  |     else if (!strcmp(atname, "dbref")) | 
					
						
							|  |  |  |       props = array_of_dbrefs; | 
					
						
							|  |  |  |     else if (!strcmp(atname, "float")) | 
					
						
							|  |  |  |       props = array_of_doubles; | 
					
						
							|  |  |  |     else if (!strcmp(atname, "ptr")) | 
					
						
							|  |  |  |       props = array_of_ptrs; | 
					
						
							|  |  |  |     else if (!strcmp(atname, "atom")) | 
					
						
							|  |  |  |       props = array_of_atoms; | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  |     else if (!strcmp(atname, "char")) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       props = array_of_chars; | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  |     else if (!strcmp(atname, "unsigned_char")) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       props = array_of_uchars; | 
					
						
							|  |  |  |     else if (!strcmp(atname, "term")) | 
					
						
							|  |  |  |       props = array_of_terms; | 
					
						
							| 
									
										
										
										
											2005-10-19 19:00:48 +00:00
										 |  |  |     else if (!strcmp(atname, "nb_term")) | 
					
						
							|  |  |  |       props = array_of_nb_terms; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     else { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |       Yap_Error(DOMAIN_ERROR_ARRAY_TYPE,tprops,"create static array"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       return(FALSE); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     Yap_Error(TYPE_ERROR_ATOM,tprops,"create static array"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     return (FALSE); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (IsVarTerm(t)) { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     Yap_Error(INSTANTIATION_ERROR,t,"create static array"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     return (FALSE); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   else if (IsAtomTerm(t)) { | 
					
						
							|  |  |  |     /* Create a named array */ | 
					
						
							|  |  |  |     AtomEntry *ae = RepAtom(AtomOfTerm(t)); | 
					
						
							|  |  |  |     StaticArrayEntry *pp; | 
					
						
							| 
									
										
										
										
											2005-07-06 15:10:18 +00:00
										 |  |  |     ArrayEntry *app; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     WRITE_LOCK(ae->ARWLock); | 
					
						
							| 
									
										
										
										
											2001-10-30 16:42:05 +00:00
										 |  |  |     pp = RepStaticArrayProp(ae->PropsOfAE); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     while (!EndOfPAEntr(pp) && pp->KindOfPE != ArrayProperty) | 
					
						
							|  |  |  |       pp = RepStaticArrayProp(pp->NextOfPE); | 
					
						
							| 
									
										
										
										
											2002-03-27 20:53:58 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     app = (ArrayEntry *) pp; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     if (EndOfPAEntr(pp) || pp->ValueOfVE.ints == NULL) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       pp = CreateStaticArray(ae, size, props, NULL, pp PASS_REGS); | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |       if (pp == NULL || pp->ValueOfVE.ints == NULL) { | 
					
						
							|  |  |  | 	WRITE_UNLOCK(ae->ARWLock); | 
					
						
							|  |  |  | 	return FALSE; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       WRITE_UNLOCK(ae->ARWLock); | 
					
						
							|  |  |  |       return TRUE; | 
					
						
							| 
									
										
										
										
											2002-03-27 20:53:58 +00:00
										 |  |  |     } else if (ArrayIsDynamic(app)) { | 
					
						
							| 
									
										
										
										
											2004-09-18 14:03:42 +00:00
										 |  |  |       if (IsVarTerm(app->ValueOfVE) && IsUnboundVar(&app->ValueOfVE)) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | 	pp = CreateStaticArray(ae, size, props, NULL, pp PASS_REGS); | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  | 	WRITE_UNLOCK(ae->ARWLock); | 
					
						
							|  |  |  | 	if (pp == NULL) { | 
					
						
							|  |  |  | 	  return FALSE; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return TRUE; | 
					
						
							| 
									
										
										
										
											2002-03-27 20:53:58 +00:00
										 |  |  |       } else { | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  | 	WRITE_UNLOCK(ae->ARWLock); | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  | 	Yap_Error(PERMISSION_ERROR_CREATE_ARRAY,t,"cannot create static array over dynamic array"); | 
					
						
							| 
									
										
										
										
											2005-09-22 03:26:13 +00:00
										 |  |  | 	return FALSE; | 
					
						
							| 
									
										
										
										
											2002-03-27 20:53:58 +00:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2005-09-22 03:26:13 +00:00
										 |  |  |       if (pp->ArrayEArity  == -size && | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  | 	  pp->ArrayType == props) { | 
					
						
							|  |  |  | 	WRITE_UNLOCK(ae->ARWLock); | 
					
						
							|  |  |  | 	return TRUE; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       WRITE_UNLOCK(ae->ARWLock); | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |       Yap_Error(PERMISSION_ERROR_CREATE_ARRAY,t,"cannot create static array over static array"); | 
					
						
							| 
									
										
										
										
											2005-09-22 03:26:13 +00:00
										 |  |  |       return FALSE; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   Yap_Error(TYPE_ERROR_ATOM,t,"create static array"); | 
					
						
							| 
									
										
										
										
											2005-09-22 03:26:13 +00:00
										 |  |  |   return FALSE; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-06-08 19:10:43 +00:00
										 |  |  | /* has a static array associated (+Name) */ | 
					
						
							|  |  |  | static Int  | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | p_static_array_properties( USES_REGS1 ) | 
					
						
							| 
									
										
										
										
											2001-06-08 19:10:43 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   Term t = Deref(ARG1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (IsVarTerm(t)) { | 
					
						
							|  |  |  |     return (FALSE); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   else if (IsAtomTerm(t)) { | 
					
						
							|  |  |  |     /* Create a named array */ | 
					
						
							|  |  |  |     AtomEntry *ae = RepAtom(AtomOfTerm(t)); | 
					
						
							|  |  |  |     StaticArrayEntry *pp; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     READ_LOCK(ae->ARWLock); | 
					
						
							| 
									
										
										
										
											2001-10-30 16:42:05 +00:00
										 |  |  |     pp = RepStaticArrayProp(ae->PropsOfAE); | 
					
						
							| 
									
										
										
										
											2001-06-08 19:10:43 +00:00
										 |  |  |     while (!EndOfPAEntr(pp) && pp->KindOfPE != ArrayProperty) | 
					
						
							|  |  |  |       pp = RepStaticArrayProp(pp->NextOfPE); | 
					
						
							|  |  |  |     if (EndOfPAEntr(pp) || pp->ValueOfVE.ints == NULL) { | 
					
						
							|  |  |  |       READ_UNLOCK(ae->ARWLock); | 
					
						
							|  |  |  |       return (FALSE); | 
					
						
							|  |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  |       static_array_types tp = pp->ArrayType; | 
					
						
							|  |  |  |       Int dim = -pp->ArrayEArity; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-06-08 19:10:43 +00:00
										 |  |  |       READ_UNLOCK(ae->ARWLock); | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  |       if (dim <= 0 || !Yap_unify(ARG2,MkIntegerTerm(dim))) | 
					
						
							|  |  |  | 	return(FALSE); | 
					
						
							|  |  |  |       switch(tp) { | 
					
						
							|  |  |  |       case array_of_ints: | 
					
						
							| 
									
										
										
										
											2008-12-23 01:53:52 +00:00
										 |  |  | 	return(Yap_unify(ARG3,MkAtomTerm(AtomInt))); | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  |       case array_of_dbrefs: | 
					
						
							| 
									
										
										
										
											2008-12-23 01:53:52 +00:00
										 |  |  | 	return(Yap_unify(ARG3,MkAtomTerm(AtomDBref))); | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  |       case array_of_doubles: | 
					
						
							| 
									
										
										
										
											2008-12-23 01:53:52 +00:00
										 |  |  | 	return(Yap_unify(ARG3,MkAtomTerm(AtomFloat))); | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  |       case array_of_ptrs: | 
					
						
							| 
									
										
										
										
											2008-12-23 01:53:52 +00:00
										 |  |  | 	return(Yap_unify(ARG3,MkAtomTerm(AtomPtr))); | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  |       case array_of_chars: | 
					
						
							| 
									
										
										
										
											2008-12-23 01:53:52 +00:00
										 |  |  | 	return(Yap_unify(ARG3,MkAtomTerm(AtomChar))); | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  |       case array_of_uchars: | 
					
						
							| 
									
										
										
										
											2008-12-23 01:53:52 +00:00
										 |  |  | 	return(Yap_unify(ARG3,MkAtomTerm(AtomUnsignedChar))); | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  |       case array_of_terms: | 
					
						
							| 
									
										
										
										
											2008-12-23 01:53:52 +00:00
										 |  |  | 	return(Yap_unify(ARG3,MkAtomTerm(AtomTerm))); | 
					
						
							| 
									
										
										
										
											2005-10-19 19:00:48 +00:00
										 |  |  |       case array_of_nb_terms: | 
					
						
							| 
									
										
										
										
											2008-12-23 01:53:52 +00:00
										 |  |  | 	return(Yap_unify(ARG3,MkAtomTerm(AtomNbTerm))); | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  |       case array_of_atoms: | 
					
						
							| 
									
										
										
										
											2008-12-23 01:53:52 +00:00
										 |  |  | 	return(Yap_unify(ARG3,MkAtomTerm(AtomAtom))); | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2001-06-08 19:10:43 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  |   return (FALSE); | 
					
						
							| 
									
										
										
										
											2001-06-08 19:10:43 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | /* resize a static array (+Name, + Size, +Props) */ | 
					
						
							|  |  |  | /* does not work for mmap arrays yet */ | 
					
						
							|  |  |  | static Int  | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | p_resize_static_array( USES_REGS1 ) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   Term ti = Deref(ARG3); | 
					
						
							|  |  |  |   Term t = Deref(ARG1); | 
					
						
							|  |  |  |   Int size; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (IsVarTerm(ti)) { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     Yap_Error(INSTANTIATION_ERROR,ti,"resize a static array"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     return (FALSE); | 
					
						
							| 
									
										
										
										
											2008-12-04 23:33:32 +00:00
										 |  |  |   } else { | 
					
						
							|  |  |  |     Term nti; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (IsIntegerTerm(nti=Yap_Eval(ti))) | 
					
						
							|  |  |  |       size = IntegerOfTerm(nti); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     else { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |       Yap_Error(TYPE_ERROR_INTEGER,ti,"resize a static array"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       return (FALSE); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (IsVarTerm(t)) { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     Yap_Error(INSTANTIATION_ERROR,t,"resize a static array"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     return (FALSE); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   else if (IsAtomTerm(t)) { | 
					
						
							|  |  |  |     /* resize a named array */ | 
					
						
							|  |  |  |     Atom a = AtomOfTerm(t); | 
					
						
							| 
									
										
										
										
											2001-10-30 16:42:05 +00:00
										 |  |  |     StaticArrayEntry *pp = RepStaticArrayProp(RepAtom(a)->PropsOfAE); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     while (!EndOfPAEntr(pp) && pp->KindOfPE != ArrayProperty) | 
					
						
							|  |  |  |       pp = RepStaticArrayProp(pp->NextOfPE); | 
					
						
							|  |  |  |     if (EndOfPAEntr(pp) || pp->ValueOfVE.ints == NULL) { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |       Yap_Error(PERMISSION_ERROR_RESIZE_ARRAY,t,"resize a static array"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       return(FALSE); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       Int osize =  - pp->ArrayEArity; | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       ResizeStaticArray(pp, size PASS_REGS); | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |       return(Yap_unify(ARG2,MkIntegerTerm(osize))); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     Yap_Error(TYPE_ERROR_ATOM,t,"resize a static array"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     return (FALSE); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-11 11:08:25 +00:00
										 |  |  | /* resize a static array (+Name, + Size, +Props) */ | 
					
						
							|  |  |  | /* does not work for mmap arrays yet */ | 
					
						
							|  |  |  | static Int  | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | p_clear_static_array( USES_REGS1 ) | 
					
						
							| 
									
										
										
										
											2008-06-11 11:08:25 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   Term t = Deref(ARG1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (IsVarTerm(t)) { | 
					
						
							|  |  |  |     Yap_Error(INSTANTIATION_ERROR,t,"clear a static array"); | 
					
						
							|  |  |  |     return FALSE; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   else if (IsAtomTerm(t)) { | 
					
						
							|  |  |  |     /* resize a named array */ | 
					
						
							|  |  |  |     Atom a = AtomOfTerm(t); | 
					
						
							|  |  |  |     StaticArrayEntry *pp = RepStaticArrayProp(RepAtom(a)->PropsOfAE); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     while (!EndOfPAEntr(pp) && pp->KindOfPE != ArrayProperty) | 
					
						
							|  |  |  |       pp = RepStaticArrayProp(pp->NextOfPE); | 
					
						
							|  |  |  |     if (EndOfPAEntr(pp) || pp->ValueOfVE.ints == NULL) { | 
					
						
							|  |  |  |       Yap_Error(PERMISSION_ERROR_RESIZE_ARRAY,t,"clear a static array"); | 
					
						
							|  |  |  |       return FALSE; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       ClearStaticArray(pp); | 
					
						
							|  |  |  |       return TRUE; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     Yap_Error(TYPE_ERROR_ATOM,t,"clear a static array"); | 
					
						
							|  |  |  |     return FALSE; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | /* Close a named array (+Name) */ | 
					
						
							|  |  |  | static Int  | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | p_close_static_array( USES_REGS1 ) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							|  |  |  | /* does not work for mmap arrays yet */ | 
					
						
							|  |  |  |   Term t = Deref(ARG1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (IsVarTerm(t)) { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     Yap_Error(INSTANTIATION_ERROR,t,"close static array"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     return (FALSE); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   else if (IsAtomTerm(t)) { | 
					
						
							|  |  |  |     /* Create a named array */ | 
					
						
							|  |  |  |     AtomEntry *ae = RepAtom(AtomOfTerm(t)); | 
					
						
							|  |  |  |     PropEntry *pp; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     READ_LOCK(ae->ARWLock); | 
					
						
							| 
									
										
										
										
											2001-10-30 16:42:05 +00:00
										 |  |  |     pp = RepProp(ae->PropsOfAE); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     while (!EndOfPAEntr(pp) && pp->KindOfPE != ArrayProperty) | 
					
						
							|  |  |  |       pp = RepProp(pp->NextOfPE); | 
					
						
							|  |  |  |     READ_UNLOCK(ae->ARWLock); | 
					
						
							|  |  |  |     if (EndOfPAEntr(pp)) { | 
					
						
							|  |  |  |       return (FALSE); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       StaticArrayEntry *ptr = (StaticArrayEntry *)pp; | 
					
						
							|  |  |  |       if (ptr->ValueOfVE.ints != NULL) { | 
					
						
							|  |  |  | #if HAVE_MMAP
 | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  | 	if (ptr->ValueOfVE.chars < (char *)Yap_HeapBase ||  | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 	    ptr->ValueOfVE.chars > (char *)HeapTop) { | 
					
						
							| 
									
										
										
										
											2011-04-16 00:31:51 +01:00
										 |  |  | 	  Int val = CloseMmappedArray(ptr, (void *)ptr->ValueOfVE.chars PASS_REGS); | 
					
						
							|  |  |  | #if USE_SYSTEM_MALLOC
 | 
					
						
							|  |  |  | 	  if (val) | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 	    return(val); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  | 	Yap_FreeAtomSpace((char *)(ptr->ValueOfVE.ints)); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 	ptr->ValueOfVE.ints = NULL; | 
					
						
							|  |  |  | 	ptr->ArrayEArity = 0; | 
					
						
							|  |  |  | 	return(TRUE); | 
					
						
							|  |  |  |       } else { | 
					
						
							|  |  |  | 	return(FALSE); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     Yap_Error(TYPE_ERROR_ATOM,t,"close static array"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     return (FALSE); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* create an array (+Name, + Size, +Props) */ | 
					
						
							|  |  |  | static Int  | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | p_create_mmapped_array( USES_REGS1 ) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							|  |  |  | #ifdef HAVE_MMAP
 | 
					
						
							|  |  |  |   Term ti = Deref(ARG2); | 
					
						
							|  |  |  |   Term t = Deref(ARG1); | 
					
						
							|  |  |  |   Term tprops = Deref(ARG3); | 
					
						
							|  |  |  |   Term tfile = Deref(ARG4); | 
					
						
							|  |  |  |   Int size; | 
					
						
							|  |  |  |   static_array_types props; | 
					
						
							|  |  |  |   size_t total_size; | 
					
						
							|  |  |  |   CODEADDR array_addr; | 
					
						
							|  |  |  |   int fd; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (IsVarTerm(ti)) { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     Yap_Error(INSTANTIATION_ERROR,ti,"create_mmapped_array"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     return (FALSE); | 
					
						
							| 
									
										
										
										
											2008-12-04 23:33:32 +00:00
										 |  |  |   } else { | 
					
						
							|  |  |  |     Term nti; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (IsIntegerTerm(nti=Yap_Eval(ti))) | 
					
						
							|  |  |  |       size = IntegerOfTerm(nti); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     else { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |       Yap_Error(TYPE_ERROR_INTEGER,ti,"create_mmapped_array"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       return (FALSE); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (IsVarTerm(tprops)) { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     Yap_Error(INSTANTIATION_ERROR,tprops,"create_mmapped_array"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     return (FALSE); | 
					
						
							|  |  |  |   } else if (IsAtomTerm(tprops)) { | 
					
						
							|  |  |  |     char *atname = RepAtom(AtomOfTerm(tprops))->StrOfAE; | 
					
						
							|  |  |  |     if (!strcmp(atname, "int")) { | 
					
						
							|  |  |  |       props = array_of_ints; | 
					
						
							|  |  |  |       total_size = size*sizeof(Int); | 
					
						
							|  |  |  |     } else if (!strcmp(atname, "dbref")) { | 
					
						
							|  |  |  |       props = array_of_dbrefs; | 
					
						
							|  |  |  |       total_size = size*sizeof(Int); | 
					
						
							|  |  |  |     } else if (!strcmp(atname, "float")) { | 
					
						
							|  |  |  |       props = array_of_doubles; | 
					
						
							|  |  |  |       total_size = size*sizeof(Float); | 
					
						
							|  |  |  |     } else if (!strcmp(atname, "ptr")) { | 
					
						
							|  |  |  |       props = array_of_ptrs; | 
					
						
							|  |  |  |       total_size = size*sizeof(AtomEntry *); | 
					
						
							|  |  |  |     } else if (!strcmp(atname, "atom")) { | 
					
						
							|  |  |  |       props = array_of_atoms; | 
					
						
							|  |  |  |       total_size = size*sizeof(Term); | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  |     } else if (!strcmp(atname, "char")) { | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       props = array_of_chars; | 
					
						
							|  |  |  |       total_size = size*sizeof(char); | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  |     } else if (!strcmp(atname, "unsigned_char")) { | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       props = array_of_uchars; | 
					
						
							|  |  |  |       total_size = size*sizeof(unsigned char); | 
					
						
							|  |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |       Yap_Error(DOMAIN_ERROR_ARRAY_TYPE,tprops,"create_mmapped_array"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       return(FALSE); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     Yap_Error(TYPE_ERROR_ATOM,tprops,"create_mmapped_array"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     return (FALSE); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (IsVarTerm(tfile)) { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     Yap_Error(INSTANTIATION_ERROR,tfile,"create_mmapped_array"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     return (FALSE); | 
					
						
							|  |  |  |   } else if (IsAtomTerm(tfile)) { | 
					
						
							|  |  |  |     char *filename = RepAtom(AtomOfTerm(tfile))->StrOfAE; | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     fd = open(filename, O_RDWR|O_CREAT, S_IRUSR|S_IWUSR); | 
					
						
							|  |  |  |     if (fd == -1) { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |       Yap_Error(SYSTEM_ERROR,ARG1,"create_mmapped_array (open: %s)", strerror(errno)); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       return(FALSE); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if (lseek(fd, total_size-1, SEEK_SET) < 0) | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |       Yap_Error(SYSTEM_ERROR,tfile,"create_mmapped_array (lseek: %s)", strerror(errno)); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     if (write(fd, "", 1) < 0) | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |       Yap_Error(SYSTEM_ERROR,tfile,"create_mmapped_array (write: %s)", strerror(errno)); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     /*
 | 
					
						
							|  |  |  |       if (ftruncate(fd, total_size) < 0) | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |       Yap_Error(SYSTEM_ERROR,tfile,"create_mmapped_array"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     */ | 
					
						
							|  |  |  |     if ((array_addr = (CODEADDR)mmap(0, (size_t) total_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)) == (CODEADDR) - 1) | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |       Yap_Error(SYSTEM_ERROR,tfile,"create_mmapped_array (mmap: %s)", strerror(errno)); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     Yap_Error(TYPE_ERROR_ATOM,tfile,"create_mmapped_array"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     return (FALSE); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (IsVarTerm(t)) { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     Yap_Error(INSTANTIATION_ERROR,t,"create_mmapped_array"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     return (FALSE); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   else if (IsAtomTerm(t)) { | 
					
						
							|  |  |  |     /* Create a named array */ | 
					
						
							|  |  |  |     AtomEntry *ae = RepAtom(AtomOfTerm(t)); | 
					
						
							|  |  |  |     StaticArrayEntry *pp; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     WRITE_LOCK(ae->ARWLock); | 
					
						
							| 
									
										
										
										
											2001-10-30 16:42:05 +00:00
										 |  |  |     pp = RepStaticArrayProp(ae->PropsOfAE); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     while (!EndOfPAEntr(pp) && pp->KindOfPE != ArrayProperty) | 
					
						
							|  |  |  |       pp = RepStaticArrayProp(pp->NextOfPE); | 
					
						
							|  |  |  |     if (EndOfPAEntr(pp) || pp->ValueOfVE.ints == NULL) { | 
					
						
							|  |  |  |       mmap_array_block *ptr; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |       if (EndOfPAEntr(pp)) { | 
					
						
							|  |  |  | 	WRITE_UNLOCK(ae->ARWLock); | 
					
						
							|  |  |  | 	return FALSE;	 | 
					
						
							|  |  |  |       } else { | 
					
						
							|  |  |  | 	WRITE_LOCK(pp->ArRWLock); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |       CreateStaticArray(ae, size, props, array_addr, pp PASS_REGS); | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |       ptr = (mmap_array_block *)Yap_AllocAtomSpace(sizeof(mmap_array_block)); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       ptr->name = AbsAtom(ae); | 
					
						
							|  |  |  |       ptr->size = total_size; | 
					
						
							|  |  |  |       ptr->items = size; | 
					
						
							|  |  |  |       ptr->start = (void *)array_addr; | 
					
						
							|  |  |  |       ptr->fd = fd; | 
					
						
							| 
									
										
										
										
											2011-05-25 16:40:36 +01:00
										 |  |  |       ptr->next = GLOBAL_mmap_arrays; | 
					
						
							|  |  |  |       GLOBAL_mmap_arrays = ptr; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       WRITE_UNLOCK(pp->ArRWLock); | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |       WRITE_UNLOCK(ae->ARWLock); | 
					
						
							|  |  |  |       return TRUE; | 
					
						
							|  |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       WRITE_UNLOCK(ae->ARWLock); | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |       Yap_Error(DOMAIN_ERROR_ARRAY_TYPE,t,"create_mmapped_array", ae->StrOfAE); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       return(FALSE); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     Yap_Error(TYPE_ERROR_ATOM,t,"create_mmapped_array"); | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   Yap_Error(SYSTEM_ERROR,ARG1,"create_mmapped_array (mmap)"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   return (FALSE); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-01-23 02:23:51 +00:00
										 |  |  | /* This routine removes array references from complex terms? */ | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | static void  | 
					
						
							|  |  |  | replace_array_references_complex(register CELL *pt0, | 
					
						
							|  |  |  | 				 register CELL *pt0_end, | 
					
						
							|  |  |  | 				 register CELL *ptn, | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | 				 Term Var USES_REGS) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   register CELL **to_visit = (CELL **) Yap_PreAllocCodeSpace(); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   CELL **to_visit_base = to_visit; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | loop: | 
					
						
							|  |  |  |   while (pt0 < pt0_end) { | 
					
						
							|  |  |  |     register CELL d0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ++pt0; | 
					
						
							|  |  |  |     d0 = Derefa(pt0); | 
					
						
							|  |  |  |     if (IsVarTerm(d0)) { | 
					
						
							|  |  |  |       *ptn++ = d0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else if (IsPairTerm(d0)) { | 
					
						
							|  |  |  |       /* store the terms to visit */ | 
					
						
							|  |  |  |       *ptn++ = AbsPair(H); | 
					
						
							|  |  |  | #ifdef RATIONAL_TREES
 | 
					
						
							|  |  |  |       to_visit[0] = pt0; | 
					
						
							|  |  |  |       to_visit[1] = pt0_end; | 
					
						
							|  |  |  |       to_visit[2] = ptn; | 
					
						
							|  |  |  |       to_visit[3] = (CELL *)*pt0; | 
					
						
							|  |  |  |       to_visit += 4; | 
					
						
							|  |  |  |       *pt0 = TermNil; | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |       if (pt0 < pt0_end) { | 
					
						
							|  |  |  | 	to_visit[0] = pt0; | 
					
						
							|  |  |  | 	to_visit[1] = pt0_end; | 
					
						
							|  |  |  | 	to_visit[2] = ptn; | 
					
						
							|  |  |  | 	to_visit += 3; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |       pt0 = RepPair(d0) - 1; | 
					
						
							|  |  |  |       pt0_end = RepPair(d0) + 1; | 
					
						
							|  |  |  |       /* write the head and tail of the list */ | 
					
						
							|  |  |  |       ptn = H; | 
					
						
							|  |  |  |       H += 2; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else if (IsApplTerm(d0)) { | 
					
						
							|  |  |  |       register Functor f; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       f = FunctorOfTerm(d0); | 
					
						
							|  |  |  |       /* store the terms to visit */ | 
					
						
							|  |  |  |       if (IsExtensionFunctor(f)) { | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 	  *ptn++ = d0; | 
					
						
							|  |  |  | 	  continue; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       *ptn++ = AbsAppl(H); | 
					
						
							|  |  |  |       /* store the terms to visit */ | 
					
						
							|  |  |  | #ifdef RATIONAL_TREES
 | 
					
						
							|  |  |  |       to_visit[0] = pt0; | 
					
						
							|  |  |  |       to_visit[1] = pt0_end; | 
					
						
							|  |  |  |       to_visit[2] = ptn; | 
					
						
							|  |  |  |       to_visit[3] = (CELL *)*pt0; | 
					
						
							|  |  |  |       to_visit += 4; | 
					
						
							|  |  |  |       *pt0 = TermNil; | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |       if (pt0 < pt0_end) { | 
					
						
							|  |  |  | 	to_visit[0] = pt0; | 
					
						
							|  |  |  | 	to_visit[1] = pt0_end; | 
					
						
							|  |  |  | 	to_visit[2] = ptn; | 
					
						
							|  |  |  | 	to_visit += 3; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |       pt0 = RepAppl(d0); | 
					
						
							|  |  |  |       d0 = ArityOfFunctor(f); | 
					
						
							|  |  |  |       pt0_end = pt0 + d0; | 
					
						
							|  |  |  |       /* start writing the compound term */ | 
					
						
							|  |  |  |       ptn = H; | 
					
						
							|  |  |  |       *ptn++ = (CELL) f; | 
					
						
							|  |  |  |       H += d0 + 1; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else {			/* AtomOrInt */ | 
					
						
							|  |  |  |       *ptn++ = d0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     /* just continue the loop */ | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* Do we still have compound terms to visit */ | 
					
						
							|  |  |  |   if (to_visit > (CELL **) to_visit_base) { | 
					
						
							|  |  |  | #ifdef RATIONAL_TREES
 | 
					
						
							|  |  |  |     to_visit -= 4; | 
					
						
							|  |  |  |     pt0 = to_visit[0]; | 
					
						
							|  |  |  |     pt0_end = to_visit[1]; | 
					
						
							|  |  |  |     ptn = to_visit[2]; | 
					
						
							|  |  |  |     *pt0 = (CELL)to_visit[3]; | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |     to_visit -= 3; | 
					
						
							|  |  |  |     pt0 = to_visit[0]; | 
					
						
							|  |  |  |     pt0_end = to_visit[1]; | 
					
						
							|  |  |  |     ptn = to_visit[2]; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |     goto loop; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Bind_Global(PtrOfTerm(Var), TermNil); | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   Yap_ReleasePreAllocCodeSpace((ADDR)to_visit); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * Given a term t0, build a new term tf of the form ta+tb, where ta is | 
					
						
							|  |  |  |  * obtained by replacing the array references in t0 by empty | 
					
						
							|  |  |  |  * variables, and tb is a list of array references and corresponding | 
					
						
							|  |  |  |  * variables. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | static Term  | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | replace_array_references(Term t0 USES_REGS) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   Term t; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   t = Deref(t0); | 
					
						
							| 
									
										
										
										
											2002-02-22 06:12:18 +00:00
										 |  |  |   if (IsVarTerm(t)) { | 
					
						
							|  |  |  |     /* we found a variable */ | 
					
						
							|  |  |  |     return (MkPairTerm(t, TermNil)); | 
					
						
							|  |  |  |   } else if (IsAtomOrIntTerm(t)) { | 
					
						
							|  |  |  |     return (MkPairTerm(t, TermNil)); | 
					
						
							|  |  |  |   } else if (IsPairTerm(t)) { | 
					
						
							|  |  |  |     Term VList = MkVarTerm(); | 
					
						
							|  |  |  |     CELL *h0 = H; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     H += 2; | 
					
						
							|  |  |  |     replace_array_references_complex(RepPair(t) - 1, RepPair(t) + 1, h0, | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | 				     VList PASS_REGS); | 
					
						
							|  |  |  |     return MkPairTerm(AbsPair(h0), VList); | 
					
						
							| 
									
										
										
										
											2002-02-22 06:12:18 +00:00
										 |  |  |   } else { | 
					
						
							|  |  |  |     Term VList = MkVarTerm(); | 
					
						
							|  |  |  |     CELL *h0 = H; | 
					
						
							|  |  |  |     Functor f = FunctorOfTerm(t); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     *H++ = (CELL) (f); | 
					
						
							|  |  |  |     H += ArityOfFunctor(f); | 
					
						
							|  |  |  |     replace_array_references_complex(RepAppl(t), | 
					
						
							|  |  |  | 				     RepAppl(t) + ArityOfFunctor(FunctorOfTerm(t)), h0 + 1, | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | 				     VList PASS_REGS); | 
					
						
							| 
									
										
										
										
											2002-02-22 06:12:18 +00:00
										 |  |  |     return (MkPairTerm(AbsAppl(h0), VList)); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static Int  | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | p_array_references( USES_REGS1 ) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   Term t = replace_array_references(ARG1 PASS_REGS); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   Term t1 = HeadOfTerm(t); | 
					
						
							|  |  |  |   Term t2 = TailOfTerm(t); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   return (Yap_unify(t1, ARG2) && Yap_unify(t2, ARG3)); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static Int  | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | p_assign_static( USES_REGS1 ) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   Term t1, t2, t3; | 
					
						
							|  |  |  |   StaticArrayEntry *ptr; | 
					
						
							|  |  |  |   Int indx; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   t2 = Deref(ARG2); | 
					
						
							|  |  |  |   if (IsNonVarTerm(t2)) { | 
					
						
							| 
									
										
										
										
											2008-12-04 23:33:32 +00:00
										 |  |  |     Term nti; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (IsIntegerTerm(nti=Yap_Eval(t2))) | 
					
						
							|  |  |  |       indx = IntegerOfTerm(nti); | 
					
						
							|  |  |  |     else { | 
					
						
							|  |  |  |       Yap_Error(TYPE_ERROR_INTEGER,t2,"update_array"); | 
					
						
							|  |  |  |       return (FALSE); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     Yap_Error(INSTANTIATION_ERROR,t2,"update_array"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     return (FALSE); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   t3 = Deref(ARG3); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   t1 = Deref(ARG1); | 
					
						
							|  |  |  |   if (IsVarTerm(t1)) { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     Yap_Error(INSTANTIATION_ERROR,t1,"update_array"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     return(FALSE); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (!IsAtomTerm(t1)) { | 
					
						
							|  |  |  |     if (IsApplTerm(t1)) { | 
					
						
							|  |  |  |       CELL *ptr; | 
					
						
							|  |  |  |       Functor f = FunctorOfTerm(t1); | 
					
						
							|  |  |  |       /* store the terms to visit */ | 
					
						
							|  |  |  |       if (IsExtensionFunctor(f)) { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  | 	Yap_Error(TYPE_ERROR_ARRAY,t1,"update_array"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 	return(FALSE); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2002-02-04 16:12:54 +00:00
										 |  |  |       if (indx > 0 && indx > ArityOfFunctor(f)) { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  | 	Yap_Error(DOMAIN_ERROR_ARRAY_OVERFLOW,t2,"update_array"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 	return(FALSE); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       ptr = RepAppl(t1)+indx+1; | 
					
						
							|  |  |  | #ifdef MULTI_ASSIGNMENT_VARIABLES
 | 
					
						
							|  |  |  |       MaBind(ptr, t3); | 
					
						
							|  |  |  |       return(TRUE); | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |       Yap_Error(SYSTEM_ERROR,t2,"update_array"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       return(FALSE); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |       Yap_Error(TYPE_ERROR_ATOM,t1,"update_array"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       return(FALSE); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     AtomEntry *ae = RepAtom(AtomOfTerm(t1)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     READ_LOCK(ae->ARWLock); | 
					
						
							| 
									
										
										
										
											2001-10-30 16:42:05 +00:00
										 |  |  |     ptr =  RepStaticArrayProp(ae->PropsOfAE);     | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     while (!EndOfPAEntr(ptr) && ptr->KindOfPE != ArrayProperty) | 
					
						
							|  |  |  |       ptr = RepStaticArrayProp(ptr->NextOfPE); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |     if (EndOfPAEntr(ptr)) { | 
					
						
							|  |  |  |       READ_UNLOCK(ae->ARWLock); | 
					
						
							|  |  |  |       Yap_Error(EXISTENCE_ERROR_ARRAY,t1,"assign_static %s", RepAtom(AtomOfTerm(t1))->StrOfAE); | 
					
						
							|  |  |  |       return FALSE; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (ArrayIsDynamic((ArrayEntry *)ptr)) { | 
					
						
							|  |  |  |       ArrayEntry *pp = (ArrayEntry *)ptr; | 
					
						
							|  |  |  |       CELL *pt; | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |       WRITE_LOCK(pp->ArRWLock); | 
					
						
							|  |  |  |       READ_UNLOCK(ae->ARWLock); | 
					
						
							|  |  |  |       if (indx < 0 || indx >= pp->ArrayEArity) { | 
					
						
							|  |  |  | 	Yap_Error(DOMAIN_ERROR_ARRAY_OVERFLOW,t2,"assign_static"); | 
					
						
							|  |  |  | 	WRITE_UNLOCK(pp->ArRWLock); | 
					
						
							|  |  |  | 	return FALSE; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       pt = RepAppl(pp->ValueOfVE) + indx + 1; | 
					
						
							|  |  |  |       WRITE_UNLOCK(pp->ArRWLock); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #ifdef MULTI_ASSIGNMENT_VARIABLES
 | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |       /* the evil deed is to be done now */ | 
					
						
							|  |  |  |       MaBind(pt, t3); | 
					
						
							|  |  |  |       return TRUE; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |       Yap_Error(SYSTEM_ERROR,t2,"update_array"); | 
					
						
							|  |  |  |       return FALSE; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |     WRITE_LOCK(ptr->ArRWLock); | 
					
						
							|  |  |  |     READ_UNLOCK(ae->ARWLock); | 
					
						
							|  |  |  |     /* a static array */ | 
					
						
							|  |  |  |     if (indx < 0 || indx >= - ptr->ArrayEArity) { | 
					
						
							|  |  |  |       WRITE_UNLOCK(ptr->ArRWLock); | 
					
						
							|  |  |  |       Yap_Error(DOMAIN_ERROR_ARRAY_OVERFLOW,t2,"assign_static"); | 
					
						
							|  |  |  |       return FALSE; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     switch (ptr->ArrayType) { | 
					
						
							|  |  |  |     case array_of_ints: | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  | 	Int i; | 
					
						
							| 
									
										
										
										
											2008-12-04 23:33:32 +00:00
										 |  |  | 	Term nti; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |        | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  | 	if (IsVarTerm(t3)) { | 
					
						
							|  |  |  | 	  WRITE_UNLOCK(ptr->ArRWLock); | 
					
						
							|  |  |  | 	  Yap_Error(INSTANTIATION_ERROR,t3,"assign_static"); | 
					
						
							|  |  |  | 	  return FALSE; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-12-04 23:33:32 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (IsIntegerTerm(nti=Yap_Eval(t3))) | 
					
						
							|  |  |  | 	  i = IntegerOfTerm(nti); | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  | 	else { | 
					
						
							|  |  |  | 	  WRITE_UNLOCK(ptr->ArRWLock); | 
					
						
							|  |  |  | 	  Yap_Error(TYPE_ERROR_INTEGER,t3,"assign_static"); | 
					
						
							|  |  |  | 	  return (FALSE); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	ptr->ValueOfVE.ints[indx]= i; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |       break; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |     case array_of_chars: | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  | 	Int i; | 
					
						
							| 
									
										
										
										
											2008-12-04 23:33:32 +00:00
										 |  |  | 	Term nti; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |        | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  | 	if (IsVarTerm(t3)) { | 
					
						
							|  |  |  | 	  WRITE_UNLOCK(ptr->ArRWLock); | 
					
						
							|  |  |  | 	  Yap_Error(INSTANTIATION_ERROR,t3,"assign_static"); | 
					
						
							|  |  |  | 	  return FALSE; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-12-04 23:33:32 +00:00
										 |  |  | 	if (IsIntegerTerm(nti=Yap_Eval(t3))) | 
					
						
							|  |  |  | 	  i = IntegerOfTerm(nti); | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  | 	else { | 
					
						
							|  |  |  | 	  Yap_Error(TYPE_ERROR_INTEGER,t3,"assign_static"); | 
					
						
							|  |  |  | 	  return (FALSE); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if (i > 127 || i < -128) { | 
					
						
							|  |  |  | 	  WRITE_UNLOCK(ptr->ArRWLock); | 
					
						
							|  |  |  | 	  Yap_Error(TYPE_ERROR_CHAR,t3,"assign_static"); | 
					
						
							|  |  |  | 	  return FALSE; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	ptr->ValueOfVE.chars[indx]= i; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |       break; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |     case array_of_uchars: | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  | 	Int i; | 
					
						
							| 
									
										
										
										
											2008-12-04 23:33:32 +00:00
										 |  |  | 	Term nti; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |        | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  | 	if (IsVarTerm(t3)) { | 
					
						
							|  |  |  | 	  WRITE_UNLOCK(ptr->ArRWLock); | 
					
						
							|  |  |  | 	  Yap_Error(INSTANTIATION_ERROR,t3,"assign_static"); | 
					
						
							|  |  |  | 	  return FALSE; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-12-04 23:33:32 +00:00
										 |  |  | 	if (IsIntegerTerm(nti=Yap_Eval(t3))) | 
					
						
							|  |  |  | 	  i = IntegerOfTerm(nti); | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  | 	else { | 
					
						
							|  |  |  | 	  WRITE_UNLOCK(ptr->ArRWLock); | 
					
						
							|  |  |  | 	  Yap_Error(TYPE_ERROR_INTEGER,t3,"assign_static"); | 
					
						
							|  |  |  | 	  return FALSE; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if (i > 255 || i < 0) { | 
					
						
							|  |  |  | 	  WRITE_UNLOCK(ptr->ArRWLock); | 
					
						
							|  |  |  | 	  Yap_Error(TYPE_ERROR_UCHAR,t3,"assign_static"); | 
					
						
							|  |  |  | 	  return FALSE; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	ptr->ValueOfVE.chars[indx]= i; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |       break; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |     case array_of_doubles: | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  | 	Float f; | 
					
						
							| 
									
										
										
										
											2008-12-04 23:33:32 +00:00
										 |  |  | 	Term nti; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  | 	if (IsVarTerm(t3)) { | 
					
						
							|  |  |  | 	  WRITE_UNLOCK(ptr->ArRWLock); | 
					
						
							|  |  |  | 	  Yap_Error(INSTANTIATION_ERROR,t3,"assign_static"); | 
					
						
							|  |  |  | 	  return FALSE; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-12-04 23:33:32 +00:00
										 |  |  | 	if (IsFloatTerm(nti=Yap_Eval(t3))) | 
					
						
							|  |  |  | 	  f = FloatOfTerm(nti); | 
					
						
							|  |  |  | 	else if (IsIntegerTerm(nti)) | 
					
						
							|  |  |  | 	  f = IntegerOfTerm(nti); | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  | 	else { | 
					
						
							|  |  |  | 	  WRITE_UNLOCK(ptr->ArRWLock); | 
					
						
							|  |  |  | 	  Yap_Error(TYPE_ERROR_FLOAT,t3,"assign_static"); | 
					
						
							|  |  |  | 	  return FALSE; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	ptr->ValueOfVE.floats[indx]= f; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |       break; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |     case array_of_ptrs: | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  | 	Int r; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  | 	if (IsVarTerm(t3)) { | 
					
						
							|  |  |  | 	  WRITE_UNLOCK(ptr->ArRWLock); | 
					
						
							|  |  |  | 	  Yap_Error(INSTANTIATION_ERROR,t3,"assign_static"); | 
					
						
							|  |  |  | 	  return FALSE; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if (IsIntegerTerm(t3)) | 
					
						
							|  |  |  | 	  r = IntegerOfTerm(t3); | 
					
						
							|  |  |  | 	else { | 
					
						
							|  |  |  | 	  WRITE_UNLOCK(ptr->ArRWLock); | 
					
						
							|  |  |  | 	  Yap_Error(TYPE_ERROR_PTR,t3,"assign_static"); | 
					
						
							|  |  |  | 	  return FALSE; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	ptr->ValueOfVE.ptrs[indx]= (AtomEntry *)r; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |       break; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |     case array_of_atoms: | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  | 	if (IsVarTerm(t3)) { | 
					
						
							|  |  |  | 	  WRITE_UNLOCK(ptr->ArRWLock); | 
					
						
							|  |  |  | 	  Yap_Error(INSTANTIATION_ERROR,t3,"assign_static"); | 
					
						
							|  |  |  | 	  return FALSE; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if (!IsAtomTerm(t3)) { | 
					
						
							|  |  |  | 	  WRITE_UNLOCK(ptr->ArRWLock); | 
					
						
							|  |  |  | 	  Yap_Error(TYPE_ERROR_ATOM,t3,"assign_static"); | 
					
						
							|  |  |  | 	  return FALSE; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	ptr->ValueOfVE.atoms[indx]= t3; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |       break; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |     case array_of_dbrefs: | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |        | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  | 	Term t0 = ptr->ValueOfVE.dbrefs[indx]; | 
					
						
							|  |  |  | 	DBRef p = DBRefOfTerm(t3); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |        | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  | 	if (IsVarTerm(t3)) { | 
					
						
							|  |  |  | 	  WRITE_UNLOCK(ptr->ArRWLock); | 
					
						
							|  |  |  | 	  Yap_Error(INSTANTIATION_ERROR,t3,"assign_static"); | 
					
						
							|  |  |  | 	  return FALSE; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if (!IsDBRefTerm(t3)) { | 
					
						
							|  |  |  | 	  WRITE_UNLOCK(ptr->ArRWLock); | 
					
						
							|  |  |  | 	  Yap_Error(TYPE_ERROR_DBREF,t3,"assign_static"); | 
					
						
							|  |  |  | 	  return FALSE; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	ptr->ValueOfVE.dbrefs[indx]= t3; | 
					
						
							|  |  |  | 	if (t0 != 0L) { | 
					
						
							|  |  |  | 	  DBRef ptr = DBRefOfTerm(t0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	  if (ptr->Flags & LogUpdMask) { | 
					
						
							|  |  |  | 	    LogUpdClause *lup = (LogUpdClause *)ptr; | 
					
						
							| 
									
										
										
										
											2008-08-07 20:51:23 +00:00
										 |  |  | 	    //	    LOCK(lup->ClLock);
 | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  | 	    lup->ClRefCount--; | 
					
						
							|  |  |  | 	    if (lup->ClRefCount == 0 && | 
					
						
							|  |  |  | 		(lup->ClFlags & ErasedMask) && | 
					
						
							|  |  |  | 		!(lup->ClFlags & InUseMask)) { | 
					
						
							| 
									
										
										
										
											2008-08-07 20:51:23 +00:00
										 |  |  | 	      //	      UNLOCK(lup->ClLock);
 | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  | 	      Yap_ErLogUpdCl(lup); | 
					
						
							|  |  |  | 	    } else { | 
					
						
							| 
									
										
										
										
											2008-08-07 20:51:23 +00:00
										 |  |  | 	      //	      UNLOCK(lup->ClLock);
 | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  | 	    } | 
					
						
							| 
									
										
										
										
											2004-06-29 19:04:46 +00:00
										 |  |  | 	  } else { | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  | 	    ptr->NOfRefsTo--; | 
					
						
							|  |  |  | 	    if (ptr->NOfRefsTo == 0 && | 
					
						
							|  |  |  | 		(ptr->Flags & ErasedMask) && | 
					
						
							|  |  |  | 		!(ptr->Flags & InUseMask)) { | 
					
						
							|  |  |  | 	      Yap_ErDBE(ptr); | 
					
						
							|  |  |  | 	    } | 
					
						
							| 
									
										
										
										
											2004-06-23 17:24:20 +00:00
										 |  |  | 	  } | 
					
						
							| 
									
										
										
										
											2004-06-18 16:35:18 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  |        | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  | 	if (p->Flags & LogUpdMask) { | 
					
						
							|  |  |  | 	  LogUpdClause *lup = (LogUpdClause *)p; | 
					
						
							| 
									
										
										
										
											2008-08-07 20:51:23 +00:00
										 |  |  | 	  //	  LOCK(lup->ClLock);
 | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  | 	  lup->ClRefCount++; | 
					
						
							| 
									
										
										
										
											2008-08-07 20:51:23 +00:00
										 |  |  | 	  //	  UNLOCK(lup->ClLock);
 | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  | 	} else { | 
					
						
							|  |  |  | 	  p->NOfRefsTo++; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2004-06-18 16:35:18 +00:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |       break; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |     case array_of_nb_terms: | 
					
						
							| 
									
										
										
										
											2005-10-19 19:00:48 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |       { | 
					
						
							|  |  |  | 	Term told = ptr->ValueOfVE.lterms[indx].tstore; | 
					
						
							| 
									
										
										
										
											2005-10-19 23:17:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  | 	CELL *livep = &(ptr->ValueOfVE.lterms[indx].tlive); | 
					
						
							|  |  |  | 	RESET_VARIABLE(livep); | 
					
						
							|  |  |  | 	/* recover space */ | 
					
						
							|  |  |  | 	if (IsApplTerm(told)) { | 
					
						
							|  |  |  | 	  Yap_ReleaseTermFromDB((DBTerm *)RepAppl(told)); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if (IsVarTerm(t3)) { | 
					
						
							|  |  |  | 	  RESET_VARIABLE(&(ptr->ValueOfVE.lterms[indx].tstore)); | 
					
						
							|  |  |  | 	} else if (IsAtomicTerm(t3)) { | 
					
						
							|  |  |  | 	  ptr->ValueOfVE.lterms[indx].tstore = t3; | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 	  DBTerm *new = Yap_StoreTermInDB(t3,3); | 
					
						
							|  |  |  | 	  if (!new) { | 
					
						
							|  |  |  | 	    WRITE_UNLOCK(ptr->ArRWLock); | 
					
						
							|  |  |  | 	    return FALSE; | 
					
						
							|  |  |  | 	  } | 
					
						
							|  |  |  | 	  ptr->ValueOfVE.lterms[indx].tstore = AbsAppl((CELL *)new); | 
					
						
							| 
									
										
										
										
											2005-10-19 19:00:48 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |       break; | 
					
						
							| 
									
										
										
										
											2005-10-19 19:00:48 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |     case array_of_terms: | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |        | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  | 	DBTerm *ref = ptr->ValueOfVE.terms[indx]; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  | 	if (ref != NULL) { | 
					
						
							|  |  |  | 	  Yap_ReleaseTermFromDB(ref); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	ptr->ValueOfVE.terms[indx] = Yap_StoreTermInDB(t3,3); | 
					
						
							|  |  |  | 	if (ptr->ValueOfVE.terms[indx] == NULL){ | 
					
						
							|  |  |  | 	  WRITE_UNLOCK(ptr->ArRWLock); | 
					
						
							|  |  |  | 	  return FALSE; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2002-03-07 05:13:21 +00:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |       break; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |     WRITE_UNLOCK(ptr->ArRWLock); | 
					
						
							|  |  |  |     return TRUE; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-10-28 17:38:50 +00:00
										 |  |  | static Int  | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | p_assign_dynamic( USES_REGS1 ) | 
					
						
							| 
									
										
										
										
											2005-10-28 17:38:50 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   Term t1, t2, t3; | 
					
						
							|  |  |  |   StaticArrayEntry *ptr; | 
					
						
							|  |  |  |   Int indx; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   t2 = Deref(ARG2); | 
					
						
							|  |  |  |   if (IsNonVarTerm(t2)) { | 
					
						
							| 
									
										
										
										
											2008-12-04 23:33:32 +00:00
										 |  |  |     Term nti; | 
					
						
							|  |  |  |     if (IsIntegerTerm(nti=Yap_Eval(t2))) { | 
					
						
							|  |  |  |       indx = IntegerOfTerm(nti); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       Yap_Error(TYPE_ERROR_INTEGER,t2,"update_array"); | 
					
						
							|  |  |  |       return (FALSE); | 
					
						
							| 
									
										
										
										
											2005-10-28 17:38:50 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     Yap_Error(INSTANTIATION_ERROR,t2,"update_array"); | 
					
						
							|  |  |  |     return (FALSE); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   t3 = Deref(ARG3); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   t1 = Deref(ARG1); | 
					
						
							|  |  |  |   if (IsVarTerm(t1)) { | 
					
						
							|  |  |  |     Yap_Error(INSTANTIATION_ERROR,t1,"update_array"); | 
					
						
							|  |  |  |     return(FALSE); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (!IsAtomTerm(t1)) { | 
					
						
							|  |  |  |     if (IsApplTerm(t1)) { | 
					
						
							|  |  |  |       CELL *ptr; | 
					
						
							|  |  |  |       Functor f = FunctorOfTerm(t1); | 
					
						
							|  |  |  |       /* store the terms to visit */ | 
					
						
							|  |  |  |       if (IsExtensionFunctor(f)) { | 
					
						
							|  |  |  | 	Yap_Error(TYPE_ERROR_ARRAY,t1,"update_array"); | 
					
						
							|  |  |  | 	return(FALSE); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       if (indx > 0 && indx > ArityOfFunctor(f)) { | 
					
						
							|  |  |  | 	Yap_Error(DOMAIN_ERROR_ARRAY_OVERFLOW,t2,"update_array"); | 
					
						
							|  |  |  | 	return(FALSE); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       ptr = RepAppl(t1)+indx+1; | 
					
						
							|  |  |  | #ifdef MULTI_ASSIGNMENT_VARIABLES
 | 
					
						
							|  |  |  |       MaBind(ptr, t3); | 
					
						
							|  |  |  |       return(TRUE); | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |       Yap_Error(SYSTEM_ERROR,t2,"update_array"); | 
					
						
							|  |  |  |       return(FALSE); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       Yap_Error(TYPE_ERROR_ATOM,t1,"update_array"); | 
					
						
							|  |  |  |       return(FALSE); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     AtomEntry *ae = RepAtom(AtomOfTerm(t1)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     READ_LOCK(ae->ARWLock); | 
					
						
							|  |  |  |     ptr =  RepStaticArrayProp(ae->PropsOfAE);     | 
					
						
							|  |  |  |     while (!EndOfPAEntr(ptr) && ptr->KindOfPE != ArrayProperty) | 
					
						
							|  |  |  |       ptr = RepStaticArrayProp(ptr->NextOfPE); | 
					
						
							|  |  |  |     READ_UNLOCK(ae->ARWLock); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (EndOfPAEntr(ptr)) { | 
					
						
							|  |  |  |     Yap_Error(EXISTENCE_ERROR_ARRAY,t1,"assign_static %s", RepAtom(AtomOfTerm(t1))->StrOfAE); | 
					
						
							|  |  |  |     return(FALSE); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (ArrayIsDynamic((ArrayEntry *)ptr)) { | 
					
						
							|  |  |  |     ArrayEntry *pp = (ArrayEntry *)ptr; | 
					
						
							|  |  |  |     CELL *pt; | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |     WRITE_LOCK(pp->ArRWLock); | 
					
						
							| 
									
										
										
										
											2005-10-28 17:38:50 +00:00
										 |  |  |     if (indx < 0 || indx >= pp->ArrayEArity) { | 
					
						
							|  |  |  |       Yap_Error(DOMAIN_ERROR_ARRAY_OVERFLOW,t2,"assign_static"); | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |       WRITE_UNLOCK(pp->ArRWLock); | 
					
						
							| 
									
										
										
										
											2005-10-28 17:38:50 +00:00
										 |  |  |       return(FALSE); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     pt = RepAppl(pp->ValueOfVE) + indx + 1; | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |     WRITE_UNLOCK(pp->ArRWLock); | 
					
						
							| 
									
										
										
										
											2005-10-28 17:38:50 +00:00
										 |  |  | #ifdef MULTI_ASSIGNMENT_VARIABLES
 | 
					
						
							|  |  |  |     /* the evil deed is to be done now */ | 
					
						
							|  |  |  |     MaBind(pt, t3); | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |     return TRUE; | 
					
						
							| 
									
										
										
										
											2005-10-28 17:38:50 +00:00
										 |  |  | #else
 | 
					
						
							|  |  |  |     Yap_Error(SYSTEM_ERROR,t2,"update_array"); | 
					
						
							|  |  |  |     return FALSE; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |   WRITE_LOCK(ptr->ArRWLock); | 
					
						
							| 
									
										
										
										
											2005-10-28 17:38:50 +00:00
										 |  |  |   /* a static array */ | 
					
						
							|  |  |  |   if (indx < 0 || indx >= - ptr->ArrayEArity) { | 
					
						
							|  |  |  |     WRITE_UNLOCK(ptr->ArRWLock); | 
					
						
							|  |  |  |     Yap_Error(DOMAIN_ERROR_ARRAY_OVERFLOW,t2,"assign_static"); | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2005-10-28 17:38:50 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   switch (ptr->ArrayType) { | 
					
						
							|  |  |  |   case array_of_ints: | 
					
						
							|  |  |  |   case array_of_chars: | 
					
						
							|  |  |  |   case array_of_uchars: | 
					
						
							|  |  |  |   case array_of_doubles: | 
					
						
							|  |  |  |   case array_of_ptrs: | 
					
						
							|  |  |  |   case array_of_atoms: | 
					
						
							|  |  |  |   case array_of_dbrefs: | 
					
						
							|  |  |  |   case array_of_terms: | 
					
						
							|  |  |  |     WRITE_UNLOCK(ptr->ArRWLock); | 
					
						
							|  |  |  |     Yap_Error(DOMAIN_ERROR_ARRAY_TYPE, t3, "assign_static"); | 
					
						
							|  |  |  |     return FALSE; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   case array_of_nb_terms: | 
					
						
							|  |  |  | #ifdef MULTI_ASSIGNMENT_VARIABLES
 | 
					
						
							|  |  |  |     {  | 
					
						
							|  |  |  |       Term t = ptr->ValueOfVE.lterms[indx].tlive; | 
					
						
							|  |  |  |       Functor f; | 
					
						
							|  |  |  |       /* we have a mutable term there */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if (IsVarTerm(t) || | 
					
						
							|  |  |  | 	  !IsApplTerm(t) || | 
					
						
							|  |  |  | 	  (f = FunctorOfTerm(t)) != FunctorAtFoundOne) { | 
					
						
							|  |  |  | 	Term tn = Yap_NewTimedVar(t3); | 
					
						
							|  |  |  | 	CELL *sp = RepAppl(tn); | 
					
						
							|  |  |  | 	*sp = (CELL)FunctorAtFoundOne; | 
					
						
							|  |  |  | 	Bind(&(ptr->ValueOfVE.lterms[indx].tlive),tn); | 
					
						
							|  |  |  |       } else { | 
					
						
							|  |  |  | 	Yap_UpdateTimedVar(t, t3); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |     WRITE_UNLOCK(ptr->ArRWLock); | 
					
						
							| 
									
										
										
										
											2005-10-28 17:38:50 +00:00
										 |  |  |     return TRUE; | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |     WRITE_UNLOCK(ptr->ArRWLock); | 
					
						
							| 
									
										
										
										
											2005-10-28 17:38:50 +00:00
										 |  |  |     Yap_Error(SYSTEM_ERROR,t2,"update_array"); | 
					
						
							|  |  |  |     return FALSE; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   WRITE_UNLOCK(ptr->ArRWLock); | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |   return TRUE; | 
					
						
							| 
									
										
										
										
											2005-10-28 17:38:50 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  | static Int  | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | p_add_to_array_element( USES_REGS1 ) | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   Term t1, t2, t3; | 
					
						
							|  |  |  |   StaticArrayEntry *ptr; | 
					
						
							|  |  |  |   Int indx; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   t2 = Deref(ARG2); | 
					
						
							|  |  |  |   if (IsNonVarTerm(t2)) { | 
					
						
							| 
									
										
										
										
											2008-12-04 23:33:32 +00:00
										 |  |  |     Term nti; | 
					
						
							|  |  |  |     if (IsIntegerTerm(nti=Yap_Eval(t2))) { | 
					
						
							|  |  |  |       indx = IntegerOfTerm(nti); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       Yap_Error(TYPE_ERROR_INTEGER,t2,"add_to_array_element"); | 
					
						
							|  |  |  |       return (FALSE); | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     Yap_Error(INSTANTIATION_ERROR,t2,"add_to_array_element"); | 
					
						
							|  |  |  |     return (FALSE); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   t1 = Deref(ARG1); | 
					
						
							|  |  |  |   if (IsVarTerm(t1)) { | 
					
						
							|  |  |  |     Yap_Error(INSTANTIATION_ERROR,t1,"add_to_array_element"); | 
					
						
							|  |  |  |     return(FALSE); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   t3 = Deref(ARG3); | 
					
						
							|  |  |  |   if (IsVarTerm(t3)) { | 
					
						
							|  |  |  |     Yap_Error(INSTANTIATION_ERROR,t3,"add_to_array_element"); | 
					
						
							|  |  |  |     return(FALSE); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (!IsAtomTerm(t1)) { | 
					
						
							|  |  |  |     if (IsApplTerm(t1)) { | 
					
						
							|  |  |  |       CELL *ptr; | 
					
						
							|  |  |  |       Functor f = FunctorOfTerm(t1); | 
					
						
							|  |  |  |       Term ta; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       /* store the terms to visit */ | 
					
						
							|  |  |  |       if (IsExtensionFunctor(f)) { | 
					
						
							|  |  |  | 	Yap_Error(TYPE_ERROR_ARRAY,t1,"add_to_array_element"); | 
					
						
							|  |  |  | 	return(FALSE); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       if (indx > 0 && indx > ArityOfFunctor(f)) { | 
					
						
							|  |  |  | 	Yap_Error(DOMAIN_ERROR_ARRAY_OVERFLOW,t2,"add_to_array_element"); | 
					
						
							|  |  |  | 	return(FALSE); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       ptr = RepAppl(t1)+indx+1; | 
					
						
							|  |  |  |       ta = RepAppl(t1)[indx+1]; | 
					
						
							|  |  |  |       if (IsIntegerTerm(ta)) { | 
					
						
							|  |  |  | 	if (IsIntegerTerm(t3)) { | 
					
						
							|  |  |  | 	  ta = MkIntegerTerm(IntegerOfTerm(ta)+IntegerOfTerm(t3)); | 
					
						
							|  |  |  | 	} else if (IsFloatTerm(t3)) { | 
					
						
							|  |  |  | 	  ta = MkFloatTerm(IntegerOfTerm(ta)+FloatOfTerm(t3)); | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 	  Yap_Error(TYPE_ERROR_NUMBER,t3,"add_to_array_element"); | 
					
						
							|  |  |  | 	  return(FALSE); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  |       } else if (IsFloatTerm(ta)) { | 
					
						
							|  |  |  | 	if (IsFloatTerm(t3)) { | 
					
						
							|  |  |  | 	  ta = MkFloatTerm(FloatOfTerm(ta)+IntegerOfTerm(t3)); | 
					
						
							|  |  |  | 	} else if (IsFloatTerm(t3)) { | 
					
						
							|  |  |  | 	  ta = MkFloatTerm(FloatOfTerm(ta)+FloatOfTerm(t3)); | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 	  Yap_Error(TYPE_ERROR_NUMBER,t3,"add_to_array_element"); | 
					
						
							|  |  |  | 	  return(FALSE); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  |       } else { | 
					
						
							|  |  |  | 	Yap_Error(TYPE_ERROR_NUMBER,ta,"add_to_array_element"); | 
					
						
							|  |  |  | 	return(FALSE); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | #ifdef MULTI_ASSIGNMENT_VARIABLES
 | 
					
						
							| 
									
										
										
										
											2007-07-01 00:14:35 +00:00
										 |  |  |       MaBind(ptr, ta); | 
					
						
							|  |  |  |       return(Yap_unify(ARG4,ta)); | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  | #else
 | 
					
						
							|  |  |  |       Yap_Error(SYSTEM_ERROR,t2,"add_to_array_element"); | 
					
						
							|  |  |  |       return(FALSE); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       Yap_Error(TYPE_ERROR_ATOM,t1,"add_to_array_element"); | 
					
						
							|  |  |  |       return(FALSE); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     AtomEntry *ae = RepAtom(AtomOfTerm(t1)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     READ_LOCK(ae->ARWLock); | 
					
						
							|  |  |  |     ptr =  RepStaticArrayProp(ae->PropsOfAE);     | 
					
						
							|  |  |  |     while (!EndOfPAEntr(ptr) && ptr->KindOfPE != ArrayProperty) | 
					
						
							|  |  |  |       ptr = RepStaticArrayProp(ptr->NextOfPE); | 
					
						
							|  |  |  |     READ_UNLOCK(ae->ARWLock); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (EndOfPAEntr(ptr)) { | 
					
						
							|  |  |  |     Yap_Error(EXISTENCE_ERROR_ARRAY,t1,"add_to_array_element %s", RepAtom(AtomOfTerm(t1))->StrOfAE); | 
					
						
							|  |  |  |     return(FALSE); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (ArrayIsDynamic((ArrayEntry *)ptr)) { | 
					
						
							|  |  |  |     ArrayEntry *pp = (ArrayEntry *)ptr; | 
					
						
							|  |  |  |     CELL *pt; | 
					
						
							|  |  |  |     Term ta; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |     WRITE_LOCK(pp->ArRWLock); | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  |     if (indx < 0 || indx >= pp->ArrayEArity) { | 
					
						
							|  |  |  |       Yap_Error(DOMAIN_ERROR_ARRAY_OVERFLOW,t2,"add_to_array_element"); | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |       READ_UNLOCK(pp->ArRWLock); | 
					
						
							|  |  |  |       return FALSE; | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |     pt = RepAppl(pp->ValueOfVE) + indx + 1; | 
					
						
							|  |  |  |     ta = RepAppl(pp->ValueOfVE)[indx+1]; | 
					
						
							|  |  |  |     if (IsIntegerTerm(ta)) { | 
					
						
							|  |  |  |       if (IsIntegerTerm(t3)) { | 
					
						
							|  |  |  | 	ta = MkIntegerTerm(IntegerOfTerm(ta)+IntegerOfTerm(t3)); | 
					
						
							|  |  |  |       } else if (IsFloatTerm(t3)) { | 
					
						
							|  |  |  | 	ta = MkFloatTerm(IntegerOfTerm(ta)+FloatOfTerm(t3)); | 
					
						
							|  |  |  |       } else { | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  | 	WRITE_UNLOCK(pp->ArRWLock); | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  | 	Yap_Error(TYPE_ERROR_NUMBER,t3,"add_to_array_element"); | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  | 	return FALSE; | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  |       } | 
					
						
							|  |  |  |     } else if (IsFloatTerm(ta)) { | 
					
						
							|  |  |  |       if (IsFloatTerm(t3)) { | 
					
						
							|  |  |  | 	ta = MkFloatTerm(FloatOfTerm(ta)+IntegerOfTerm(t3)); | 
					
						
							|  |  |  |       } else if (IsFloatTerm(t3)) { | 
					
						
							|  |  |  | 	ta = MkFloatTerm(FloatOfTerm(ta)+FloatOfTerm(t3)); | 
					
						
							|  |  |  |       } else { | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  | 	WRITE_UNLOCK(pp->ArRWLock); | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  | 	Yap_Error(TYPE_ERROR_NUMBER,t3,"add_to_array_element"); | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  | 	return FALSE; | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  |       } | 
					
						
							|  |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |       WRITE_UNLOCK(pp->ArRWLock); | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  |       Yap_Error(TYPE_ERROR_NUMBER,ta,"add_to_array_element"); | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |       return FALSE; | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | #ifdef MULTI_ASSIGNMENT_VARIABLES
 | 
					
						
							|  |  |  |     /* the evil deed is to be done now */ | 
					
						
							|  |  |  |     t3 = MkIntegerTerm(IntegerOfTerm(t3)+1); | 
					
						
							|  |  |  |     MaBind(pt, t3); | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |     WRITE_UNLOCK(pp->ArRWLock); | 
					
						
							|  |  |  |     return Yap_unify(ARG4,t3); | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  | #else
 | 
					
						
							|  |  |  |     Yap_Error(SYSTEM_ERROR,t2,"add_to_array_element"); | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |     WRITE_UNLOCK(pp->ArRWLock); | 
					
						
							|  |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |   WRITE_LOCK(ptr->ArRWLock); | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  |   /* a static array */ | 
					
						
							|  |  |  |   if (indx < 0 || indx >= - ptr->ArrayEArity) { | 
					
						
							|  |  |  |     WRITE_UNLOCK(ptr->ArRWLock); | 
					
						
							|  |  |  |     Yap_Error(DOMAIN_ERROR_ARRAY_OVERFLOW,t2,"add_to_array_element"); | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   switch (ptr->ArrayType) { | 
					
						
							|  |  |  |   case array_of_ints: | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       Int i = ptr->ValueOfVE.ints[indx]; | 
					
						
							|  |  |  |       if (!IsIntegerTerm(t3)) { | 
					
						
							|  |  |  | 	WRITE_UNLOCK(ptr->ArRWLock); | 
					
						
							|  |  |  | 	Yap_Error(TYPE_ERROR_INTEGER,t3,"add_to_array_element"); | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  | 	return FALSE; | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  |       } | 
					
						
							|  |  |  |       i += IntegerOfTerm(t3); | 
					
						
							|  |  |  |       ptr->ValueOfVE.ints[indx] = i; | 
					
						
							|  |  |  |       WRITE_UNLOCK(ptr->ArRWLock); | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |       return Yap_unify(ARG4,MkIntegerTerm(i)); | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |     break; | 
					
						
							|  |  |  |   case array_of_doubles: | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       Float fl = ptr->ValueOfVE.floats[indx]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if (IsFloatTerm(t3)) { | 
					
						
							|  |  |  | 	fl += FloatOfTerm(t3); | 
					
						
							|  |  |  |       } else if (IsIntegerTerm(t3)) { | 
					
						
							|  |  |  | 	fl += IntegerOfTerm(t3); | 
					
						
							|  |  |  |       } else { | 
					
						
							|  |  |  | 	WRITE_UNLOCK(ptr->ArRWLock); | 
					
						
							|  |  |  | 	Yap_Error(TYPE_ERROR_NUMBER,t3,"add_to_array_element"); | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  | 	return FALSE; | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  |       } | 
					
						
							|  |  |  |       ptr->ValueOfVE.floats[indx] = fl; | 
					
						
							|  |  |  |       WRITE_UNLOCK(ptr->ArRWLock); | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |       return Yap_unify(ARG4,MkFloatTerm(fl)); | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |     break; | 
					
						
							|  |  |  |   default: | 
					
						
							|  |  |  |     WRITE_UNLOCK(ptr->ArRWLock); | 
					
						
							|  |  |  |     Yap_Error(TYPE_ERROR_INTEGER,t2,"add_to_array_element"); | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | static Int  | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | p_compile_array_refs( USES_REGS1 ) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   compile_arrays = TRUE; | 
					
						
							|  |  |  |   return (TRUE); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static Int  | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | p_array_refs_compiled( USES_REGS1 ) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2007-02-18 00:26:36 +00:00
										 |  |  |   return compile_arrays; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static Int | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | p_sync_mmapped_arrays( USES_REGS1 ) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							|  |  |  | #ifdef HAVE_MMAP
 | 
					
						
							| 
									
										
										
										
											2011-05-25 16:40:36 +01:00
										 |  |  |   mmap_array_block *ptr = GLOBAL_mmap_arrays; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   while (ptr != NULL) { | 
					
						
							|  |  |  |     msync(ptr->start, ptr->size, MS_SYNC); | 
					
						
							|  |  |  |     ptr = ptr->next; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |   return(TRUE); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  | static Int | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | p_static_array_to_term( USES_REGS1 ) | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   Term t = Deref(ARG1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (IsVarTerm(t)) { | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  |   } else if (IsAtomTerm(t)) { | 
					
						
							|  |  |  |     /* Create a named array */ | 
					
						
							|  |  |  |     AtomEntry *ae = RepAtom(AtomOfTerm(t)); | 
					
						
							|  |  |  |     StaticArrayEntry *pp; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     READ_LOCK(ae->ARWLock); | 
					
						
							|  |  |  |     pp = RepStaticArrayProp(ae->PropsOfAE); | 
					
						
							|  |  |  |     while (!EndOfPAEntr(pp) && pp->KindOfPE != ArrayProperty) | 
					
						
							|  |  |  |       pp = RepStaticArrayProp(pp->NextOfPE); | 
					
						
							|  |  |  |     if (EndOfPAEntr(pp) || pp->ValueOfVE.ints == NULL) { | 
					
						
							|  |  |  |       READ_UNLOCK(ae->ARWLock); | 
					
						
							|  |  |  |       return (FALSE); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       static_array_types tp = pp->ArrayType; | 
					
						
							|  |  |  |       Int dim = -pp->ArrayEArity, indx; | 
					
						
							|  |  |  |       CELL *base; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       while (H+1+dim > ASP-1024) { | 
					
						
							| 
									
										
										
										
											2008-08-28 04:43:00 +01:00
										 |  |  | 	if (!Yap_gcl((1+dim)*sizeof(CELL), 2, ENV, gc_P(P,CP))) { | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  | 	  Yap_Error(OUT_OF_STACK_ERROR,TermNil,LOCAL_ErrorMessage); | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  | 	  return(FALSE); | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 	  if (H+1+dim > ASP-1024) { | 
					
						
							|  |  |  | 	    if (!Yap_growstack( sizeof(CELL) * (dim+1-(H-ASP-1024)))) { | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  | 	      Yap_Error(OUT_OF_STACK_ERROR, TermNil, LOCAL_ErrorMessage); | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  | 	      return FALSE; | 
					
						
							|  |  |  | 	    } | 
					
						
							|  |  |  | 	  } | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       READ_LOCK(pp->ArRWLock); | 
					
						
							|  |  |  |       READ_UNLOCK(ae->ARWLock); | 
					
						
							|  |  |  |       base = H; | 
					
						
							|  |  |  |       *H++ = (CELL)Yap_MkFunctor(AbsAtom(ae),dim); | 
					
						
							|  |  |  |       switch(tp) { | 
					
						
							|  |  |  |       case array_of_ints: | 
					
						
							| 
									
										
										
										
											2003-02-19 16:43:24 +00:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 	  CELL *sptr = H; | 
					
						
							|  |  |  | 	  H += dim; | 
					
						
							|  |  |  | 	  for (indx=0; indx < dim; indx++) { | 
					
						
							|  |  |  | 	    *sptr++ = MkIntegerTerm(pp->ValueOfVE.ints[indx]); | 
					
						
							|  |  |  | 	  } | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	break; | 
					
						
							|  |  |  |       case array_of_dbrefs: | 
					
						
							|  |  |  | 	for (indx=0; indx < dim; indx++) { | 
					
						
							|  |  |  | 	  /* The object is now in use */ | 
					
						
							|  |  |  | 	  Term TRef = pp->ValueOfVE.dbrefs[indx]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	  if (TRef != 0L) { | 
					
						
							|  |  |  | 	    DBRef ref = DBRefOfTerm(TRef); | 
					
						
							|  |  |  | 	    LOCK(ref->lock); | 
					
						
							| 
									
										
										
										
											2011-04-14 18:51:11 +01:00
										 |  |  | #if MULTIPLE_STACKS
 | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  | 	    INC_DBREF_COUNT(ref); | 
					
						
							|  |  |  | 	    TRAIL_REF(ref);	/* So that fail will erase it */ | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | 	    if (!(ref->Flags & InUseMask)) { | 
					
						
							|  |  |  | 	      ref->Flags |= InUseMask; | 
					
						
							|  |  |  | 	      TRAIL_REF(ref);	/* So that fail will erase it */ | 
					
						
							|  |  |  | 	    } | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2011-04-14 18:51:11 +01:00
										 |  |  | 	    UNLOCK(ref->lock); | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  | 	  } else { | 
					
						
							|  |  |  | 	    TRef = TermNil; | 
					
						
							|  |  |  | 	  } | 
					
						
							|  |  |  | 	  *H++ = TRef; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	break; | 
					
						
							|  |  |  |       case array_of_doubles: | 
					
						
							| 
									
										
										
										
											2003-02-19 16:43:24 +00:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 	  CELL *sptr = H; | 
					
						
							|  |  |  | 	  H += dim; | 
					
						
							|  |  |  | 	  for (indx=0; indx < dim; indx++) { | 
					
						
							|  |  |  | 	    *sptr++ = MkEvalFl(pp->ValueOfVE.floats[indx]); | 
					
						
							|  |  |  | 	  } | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	break; | 
					
						
							|  |  |  |       case array_of_ptrs: | 
					
						
							| 
									
										
										
										
											2003-02-19 16:43:24 +00:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 	  CELL *sptr = H; | 
					
						
							|  |  |  | 	  H += dim; | 
					
						
							|  |  |  | 	  for (indx=0; indx < dim; indx++) { | 
					
						
							|  |  |  | 	    *sptr++ = MkIntegerTerm((Int)(pp->ValueOfVE.ptrs[indx])); | 
					
						
							|  |  |  | 	  } | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	break; | 
					
						
							|  |  |  |       case array_of_chars: | 
					
						
							| 
									
										
										
										
											2003-02-19 16:43:24 +00:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 	  CELL *sptr = H; | 
					
						
							|  |  |  | 	  H += dim; | 
					
						
							|  |  |  | 	  for (indx=0; indx < dim; indx++) { | 
					
						
							|  |  |  | 	    *sptr++ = MkIntegerTerm((Int)(pp->ValueOfVE.chars[indx])); | 
					
						
							|  |  |  | 	  } | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	break; | 
					
						
							|  |  |  |       case array_of_uchars: | 
					
						
							| 
									
										
										
										
											2003-02-19 16:43:24 +00:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 	  CELL *sptr = H; | 
					
						
							|  |  |  | 	  H += dim; | 
					
						
							|  |  |  | 	  for (indx=0; indx < dim; indx++) { | 
					
						
							|  |  |  | 	    *sptr++ = MkIntegerTerm((Int)(pp->ValueOfVE.uchars[indx])); | 
					
						
							|  |  |  | 	  } | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	break; | 
					
						
							|  |  |  |       case array_of_terms: | 
					
						
							| 
									
										
										
										
											2003-02-19 16:43:24 +00:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 	  CELL *sptr = H; | 
					
						
							|  |  |  | 	  H += dim; | 
					
						
							|  |  |  | 	  for (indx=0; indx < dim; indx++) { | 
					
						
							|  |  |  | 	    /* The object is now in use */ | 
					
						
							| 
									
										
										
										
											2003-08-27 13:37:10 +00:00
										 |  |  | 	    DBTerm *ref = pp->ValueOfVE.terms[indx]; | 
					
						
							| 
									
										
										
										
											2005-10-19 19:00:48 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | 	    Term TRef = GetTermFromArray(ref PASS_REGS); | 
					
						
							| 
									
										
										
										
											2005-10-19 19:00:48 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	    if (P == FAILCODE) { | 
					
						
							|  |  |  | 	      return FALSE; | 
					
						
							| 
									
										
										
										
											2003-02-19 16:43:24 +00:00
										 |  |  | 	    } | 
					
						
							| 
									
										
										
										
											2005-10-19 19:00:48 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-02-19 16:43:24 +00:00
										 |  |  | 	    *sptr++ = TRef; | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  | 	  } | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	break; | 
					
						
							| 
									
										
										
										
											2005-10-19 19:00:48 +00:00
										 |  |  |       case array_of_nb_terms: | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 	  CELL *sptr = H; | 
					
						
							|  |  |  | 	  H += dim; | 
					
						
							|  |  |  | 	  for (indx=0; indx < dim; indx++) { | 
					
						
							|  |  |  | 	    /* The object is now in use */ | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | 	    Term To = GetNBTerm(pp->ValueOfVE.lterms, indx PASS_REGS); | 
					
						
							| 
									
										
										
										
											2005-10-19 19:00:48 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	    if (P == FAILCODE) { | 
					
						
							|  |  |  | 	      return FALSE; | 
					
						
							|  |  |  | 	    } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	    *sptr++ = To; | 
					
						
							|  |  |  | 	  } | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	break; | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  |       case array_of_atoms: | 
					
						
							|  |  |  | 	for (indx=0; indx < dim; indx++) { | 
					
						
							|  |  |  | 	  Term out; | 
					
						
							|  |  |  | 	  out = pp->ValueOfVE.atoms[indx]; | 
					
						
							|  |  |  | 	  if (out == 0L) | 
					
						
							|  |  |  | 	    out = TermNil; | 
					
						
							|  |  |  | 	  *H++ = out; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	break; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       READ_UNLOCK(pp->ArRWLock); | 
					
						
							|  |  |  |       return Yap_unify(AbsAppl(base),ARG2); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2005-11-17 13:40:18 +00:00
										 |  |  |   Yap_Error(TYPE_ERROR_ATOM,t,"add_to_array_element"); | 
					
						
							| 
									
										
										
										
											2005-10-19 19:00:48 +00:00
										 |  |  |   return FALSE; | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-04-10 04:01:15 +00:00
										 |  |  | static Int | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | p_static_array_location( USES_REGS1 ) | 
					
						
							| 
									
										
										
										
											2005-04-10 04:01:15 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   Term t = Deref(ARG1); | 
					
						
							|  |  |  |   Int *ptr; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (IsVarTerm(t)) { | 
					
						
							|  |  |  |     return FALSE; | 
					
						
							|  |  |  |   } else if (IsAtomTerm(t)) { | 
					
						
							|  |  |  |     /* Create a named array */ | 
					
						
							|  |  |  |     AtomEntry *ae = RepAtom(AtomOfTerm(t)); | 
					
						
							|  |  |  |     StaticArrayEntry *pp; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     READ_LOCK(ae->ARWLock); | 
					
						
							|  |  |  |     pp = RepStaticArrayProp(ae->PropsOfAE); | 
					
						
							|  |  |  |     while (!EndOfPAEntr(pp) && pp->KindOfPE != ArrayProperty) | 
					
						
							|  |  |  |       pp = RepStaticArrayProp(pp->NextOfPE); | 
					
						
							|  |  |  |     if (EndOfPAEntr(pp) || pp->ValueOfVE.ints == NULL) { | 
					
						
							|  |  |  |       READ_UNLOCK(ae->ARWLock); | 
					
						
							|  |  |  |       return FALSE; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       ptr =  pp->ValueOfVE.ints; | 
					
						
							|  |  |  |       READ_UNLOCK(ae->ARWLock); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return Yap_unify(ARG2,MkIntegerTerm((Int)ptr)); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return FALSE; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | void  | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | Yap_InitArrayPreds( void ) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2004-11-18 22:32:40 +00:00
										 |  |  |   Yap_InitCPred("$create_array", 2, p_create_array, SyncPredFlag|HiddenPredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("$array_references", 3, p_array_references, SafePredFlag|HiddenPredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("$array_arg", 3, p_array_arg, SafePredFlag|HiddenPredFlag); | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   Yap_InitCPred("static_array", 3, p_create_static_array, SafePredFlag|SyncPredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("resize_static_array", 3, p_resize_static_array, SafePredFlag|SyncPredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("mmapped_array", 4, p_create_mmapped_array, SafePredFlag|SyncPredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("update_array", 3, p_assign_static, SafePredFlag); | 
					
						
							| 
									
										
										
										
											2005-10-28 17:38:50 +00:00
										 |  |  |   Yap_InitCPred("dynamic_update_array", 3, p_assign_dynamic, SafePredFlag); | 
					
						
							| 
									
										
										
										
											2002-11-26 22:28:32 +00:00
										 |  |  |   Yap_InitCPred("add_to_array_element", 4, p_add_to_array_element, SafePredFlag); | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   Yap_InitCPred("array_element", 3, p_access_array, 0); | 
					
						
							| 
									
										
										
										
											2008-06-11 11:08:25 +00:00
										 |  |  |   Yap_InitCPred("reset_static_array", 1, p_clear_static_array, SafePredFlag); | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   Yap_InitCPred("close_static_array", 1, p_close_static_array, SafePredFlag); | 
					
						
							| 
									
										
										
										
											2004-11-18 22:32:40 +00:00
										 |  |  |   Yap_InitCPred("$sync_mmapped_arrays", 0, p_sync_mmapped_arrays, SafePredFlag|HiddenPredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("$compile_array_refs", 0, p_compile_array_refs, SafePredFlag|HiddenPredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("$array_refs_compiled", 0, p_array_refs_compiled, SafePredFlag|HiddenPredFlag); | 
					
						
							|  |  |  |   Yap_InitCPred("$static_array_properties", 3, p_static_array_properties, SafePredFlag|HiddenPredFlag); | 
					
						
							| 
									
										
										
										
											2003-10-17 02:11:21 +00:00
										 |  |  |   Yap_InitCPred("static_array_to_term", 2, p_static_array_to_term, 0L); | 
					
						
							| 
									
										
										
										
											2005-04-10 04:01:15 +00:00
										 |  |  |   Yap_InitCPred("static_array_location", 2, p_static_array_location, 0L); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 |