--- gforth/extend.fs 2000/08/08 12:37:05 1.39 +++ gforth/extend.fs 2011/12/31 15:29:25 1.70 @@ -1,12 +1,12 @@ \ EXTEND.FS CORE-EXT Word not fully tested! 12may93jaw -\ Copyright (C) 1995,1998 Free Software Foundation, Inc. +\ Copyright (C) 1995,1998,2000,2003,2005,2007,2009,2010,2011 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., 675 Mass Ave, Cambridge, MA 02139, USA. +\ along with this program. If not, see http://www.gnu.org/licenses/. \ May be cross-compiled @@ -25,55 +24,77 @@ decimal \ .( 12may93jaw -: .( ( "ccc" -- ) \ core-ext dot-paren - \G Parse a string @i{ccc} delimited by a @code{)} (right - \G parenthesis). Display the string. This is often used to display - \G progress information during compilation; see examples below. +: .( ( compilation&interpretation "ccc" -- ) \ core-ext dot-paren + \G Compilation and interpretation semantics: Parse a string @i{ccc} + \G delimited by a @code{)} (right parenthesis). Display the + \G string. This is often used to display progress information during + \G compilation; see examples below. [char] ) parse type ; immediate \ VALUE 2>R 2R> 2R@ 17may93jaw \ !! 2value +[ifundef] 2literal : 2Literal ( compilation w1 w2 -- ; run-time -- w1 w2 ) \ double two-literal \G Compile appropriate code such that, at run-time, cell pair @i{w1, w2} are \G placed on the stack. Interpretation semantics are undefined. swap postpone Literal postpone Literal ; immediate restrict +[then] ' drop alias d>s ( d -- n ) \ double d_to_s : m*/ ( d1 n2 u3 -- dquot ) \ double m-star-slash + \G dquot=(d1*n2)/u3, with the intermediate result being triple-precision. + \G In ANS Forth u3 can only be a positive signed number. >r s>d >r abs -rot s>d r> xor r> swap >r >r dabs rot tuck um* 2swap um* - swap >r 0 d+ r> -rot r@ um/mod -rot r> um/mod nip swap - r> IF dnegate THEN ; + swap >r 0 d+ r> -rot r@ um/mod -rot r> um/mod + [ 1 -3 mod 0< ] [if] + -rot r> IF IF 1. d+ THEN dnegate ELSE drop THEN + [else] + nip swap r> IF dnegate THEN + [then] ; \ CASE OF ENDOF ENDCASE 17may93jaw \ just as described in dpANS5 -0 CONSTANT case ( compilation -- case-sys ; run-time -- ) \ core-ext - immediate +[ifundef] cs-drop +: CS-DROP ( dest -- ) \ gforth + dest? 2drop ; +[then] + +: case ( compilation -- case-sys ; run-time -- ) \ core-ext + postpone begin 0 ; immediate + +: ?of ( compilation -- of-sys ; run-time f -- ) \ gforth + >r POSTPONE if r> ; immediate : of ( compilation -- of-sys ; run-time x1 x2 -- |x1 ) \ core-ext \ !! the implementation does not match the stack effect - 1+ >r - postpone over postpone = postpone if postpone drop - r> ; immediate + postpone over postpone = postpone ?of postpone drop ; immediate : endof ( compilation case-sys1 of-sys -- case-sys2 ; run-time -- ) \ core-ext end-of - >r postpone else r> ; immediate + >r postpone else 1 cs-roll r> 1+ ; immediate + +: contof ( compilation case-sys1 of-sys -- case-sys2 ; run-time -- ) + \ like @code{endof}, but loops back to the @code{case} + >r 1 cs-pick postpone again postpone then r> ; immediate + +: n-thens ( orig1 ... origu u -- ) + 0 ?do postpone then loop ; : endcase ( compilation case-sys -- ; run-time x -- ) \ core-ext end-case - postpone drop - 0 ?do postpone then loop ; immediate + >r cs-drop postpone drop r> n-thens ; immediate -\ C" 17may93jaw +: nextcase ( compilation case-sys -- ; run-time x -- ) \ gforth-undocumented + \ like ENDCASE, but start again from the beginning if this is + \ reached by fallthrough + >r postpone drop postpone again r> n-thens ; immediate -: (c") "lit ; -: CLiteral - postpone (c") here over char+ allot place align ; immediate restrict +\ C" 17may93jaw : C" ( compilation "ccc" -- ; run-time -- c-addr ) \ core-ext c-quote \G Compilation: parse a string @i{ccc} delimited by a @code{"} @@ -94,21 +115,18 @@ decimal \ CONVERT 17may93jaw -: convert ( ud1 c-addr1 -- ud2 c-addr2 ) \ core-ext - \G OBSOLESCENT: superseded by @code{>number}. +: convert ( ud1 c-addr1 -- ud2 c-addr2 ) \ core-ext-obsolescent + \G Obsolescent: superseded by @code{>number}. char+ true >number drop ; \ ERASE 17may93jaw -: erase ( addr len -- ) \ core-ext - \G If @i{len}>0, clear all bits in each location of a memory region - \G of @i{len} address units starting at address @i{addr}. +: erase ( addr u -- ) \ core-ext + \G Clear all bits in @i{u} aus starting at @i{addr}. \ !! dependence on "1 chars 1 =" ( 0 1 chars um/mod nip ) 0 fill ; : blank ( c-addr u -- ) \ string - \G If @i{u}>0, store the character value for a space in each - \G location of a memory region - \G of @i{u} character units starting at address @i{c-addr}. + \G Store the space character into @i{u} chars starting at @i{c-addr}. bl fill ; \ SEARCH 02sep94py @@ -123,7 +141,7 @@ decimal begin dup r@ >= while - over 2r@ swap -text 0= if + 2dup 2r@ string-prefix? if 2swap 2drop 2r> 2drop true exit endif 1 /string @@ -132,6 +150,7 @@ decimal \ SOURCE-ID SAVE-INPUT RESTORE-INPUT 11jun93jaw +[IFUNDEF] source-id : source-id ( -- 0 | -1 | fileid ) \ core-ext,file source-i-d \G Return 0 (the input source is the user input device), -1 (the \G input source is a string being processed by @code{evaluate}) or @@ -146,7 +165,8 @@ decimal >in @ loadfile @ if - loadfile @ file-position throw #TIB @ 1+ 0 d- \ !! bug for CRLF and EOF + loadfile @ file-position throw + [IFDEF] #fill-bytes #fill-bytes @ [ELSE] #tib @ 1+ [THEN] 0 d- else blk @ linestart @ @@ -180,16 +200,16 @@ decimal r> loadline ! >in ! false ; - +[THEN] \ This things we don't need, but for being complete... jaw \ EXPECT SPAN 17may93jaw -variable span ( -- c-addr ) \ core-ext +variable span ( -- c-addr ) \ core-ext-obsolescent \G @code{Variable} -- @i{c-addr} is the address of a cell that stores the \G length of the last string received by @code{expect}. OBSOLESCENT. -: expect ( c-addr +n -- ) \ core-ext +: expect ( c-addr +n -- ) \ core-ext-obsolescent \G Receive a string of at most @i{+n} characters, and store it \G in memory starting at @i{c-addr}. The string is \G displayed. Input terminates when the key is pressed or @@ -197,9 +217,10 @@ variable span ( -- c-addr ) \ core-ext \G editing capabilites are available. The length of the string is \G stored in @code{span}; it does not include the \G character. OBSOLESCENT: superceeded by @code{accept}. + everyline 0 rot over BEGIN ( maxlen span c-addr pos1 ) - key decode ( maxlen span c-addr pos2 flag ) + xkey decode ( maxlen span c-addr pos2 flag ) >r 2over = r> or UNTIL 2 pick swap /string type @@ -211,15 +232,7 @@ variable span ( -- c-addr ) \ core-ext \ defined afterwards) when executing the mark. : included-files-mark ( -- u ) - included-files 2@ nip - blk @ 0= - if \ not input from blocks - source-id 1 -1 within - if \ input from file - 1- \ do not include the last file (hopefully this is the - \ currently included file) - then - then ; + included-files @ ; \ hmm, most of the saving appears to be pretty unnecessary: we could \ derive the wordlists and the words that have to be kept from the @@ -239,11 +252,13 @@ variable span ( -- c-addr ) \ core-ext REPEAT drop \ remember udp - udp @ , ; + udp @ , + \ remember dyncode-ptr + here ['] noop , compile-prim1 finish-code ; : marker! ( mark -- ) \ reset included files count; resize will happen on next add-included-file - included-files 2@ drop over @ included-files 2! cell+ + included-files @ over @ min included-files ! cell+ \ rest of marker! dup @ swap cell+ ( here rest-of-marker ) dup @ voclink ! cell+ @@ -266,6 +281,9 @@ variable span ( -- c-addr ) \ core-ext REPEAT drop \ restore udp and dp +[IFDEF] forget-dyncode + dup cell+ @ forget-dyncode drop +[THEN] @ udp ! dp ! \ clean up vocabulary stack 0 vp @ 0