--- gforth/stuff.fs 2007/02/18 18:30:51 1.54 +++ gforth/stuff.fs 2009/12/31 15:32:35 1.65 @@ -1,12 +1,12 @@ \ miscelleneous words -\ Copyright (C) 1996,1997,1998,2000,2003,2004,2005,2006 Free Software Foundation, Inc. +\ Copyright (C) 1996,1997,1998,2000,2003,2004,2005,2006,2007,2008,2009 Free Software Foundation, Inc. \ This file is part of Gforth. \ Gforth is free software; you can redistribute it and/or \ modify it under the terms of the GNU General Public License -\ as published by the Free Software Foundation; either version 2 +\ as published by the Free Software Foundation, either version 3 \ of the License, or (at your option) any later version. \ This program is distributed in the hope that it will be useful, @@ -15,8 +15,7 @@ \ GNU General Public License for more details. \ 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., 59 Temple Place, Suite 330, Boston, MA 02111, USA. +\ along with this program. If not, see http://www.gnu.org/licenses/. require glocals.fs @@ -149,14 +148,16 @@ AUser CSP : compile-compile-2literal ( n1 n2 -- ) compile-2literal postpone compile-2literal ; -: [[ ( -- ) +: [[ ( -- ) \ gforth left-bracket-bracket \G switch from postpone state to compile state \ this is only a marker; it is never really interpreted compile-only-error ; immediate [ifdef] compiler1 : postponer1 ( c-addr u -- ... xt ) - 2dup find-name dup if ( c-addr u nt ) + 2dup find-name + [ifdef] run-prelude run-prelude [then] + dup if ( c-addr u nt ) nip nip name>comp 2dup [comp'] [[ d= if 2drop ['] compiler1 is parser1 ['] noop @@ -177,10 +178,32 @@ AUser CSP THEN then ; -: ]] ( -- ) - \ switch into postpone state +: ]] ( -- ) \ gforth right-bracket-bracket + \G switch into postpone state ['] postponer1 is parser1 state on ; immediate restrict +comp' literal drop alias postpone-literal +comp' 2literal drop alias postpone-2literal +comp' fliteral drop alias postpone-fliteral +comp' sliteral drop alias postpone-sliteral + +: ]]L ( postponing: x -- ; compiling: -- x ) \ gforth right-bracket-bracket-l +\G Shortcut for @code{]] literal}. + ]] postpone-literal ]] [[ ; immediate + +: ]]2L ( postponing: x1 x2 -- ; compiling: -- x1 x2 ) \ gforth right-bracket-bracket-two-l +\G Shortcut for @code{]] 2literal}. + ]] postpone-2literal ]] [[ ; immediate + +: ]]FL ( postponing: r -- ; compiling: -- r ) \ gforth right-bracket-bracket-f-l +\G Shortcut for @code{]] fliteral}. + ]] postpone-fliteral ]] [[ ; immediate + +: ]]SL ( postponing: addr1 u -- ; compiling: -- addr2 u ) \ gforth right-bracket-bracket-s-l +\G Shortcut for @code{]] sliteral}; if the string already has been +\G allocated permanently, you can use @code{]]2L} instead. + ]] postpone-sliteral ]] [[ ; immediate + [then] \ f.rdp @@ -355,22 +378,48 @@ previous \ safe output redirection -: to-outfile-id ( file-id -- ) - to outfile-id ; - -: >outfile ( file-id -- r:old-file-id ) - ]] outfile-id >r try to-outfile-id [[ ; immediate compile-only - -: outfile< ( r:old-file-id -- ) - 0 ]] literal restore r@ to-outfile-id endtry rdrop throw [[ -; immediate compile-only - -: to-infile-id ( file-id -- ) - to infile-id ; - -: >infile ( file-id -- r:old-file-id ) - ]] infile-id >r try to-infile-id [[ ; immediate compile-only - -: infile< ( r:old-file-id -- ) - 0 ]] literal restore r@ to-infile-id endtry rdrop throw [[ -; immediate compile-only +: outfile-execute ( ... xt file-id -- ... ) \ gforth + \G execute @i{xt} with the output of @code{type} etc. redirected to + \G @i{file-id}. + outfile-id { oldfid } try + to outfile-id execute 0 + restore + oldfid to outfile-id + endtry + throw ; + +: infile-execute ( ... xt file-id -- ... ) \ gforth + \G execute @i{xt} with the input of @code{key} etc. redirected to + \G @i{file-id}. + infile-id { oldfid } try + to infile-id execute 0 + restore + oldfid to infile-id + endtry + throw ; + +\ safe BASE wrapper + +: base-execute ( i*x xt u -- j*x ) \ gforth + \G execute @i{xt} with the content of @code{BASE} being @i{u}, and + \G restoring the original @code{BASE} afterwards. + base @ { oldbase } \ use local, because TRY blocks the return stack + try + base ! execute 0 + restore + oldbase base ! + endtry + throw ; + +\ th + +: th ( addr1 u -- addr2 ) + cells + ; + +\ \\\ - skip to end of file + +: \\\ ( -- ) \ gforth + \G skip remaining source file + source-id dup 0> IF + >r r@ file-size throw r> reposition-file throw + BEGIN refill 0= UNTIL postpone \ THEN ; immediate