--- gforth/Attic/engine.c 1994/05/18 17:29:52 1.6 +++ gforth/Attic/engine.c 1994/08/25 15:25:21 1.12 @@ -1,5 +1,5 @@ /* - $Id: engine.c,v 1.6 1994/05/18 17:29:52 pazsan Exp $ + $Id: engine.c,v 1.12 1994/08/25 15:25:21 anton Exp $ Copyright 1992 by the ANSI figForth Development Group */ @@ -17,13 +17,6 @@ #include "forth.h" #include "io.h" -#ifndef unlink - extern unlink(char *); -#endif -#ifndef ftruncate - extern ftruncate(int, int); -#endif - typedef union { struct { #ifdef BIG_ENDIAN @@ -87,29 +80,7 @@ int emitcounter; static char* fileattr[6]={"r","rb","r+","r+b","w+","w+b"}; -#if ~defined(select) && defined(DOS) -/* select replacement for DOS computers for ms only */ -void select(int n, int a, int b, int c, struct timeval * timeout) -{ - struct timeval time1; - struct timeval time2; - struct timezone zone1; - - gettimeofday(&time1,&zone1); - time1.tv_sec += timeout->tv_sec; - time1.tv_usec += timeout->tv_usec; - while(time1.tv_usec >= 1000000) - { - time1.tv_usec -= 1000000; - time1.tv_sec++; - } - do - { - gettimeofday(&time2,&zone1); - } - while(time2.tv_usec < time1.tv_usec || time2.tv_sec < time1.tv_sec); -} -#endif +static Address up0=NULL; Label *engine(Xt *ip, Cell *sp, Cell *rp, Float *fp, Address lp) /* executes code at ip, if ip!=NULL @@ -117,12 +88,13 @@ Label *engine(Xt *ip, Cell *sp, Cell *rp */ { Xt cfa; - Address up=NULL; + Address up=up0; static Label symbols[]= { &&docol, &&docon, &&dovar, &&douser, + &&dodefer, &&dodoes, &&dodoes, /* dummy for does handler address */ #include "prim_labels.i" @@ -135,7 +107,7 @@ Label *engine(Xt *ip, Cell *sp, Cell *rp if (ip == NULL) return symbols; - + IF_TOS(TOS = sp[0]); IF_FTOS(FTOS = fp[0]); prep_terminal(); @@ -203,6 +175,13 @@ Label *engine(Xt *ip, Cell *sp, Cell *rp #endif NEXT; + dodefer: +#ifdef DEBUG + printf("%08x: defer: %08x\n",(Cell)ip,(Cell)PFA1(cfa)); +#endif + cfa = *(Xt *)PFA1(cfa); + NEXT1; + dodoes: /* this assumes the following structure: defining-word: