#include "global.h" #include #include /* ru */ stack create_engine(register stack oldwam, long h, long s, long t); no destroy_engine(register stack wam); extern struct specsyms g; extern struct limit max; /* engine */ extern term bp_prolog_call(register term goal, register term regs, register term H, register instr P, register term *A, register stack wam); extern term bp(register term regs, register term H, register instr P, register term *A, register stack wam); #ifdef NO_VALUE_TRAIL extern term *unwind_trail(new0,old) #else extern term *unwind_trail(register term *new0, register term *old); #endif extern term load_engine(register stack wam, cell goal, cell answer); extern term ask_engine(register stack wam); /* builtins */ extern term local_error(cell xval, string Msg, register stack wam); extern cell bp_cons(term hd, term tl); extern term bp_heap_top; extern term copy_to_engine(register stack wam, register term t); /* float */ term make_float(term H, double f); /* io */ extern term sread0(term H, string s); extern string swrite(cell xval, stack wam); /* sym */ extern string *atomtable,lextable,newlex; extern no newatom; /* dict */ extern no hcount; extern no hget(register no pred, register no fun); extern no hset(register no pred, register no fun, register no val); extern no hdef(register no pred, register no fun, register no val, byte stamp); typedef unsigned int half; /* from float.c */ double ints_to_double(half i1, half i2, half i3); #define BP_op OUTPUT_INT(X(1)) #define BP_input X(2) #define BP_result X(3) #define BP_fail() return NULL #define BP_is_integer(Cell) INTEGER(Cell) #define BP_is_var(Cell) VAR(Cell) #define BP_is_atom(Cell) SYMCONST(Cell) #define BP_is_nonvar(Cell) NONVAR(Cell) #define BP_is_compound(Cell) COMPOUND(Cell) #define BP_is_float(Cell) BP_FLOAT(Cell) #define BP_is_number(Cell) NUMERIC(Cell) #define BP_is_number(Cell) NUMERIC(Cell) #define BP_is_list(Cell) IS_LIST(Cell) #define BP_atom(Name) input_fun((Name),0) #define BP_functor(Name,Arity) input_fun((Name),Arity) #define BP_integer(Int) INPUT_INT((Int)) #define BP_funptr(Ptr) PTR2INT((Ptr)) #define BP_make_float(Var,FVal) {(Var)=(cell)H; H=make_float(H,(FVal));} #define BP_string(Name) BP_atom((Name)) #define BP_begin_cons() bp_heap_top=H #define BP_cons(Car,Cdr) bp_cons((term)Car,(term)Cdr) #define BP_nil g.NIL #define BP_end_cons() H=bp_heap_top; #define BP_put_new_var(Var) (Var)=(cell)(SETREF(H,H),H++) #define BP_put_old_var(Var) {SETREF(H,Var);H++;} #define BP_begin_put_list(Result) (Result)=(cell)H #define BP_put_list(Element) PUSH_LIST((cell)(Element)) #define BP_end_put_list() PUSH_NIL() #define BP_put_functor(Result,Name,Arity) \ {(Result)=(cell)H; SETREF(H,BP_functor((Name),(Arity))); H++;} #define BP_put_arg(Element) {SETREF(H,(Element)); H++;} #define BP_get_args(ARGV,ARGC) {ARGV=BP_input; ARGC=GETARITY(BP_input);} #define BP_get_integer(From,IVar) IVar=OUTPUT_INT(From) #define BP_get_string(From,SVar) SVar=NAME(From) #define BP_get_float(From,FVar,Ok) {\ term ref=(term)(From); cell val=GETREF(ref);\ Ok=1;\ if(BP_is_float(val))\ FVar=ints_to_double((half)(ref[1]),(half)(ref[2]),(half)(ref[3]));\ else\ Ok=0;\ } #define BP_sread(String,Cell) \ { cell xval; \ string s=(string)XALLOC(1+strlen(String),char); \ strcpy(s,(String)); \ xval=(cell)sread0(H,s); \ free(s); \ if(!xval) return NULL; \ Cell=xval; H=(term)xval+1; \ } #define BP_swrite(Term) swrite((Term),wam) #define BP_get_simple(From,VoidVar) {\ if(BP_is_integer(From)) {\ int iii; \ BP_get_integer(From,iii);\ *(int *)(VoidVar)=iii;\ }\ else if(BP_is_atom(From)) {\ string sss=NULL;\ BP_get_string(From,sss);\ *(string *)(VoidVar)=sss;\ }\ else if(BP_is_var(From)) {\ int okkk;double ddd;\ BP_get_float(From,ddd,okkk);\ *(double *)(VoidVar)=ddd;\ }\ else {/*do nothing*/}\ } static void **BP_get_list(cell from, int argc, void *argv[]) { if(!BP_is_var(from)) BP_fail(); { term ref=(term)from; cell val=GETREF(ref); int i; void *p; for(i=0;i