Diff for /gforth/blocks.fs between versions 1.38 and 1.62

version 1.38, 2003/01/20 17:07:36 version 1.62, 2012/12/31 15:25:17
Line 1 Line 1
 \ A less simple implementation of the blocks wordset.   \ A less simple implementation of the blocks wordset. 
   
 \ Copyright (C) 1995,1996,1997,1998,2000 Free Software Foundation, Inc.  \ Copyright (C) 1995,1996,1997,1998,2000,2003,2006,2007,2008,2011,2012 Free Software Foundation, Inc.
   
 \ This file is part of Gforth.  \ This file is part of Gforth.
   
 \ Gforth is free software; you can redistribute it and/or  \ Gforth is free software; you can redistribute it and/or
 \ modify it under the terms of the GNU General Public License  \ 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.  \ of the License, or (at your option) any later version.
   
 \ This program is distributed in the hope that it will be useful,  \ This program is distributed in the hope that it will be useful,
Line 15 Line 15
 \ GNU General Public License for more details.  \ GNU General Public License for more details.
   
 \ You should have received a copy of the GNU General Public License  \ You should have received a copy of the GNU General Public License
 \ along with this program; if not, write to the Free Software  \ along with this program. If not, see http://www.gnu.org/licenses/.
 \ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.  
   
   
 \ A more efficient implementation would use mmap on OSs that  \ A more efficient implementation would use mmap on OSs that
Line 64  User block-offset ( -- addr ) \ gforth Line 63  User block-offset ( -- addr ) \ gforth
     buffer-struct buffers * %alloc dup block-buffers ! ( addr )      buffer-struct buffers * %alloc dup block-buffers ! ( addr )
     buffer-struct %size buffers * erase ;      buffer-struct %size buffers * erase ;
   
 ' block-cold INIT8 chained  :noname ( -- )
       defers 'cold
       block-cold
   ; is 'cold
   
 block-cold  block-cold
   
Line 76  Defer flush-blocks ( -- ) \ gforth Line 78  Defer flush-blocks ( -- ) \ gforth
         2dup open-fpath-file throw          2dup open-fpath-file throw
         rot close-file throw  2dup file-status throw bin open-file throw          rot close-file throw  2dup file-status throw bin open-file throw
         >r 2drop r>          >r 2drop r>
     recover ( c-addr u ior )      endtry-iferror ( c-addr u ior )
         >r 2dup file-status nip 0= r> and throw \ does it really not exist?          >r 2dup file-status nip 0= r> and throw \ does it really not exist?
         r/w bin create-file throw          r/w bin create-file throw
     endtry      then
     block-fid @ IF      block-fid @ IF
         flush-blocks block-fid @ close-file throw          flush-blocks block-fid @ close-file throw
     THEN      THEN
Line 87  Defer flush-blocks ( -- ) \ gforth Line 89  Defer flush-blocks ( -- ) \ gforth
   
 : use ( "file" -- ) \ gforth  : use ( "file" -- ) \ gforth
     \g Use @i{file} as the blocks file.      \g Use @i{file} as the blocks file.
     name open-blocks ;      name name-too-short? open-blocks ;
   
 \ the file is opened as binary file, since it either will contain text  \ the file is opened as binary file, since it either will contain text
 \ without newlines or binary data  \ without newlines or binary data
Line 112  Defer flush-blocks ( -- ) \ gforth Line 114  Defer flush-blocks ( -- ) \ gforth
   
 : save-buffer ( buffer -- ) \ gforth  : save-buffer ( buffer -- ) \ gforth
     >r      >r
     r@ buffer-dirty @ r@ buffer-block @ 0<> and      r@ buffer-dirty @
     if      if
         r@ buffer-block @ block-position          r@ buffer-block @ block-position
         r@ block-buffer chars/block  r@ buffer-fid @  write-file throw          r@ block-buffer chars/block  r@ buffer-fid @  write-file throw
Line 122  Defer flush-blocks ( -- ) \ gforth Line 124  Defer flush-blocks ( -- ) \ gforth
     rdrop ;      rdrop ;
   
 : empty-buffer ( buffer -- ) \ gforth  : empty-buffer ( buffer -- ) \ gforth
     buffer-block off ;      dup buffer-block on buffer-dirty off ;
   
 : save-buffers  ( -- ) \ block  : save-buffers  ( -- ) \ block
     \G Transfer the contents of each @code{update}d block buffer to      \G Transfer the contents of each @code{update}d block buffer to
Line 148  Defer flush-blocks ( -- ) \ gforth Line 150  Defer flush-blocks ( -- ) \ gforth
 : get-buffer ( u -- a-addr ) \ gforth  : get-buffer ( u -- a-addr ) \ gforth
     0 buffers um/mod drop buffer-struct %size * block-buffers @ + ;      0 buffers um/mod drop buffer-struct %size * block-buffers @ + ;
   
 : block ( u -- a-addr ) \ gforthman- block  : block ( u -- a-addr ) \ block
     \G If a block buffer is assigned for block @i{u}, return its      \G If a block buffer is assigned for block @i{u}, return its
     \G start address, @i{a-addr}. Otherwise, assign a block buffer      \G start address, @i{a-addr}. Otherwise, assign a block buffer
     \G for block @i{u} (if the assigned block buffer has been      \G for block @i{u} (if the assigned block buffer has been
Line 186  Defer flush-blocks ( -- ) \ gforth Line 188  Defer flush-blocks ( -- ) \ gforth
     block ;      block ;
   
 User scr ( -- a-addr ) \ block-ext s-c-r  User scr ( -- a-addr ) \ block-ext s-c-r
     \G @code{User} variable -- @i{a-addr} is the address of a cell containing      \G @code{User} variable containing
     \G the block number of the block most recently processed by      \G the block number of the block most recently processed by
     \G @code{list}.      \G @code{list}.
 0 scr !  0 scr !
Line 206  User scr ( -- a-addr ) \ block-ext s-c-r Line 208  User scr ( -- a-addr ) \ block-ext s-c-r
     dup scr !      dup scr !
     ." Screen " u.      ." Screen " u.
     scr @ updated?  0= IF ." not "  THEN  ." modified     " cr      scr @ updated?  0= IF ." not "  THEN  ." modified     " cr
     16 0      l/s 0
     ?do      ?do
         i 2 .r space scr @ block i 64 * chars + 64 type cr          i 2 .r space scr @ block i c/l * chars + c/l type cr
     loop ;      loop ;
   
 [IFDEF] current-input  [IFDEF] current-input
Line 216  User scr ( -- a-addr ) \ block-ext s-c-r Line 218  User scr ( -- a-addr ) \ block-ext s-c-r
                               \ restore-input                                \ restore-input
 :noname  blk @ >in @ 2 ;      \ save-input  :noname  blk @ >in @ 2 ;      \ save-input
 :noname  2 ;                  \ source-id "*a block*"  :noname  2 ;                  \ source-id "*a block*"
 :noname  1 blk +! 1 loadline +! true ;      \ refill  :noname  1 blk +! 1 loadline +! >in off true ;      \ refill
 :noname  blk @ block chars/block ;  \ source  :noname  blk @ block chars/block ;  \ source
   
 Create block-input   A, A, A, A, A,  Create block-input   A, A, A, A, A,
   
 : load  ( i*x n -- j*x ) \ block  : load  ( i*x u -- j*x ) \ block
     \G Save the current input source specification. Store @i{n} in      \g Text-interpret block @i{u}.  Block 0 cannot be @code{load}ed.
     \G @code{BLK}, set @code{>IN} to 0 and interpret. When the parse      dup 0= -35 and throw
     \G area is exhausted, restore the input source specification.      block-input 0 new-tib dup loadline ! blk !  s" * a block*" loadfilename 2!
     block-input 0 new-tib dup loadline ! blk !  2 loadfilename# !  
     ['] interpret catch pop-file throw ;      ['] interpret catch pop-file throw ;
 [ELSE]  [ELSE]
 : (source)  ( -- c-addr u )  : (source)  ( -- c-addr u )
Line 238  Create block-input   A, A, A, A, A, Line 239  Create block-input   A, A, A, A, A,
 \G @i{c-addr} is the address of the input buffer and @i{u} is the  \G @i{c-addr} is the address of the input buffer and @i{u} is the
 \G number of characters in it.  \G number of characters in it.
   
 : load ( i*x n -- j*x ) \ block  : load ( i*x u -- j*x ) \ block
     \G Save the current input source specification. Store @i{n} in      \g Text-interpret block @i{u}.  Block 0 cannot be @code{load}ed.
     \G @code{BLK}, set @code{>IN} to 0 and interpret. When the parse      dup 0= -35 and throw
     \G area is exhausted, restore the input source specification.      s" * a block*" loadfilename>r
     loadfilename# @ >r  
     2 loadfilename# ! \ "*a block*"  
     push-file      push-file
     dup loadline ! blk ! >in off ['] interpret catch      dup loadline ! blk ! >in off ['] interpret catch
     pop-file      pop-file
     r> loadfilename# !      r>loadfilename
     throw ;      throw ;
 [THEN]  [THEN]
   
Line 290  Create block-input   A, A, A, A, A, Line 289  Create block-input   A, A, A, A, A,
 \     0= IF  block-included  ELSE  included  THEN ;  \     0= IF  block-included  ELSE  included  THEN ;
   
 get-current environment-wordlist set-current  get-current environment-wordlist set-current
 true constant block  true constant block \ environment- environment
 true constant block-ext  true constant block-ext
 set-current  set-current
   

Removed from v.1.38  
changed lines
  Added in v.1.62


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>