--- gforth/engine/engine.c 1998/12/08 22:03:02 1.6 +++ gforth/engine/engine.c 2000/05/31 14:37:41 1.17 @@ -38,6 +38,7 @@ #include #include #include +#include #else #include "systypes.h" #endif @@ -45,6 +46,9 @@ #if defined(HAVE_LIBDL) || defined(HAVE_DLOPEN) /* what else? */ #include #endif +#if defined(_WIN32) +#include +#endif #ifdef hpux #include #endif @@ -77,6 +81,12 @@ int emitcounter; #endif #define NULLC '\0' +#ifdef MEMCMP_AS_SUBROUTINE +extern int gforth_memcmp(const char * s1, const char * s2, size_t n); +#define memcmp(s1,s2,n) gforth_memcmp(s1,s2,n) +#endif + +#ifdef HAS_FILE char *cstr(Char *from, UCell size, int clear) /* return a C-string corresponding to the Forth string ( FROM SIZE ). the C-string lives until the next call of cstr with CLEAR being true */ @@ -109,12 +119,6 @@ char *cstr(Char *from, UCell size, int c return b->buffer; } -#ifdef STANDALONE -char *tilde_cstr(Char *from, UCell size, int clear) -{ - return cstr(from, size, clear); -} -#else char *tilde_cstr(Char *from, UCell size, int clear) /* like cstr(), but perform tilde expansion on the string */ { @@ -134,6 +138,8 @@ char *tilde_cstr(Char *from, UCell size, UCell i; for (i=1; i=MAX_SYMBOLS) { fprintf(stderr,"gforth-ditc: more than %d primitives\n",MAX_SYMBOLS); exit(1); - } - symbols[i] = &routines[i]; } -#endif /* defined(DOUBLY_INDIRECT) */ - return symbols; + symbols[i] = &routines[i]; } +#endif /* defined(DOUBLY_INDIRECT) */ + return symbols; +} IF_TOS(TOS = sp[0]); IF_FTOS(FTOS = fp[0]); - /* prep_terminal(); */ - NEXT_P0; +/* prep_terminal(); */ + SET_IP(ip); NEXT; + #ifdef CPU_DEP3 CPU_DEP3 #endif @@ -304,22 +328,17 @@ Label *engine(Xt *ip0, Cell *sp0, Cell * #ifdef CISC_NEXT /* this is the simple version */ *--rp = (Cell)ip; - ip = (Xt *)PFA1(cfa); - NEXT_P0; + SET_IP((Xt *)PFA1(cfa)); NEXT; #else - /* this one is important, so we help the compiler optimizing - The following version may be better (for scheduling), but probably has - problems with code fields employing calls and delay slots - */ + /* this one is important, so we help the compiler optimizing */ { DEF_CA - Xt *current_ip = (Xt *)PFA1(cfa); - cfa = *current_ip; - NEXT1_P1; - *--rp = (Cell)ip; - ip = current_ip+1; - NEXT1_P2; + rp[-1] = (Cell)ip; + SET_IP((Xt *)PFA1(cfa)); + NEXT_P1; + rp--; + NEXT_P2; } #endif } @@ -387,7 +406,7 @@ Label *engine(Xt *ip0, Cell *sp0, Cell * #ifdef DEBUG fprintf(stderr,"%08lx: field: %08lx\n",(Cell)ip,(Cell)PFA1(cfa)); #endif - TOS += *(Cell*)PFA1(cfa); + TOS += *(Cell*)PFA1(cfa); } NEXT_P0; NEXT; @@ -420,16 +439,15 @@ Label *engine(Xt *ip0, Cell *sp0, Cell * #endif *--rp = (Cell)ip; /* PFA1 might collide with DOES_CODE1 here, so we use PFA */ - ip = DOES_CODE1(cfa); #ifdef USE_TOS *sp-- = TOS; TOS = (Cell)PFA(cfa); #else *--sp = (Cell)PFA(cfa); #endif + SET_IP(DOES_CODE1(cfa)); /* fprintf(stderr,"TOS = %08lx, IP=%08lx\n", TOS, IP);*/ } - NEXT_P0; NEXT; #include "prim.i"