--- gforth/prim 2000/08/17 12:46:57 1.56 +++ gforth/prim 2000/11/10 10:04:20 1.64 @@ -1,6 +1,6 @@ \ Gforth primitives -\ Copyright (C) 1995,1996,1997,1998 Free Software Foundation, Inc. +\ Copyright (C) 1995,1996,1997,1998,2000 Free Software Foundation, Inc. \ This file is part of Gforth. @@ -16,7 +16,7 @@ \ You should have received a copy of the GNU General Public License \ along with this program; if not, write to the Free Software -\ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +\ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. \ WARNING: This file is processed by m4. Make sure your identifiers @@ -117,14 +117,14 @@ INC_IP(1); execute ( xt -- ) core ""Perform the semantics represented by the execution token, @i{xt}."" ip=IP; -IF_TOS(TOS = sp[0]); +IF_spTOS(spTOS = sp[0]); EXEC(xt); perform ( a_addr -- ) gforth ""@code{@@ execute}."" /* and pfe */ ip=IP; -IF_TOS(TOS = sp[0]); +IF_spTOS(spTOS = sp[0]); EXEC(*(Xt *)a_addr); : @ execute ; @@ -170,7 +170,7 @@ else condbranch(?branch,( f -- ) f83 question_branch, if (f==0) { - IF_TOS(TOS = sp[0]); + IF_spTOS(spTOS = sp[0]); ,: 0= dup \ !f !f r> dup @ \ !f !f IP branchoffset @@ -187,7 +187,7 @@ if (f==0) { ""The run-time procedure compiled by @code{?DUP-IF}."" if (f==0) { sp++; - IF_TOS(TOS = sp[0]); + IF_spTOS(spTOS = sp[0]); SET_IP((Xt *)(((Cell)IP)+(Cell)NEXT_INST)); NEXT; } @@ -241,7 +241,7 @@ if ((olddiff^(olddiff+n))>=0 /* the li #else *rp = index + n; #endif - IF_TOS(TOS = sp[0]); + IF_spTOS(spTOS = sp[0]); ,: r> swap r> r> 2dup - >r @@ -262,7 +262,7 @@ if (olddiff>u) { #else *rp = index - u; #endif - IF_TOS(TOS = sp[0]); + IF_spTOS(spTOS = sp[0]); ,) condbranch((s+loop),( n -- ) gforth paren_symmetric_plus_loop, @@ -283,7 +283,7 @@ if (diff>=0 || newdiff<0) { #else *rp = index + n; #endif - IF_TOS(TOS = sp[0]); + IF_spTOS(spTOS = sp[0]); ,) \+ @@ -311,7 +311,7 @@ rp += 2; *--rp = nlimit; *--rp = nstart; if (nstart == nlimit) { - IF_TOS(TOS = sp[0]); + IF_spTOS(spTOS = sp[0]); goto branch; } else { @@ -331,7 +331,7 @@ else { *--rp = nlimit; *--rp = nstart; if (nstart >= nlimit) { - IF_TOS(TOS = sp[0]); + IF_spTOS(spTOS = sp[0]); goto branch; } else { @@ -351,7 +351,7 @@ else { *--rp = ulimit; *--rp = ustart; if (ustart >= ulimit) { - IF_TOS(TOS = sp[0]); + IF_spTOS(spTOS = sp[0]); goto branch; } else { @@ -371,7 +371,7 @@ else { *--rp = nlimit; *--rp = nstart; if (nstart <= nlimit) { - IF_TOS(TOS = sp[0]); + IF_spTOS(spTOS = sp[0]); goto branch; } else { @@ -391,7 +391,7 @@ else { *--rp = ulimit; *--rp = ustart; if (ustart <= ulimit) { - IF_TOS(TOS = sp[0]); + IF_spTOS(spTOS = sp[0]); goto branch; } else { @@ -955,7 +955,7 @@ a_addr = sp+1; sp! ( a_addr -- ) gforth sp_store sp = a_addr; -/* works with and without TOS caching */ +/* works with and without spTOS caching */ rp@ ( -- a_addr ) gforth rp_fetch a_addr = rp; @@ -1066,7 +1066,7 @@ tuck ( w1 w2 -- w2 w1 w2 ) core-ext ""Actually the stack effect is: @code{( w -- 0 | w w )}. It performs a @code{dup} if w is nonzero."" if (w!=0) { - IF_TOS(*sp-- = w;) + IF_spTOS(*sp-- = w;) #ifndef USE_TOS *--sp = w; #endif @@ -1379,7 +1379,7 @@ c_addr = (Address)CODE_ADDRESS(xt); @ ; >does-code ( xt -- a_addr ) gforth to_does_code -""If @i{xt} is the execution token of a defining-word-defined word, +""If @i{xt} is the execution token of a child of a @code{DOES>} word, @i{a-addr} is the start of the Forth code after the @code{DOES>}; Otherwise @i{a-addr} is 0."" a_addr = (Cell *)DOES_CODE(xt); @@ -1394,16 +1394,16 @@ CACHE_FLUSH(xt,(size_t)PFA(0)); ! ; does-code! ( a_addr xt -- ) gforth does_code_store -""Create a code field at @i{xt} for a defining-word-defined word; @i{a-addr} -is the start of the Forth code after @code{DOES>}."" +""Create a code field at @i{xt} for a child of a @code{DOES>}-word; +@i{a-addr} is the start of the Forth code after @code{DOES>}."" MAKE_DOES_CF(xt, a_addr); CACHE_FLUSH(xt,(size_t)PFA(0)); : dodoes: over ! cell+ ! ; does-handler! ( a_addr -- ) gforth does_handler_store -""Create a @code{DOES>}-handler at address @i{a-addr}. Usually, @i{a-addr} points -just behind a @code{DOES>}."" +""Create a @code{DOES>}-handler at address @i{a-addr}. Normally, +@i{a-addr} points just behind a @code{DOES>}."" MAKE_DOES_HANDLER(a_addr); CACHE_FLUSH((caddr_t)a_addr,DOES_HANDLER_SIZE); : @@ -1584,14 +1584,14 @@ access the stack itself. The stack point variables @code{SP} and @code{FP}."" /* This is a first attempt at support for calls to C. This may change in the future */ -IF_FTOS(fp[0]=FTOS); +IF_fpTOS(fp[0]=fpTOS); FP=fp; SP=sp; ((void (*)())w)(); sp=SP; fp=FP; -IF_TOS(TOS=sp[0]); -IF_FTOS(FTOS=fp[0]); +IF_spTOS(spTOS=sp[0]); +IF_fpTOS(fpTOS=fp[0]); \+ \+file @@ -1647,7 +1647,7 @@ if (wior) clearerr((FILE *)wfileid); read-line ( c_addr u1 wfileid -- u2 flag wior ) file read_line -#if 1 +""this is only for backward compatibility"" Cell c; flag=-1; for(u2=0; u20) && (c_addr[u2-1]==NEWLINE)); -} -else { - wior=0; - u2=0; -} -#endif \+ @@ -1906,9 +1892,9 @@ number[u]='\0'; r=strtod(number,&endconv); if((flag=FLAG(!(Cell)*endconv))) { - IF_FTOS(fp[0] = FTOS); + IF_fpTOS(fp[0] = fpTOS); fp += -1; - FTOS = sign ? -r : r; + fpTOS = sign ? -r : r; } else if(*endconv=='d' || *endconv=='D') { @@ -1916,9 +1902,9 @@ else if(*endconv=='d' || *endconv=='D') r=strtod(number,&endconv); if((flag=FLAG(!(Cell)*endconv))) { - IF_FTOS(fp[0] = FTOS); + IF_fpTOS(fp[0] = fpTOS); fp += -1; - FTOS = sign ? -r : r; + fpTOS = sign ? -r : r; } } @@ -2210,12 +2196,12 @@ UP=up=(char *)a_addr; Variable UP wcall ( u -- ) gforth -IF_FTOS(fp[0]=FTOS); +IF_fpTOS(fp[0]=fpTOS); FP=fp; sp=(SYSCALL(Cell(*)(Cell *, void *))u)(sp, &FP); fp=FP; -IF_TOS(TOS=sp[0];) -IF_FTOS(FTOS=fp[0]); +IF_spTOS(spTOS=sp[0];) +IF_fpTOS(fpTOS=fp[0]); \+file @@ -2286,7 +2272,11 @@ dsystem = timeval2us(&usage.ru_stime); struct timeval time1; gettimeofday(&time1,NULL); duser = timeval2us(&time1); +#ifndef BUGGY_LONG_LONG dsystem = (DCell)0; +#else +dsystem=(DCell){0,0}; +#endif #endif \+ @@ -2320,3 +2310,31 @@ for (; ucount>0; ucount--) { LOOP 2drop 2drop fdrop ; \+ + +\+file + +(read-line) ( c_addr u1 wfileid -- u2 flag u3 wior ) file paren_read_line +Cell c; +flag=-1; +u3=0; +for(u2=0; u2