This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
yap-6.3/os/pl-privitf.h

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
{
YAP_Term gstore;
YAP_Term start;
} list_ctx;
static inline void
addSmallIntList(list_ctx *ctx, int value)
{
ctx->gstore = YAP_ExtendList(ctx->gstore,YAP_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*/