94 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*  $Id$
 | |
| 
 | |
|     Part of SWI-Prolog
 | |
| 
 | |
|     Author:        Jan Wielemaker
 | |
|     E-mail:        J.Wielemaker@uva.nl
 | |
|     WWW:           http://www.swi-prolog.org
 | |
|     Copyright (C): 1985-2008, University of Amsterdam
 | |
| 
 | |
|     This library is free software; you can redistribute it and/or
 | |
|     modify it under the terms of the GNU Lesser General Public
 | |
|     License as published by the Free Software Foundation; either
 | |
|     version 2.1 of the License, or (at your option) any later version.
 | |
| 
 | |
|     This library is distributed in the hope that it will be useful,
 | |
|     but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | |
|     Lesser General Public License for more details.
 | |
| 
 | |
|     You should have received a copy of the GNU Lesser General Public
 | |
|     License along with this library; if not, write to the Free Software
 | |
|     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | |
| */
 | |
| 
 | |
| #ifndef PL_PRIVITF_H_INCLUDED
 | |
| #define PL_PRIVITF_H_INCLUDED
 | |
| 
 | |
| COMMON(int) 	PL_get_char(term_t c, int *p, int eof);
 | |
| COMMON(int) 	PL_unify_char(term_t chr, int c, int mode);
 | |
| COMMON(int)	PL_unify_predicate(term_t head, predicate_t pred, int how);
 | |
| 
 | |
| 
 | |
| 
 | |
| 		 /*******************************
 | |
| 		 *	    LIST BUILDING	*
 | |
| 		 *******************************/
 | |
| 
 | |
| /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 | |
| Quickly create a list on the stack. This   is for creating lists were we
 | |
| can give an upperbound to the length  in advance. By allocation upfront,
 | |
| we know there are no garbage  collections   or  stack-shifts  and we can
 | |
| avoid using term-references to address the list.
 | |
| 
 | |
|     * allocList(size_t maxcells, list_ctx *ctx)
 | |
|     Allocate enough space on the stack for a list of maxcells elements.
 | |
|     The final list may be shorter!
 | |
| 
 | |
|     * addSmallIntList(list_ctx *ctx, int value)
 | |
|     Add a small integer to the list
 | |
| 
 | |
|     * unifyList(term_t term, list_ctx *ctx);
 | |
|     Unify term with the created list.  This closes the list and adjusts
 | |
|     the top of the stack.
 | |
| 
 | |
|     * unifyDiffList(term_t head, term_t tail, list_ctx *ctx);
 | |
|     Represent the list as Head\Tail.  This adjusts the top of the stack.
 | |
| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 | |
| 
 | |
| #if __YAP_PROLOG__
 | |
| 
 | |
| typedef struct list_ctx
 | |
| {
 | |
|   Term gstore;
 | |
|   Term start;
 | |
| } list_ctx;
 | |
| 
 | |
| static inline void
 | |
| addSmallIntList(list_ctx *ctx, int value)
 | |
| {
 | |
|   ctx->gstore = ExtendList(ctx->gstore,MkIntTerm(value));
 | |
| }
 | |
| 
 | |
| #else
 | |
| 
 | |
| typedef struct list_ctx
 | |
| { Word lp;
 | |
|   Word gstore;
 | |
| } list_ctx;
 | |
| 
 | |
| static inline void
 | |
| addSmallIntList(list_ctx *ctx, int value)
 | |
| { ctx->gstore[0] = consPtr(&ctx->gstore[1], TAG_COMPOUND|STG_GLOBAL);
 | |
|   ctx->gstore[1] = FUNCTOR_dot2;
 | |
|   ctx->gstore[2] = consInt(value);
 | |
|   ctx->gstore += 3;
 | |
| }
 | |
| #endif
 | |
| 
 | |
| COMMON(int)	allocList(size_t maxcells, list_ctx *ctx);
 | |
| COMMON(int)	unifyList(term_t term, list_ctx *ctx);
 | |
| COMMON(int)	unifyDiffList(term_t head, term_t tail, list_ctx *ctx);
 | |
| 
 | |
| #endif /*PL_PRIVITF_H_INCLUDED*/
 |