--- gforth/prim 2000/08/11 19:49:39 1.53 +++ gforth/prim 2000/09/09 20:32:58 1.59 @@ -121,7 +121,7 @@ IF_TOS(TOS = sp[0]); EXEC(xt); perform ( a_addr -- ) gforth -""Equivalent to @code{@ execute}."" +""@code{@@ execute}."" /* and pfe */ ip=IP; IF_TOS(TOS = sp[0]); @@ -1224,8 +1224,8 @@ n2 = n1 * sizeof(Char); ; count ( c_addr1 -- c_addr2 u ) core -"" If @i{c-add1} is the address of a counted string return the length of -the string, @i{u}, and the address of its first character, @i{c-addr2}."" +""@i{c-addr2} is the first character and @i{u} the length of the +counted string at @i{c-addr1}."" u = *c_addr1; c_addr2 = c_addr1+1; : @@ -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); : @@ -1504,8 +1504,8 @@ in length."" c_addr2 = getenv(cstr(c_addr1,u1,1)); u2 = (c_addr2 == NULL ? 0 : strlen(c_addr2)); -open-pipe ( c_addr u ntype -- wfileid wior ) gforth open_pipe -wfileid=(Cell)popen(cstr(c_addr,u,1),fileattr[ntype]); /* ~ expansion of 1st arg? */ +open-pipe ( c_addr u wfam -- wfileid wior ) gforth open_pipe +wfileid=(Cell)popen(cstr(c_addr,u,1),fileattr[wfam]); /* ~ expansion of 1st arg? */ wior = IOR(wfileid==0); /* !! the man page says that errno is not set reliably */ close-pipe ( wfileid -- wretval wior ) gforth close_pipe @@ -1599,15 +1599,15 @@ IF_FTOS(FTOS=fp[0]); close-file ( wfileid -- wior ) file close_file wior = IOR(fclose((FILE *)wfileid)==EOF); -open-file ( c_addr u ntype -- wfileid wior ) file open_file -wfileid = (Cell)fopen(tilde_cstr(c_addr, u, 1), fileattr[ntype]); +open-file ( c_addr u wfam -- wfileid wior ) file open_file +wfileid = (Cell)fopen(tilde_cstr(c_addr, u, 1), fileattr[wfam]); wior = IOR(wfileid == 0); -create-file ( c_addr u ntype -- wfileid wior ) file create_file +create-file ( c_addr u wfam -- wfileid wior ) file create_file Cell fd; -fd = open(tilde_cstr(c_addr, u, 1), O_CREAT|O_TRUNC|ufileattr[ntype], 0666); +fd = open(tilde_cstr(c_addr, u, 1), O_CREAT|O_TRUNC|ufileattr[wfam], 0666); if (fd != -1) { - wfileid = (Cell)fdopen(fd, fileattr[ntype]); + wfileid = (Cell)fdopen(fd, fileattr[wfam]); wior = IOR(wfileid == 0); } else { wfileid = 0; @@ -1646,17 +1646,21 @@ wior = FILEIO(u2float ( c_addr u -- flag ) float to_float -""Attempt to convert the character string @i{c-addr u} to -internal floating-point representation. If the string -represents a valid floating-point number @i{r} is placed -on the floating-point stack and @i{flag} is true. Otherwise, -@i{flag} is false. A string of blanks is a special case -and represents the floating-point number 0."" +""Actual stack effect: ( c_addr u -- r t | f ). Attempt to convert the +character string @i{c-addr u} to internal floating-point +representation. If the string represents a valid floating-point number +@i{r} is placed on the floating-point stack and @i{flag} is +true. Otherwise, @i{flag} is false. A string of blanks is a special +case and represents the floating-point number 0."" /* real signature: c_addr u -- r t / f */ Float r; char *number=cstr(c_addr, u, 1); @@ -2261,7 +2265,9 @@ c_addr=newline; u=sizeof(newline); : "newline count ; -Create "newline 1 c, $0A c, +Create "newline e? crlf [IF] 2 c, $0D c, [ELSE] 1 c, [THEN] $0A c, + +\+os utime ( -- dtime ) gforth ""Report the current time in microseconds since some epoch."" @@ -2284,8 +2290,16 @@ 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 + +\+ + +\+floating v* ( f_addr1 nstride1 f_addr2 nstride2 ucount -- r ) gforth v_star ""dot-product: r=v1*v2. The first element of v1 is at f_addr1, the @@ -2296,6 +2310,10 @@ for (r=0.; ucount>0; ucount--) { f_addr1 = (Float *)(((Address)f_addr1)+nstride1); f_addr2 = (Float *)(((Address)f_addr2)+nstride2); } +: + >r swap 2swap swap 0e r> 0 ?DO + dup f@ over + 2swap dup f@ f* f+ over + 2swap + LOOP 2drop 2drop ; faxpy ( ra f_x nstridex f_y nstridey ucount -- ) gforth ""vy=ra*vx+vy"" @@ -2304,3 +2322,9 @@ for (; ucount>0; ucount--) { f_x = (Float *)(((Address)f_x)+nstridex); f_y = (Float *)(((Address)f_y)+nstridey); } +: + >r swap 2swap swap r> 0 ?DO + fdup dup f@ f* over + 2swap dup f@ f+ dup f! over + 2swap + LOOP 2drop 2drop fdrop ; + +\+