Diff for /gforth/blocks.fs between versions 1.24 and 1.32

version 1.24, 1999/04/16 22:19:50 version 1.32, 2000/09/23 15:05:58
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 Free Software Foundation, Inc.  \ Copyright (C) 1995,1996,1997,1998,2000 Free Software Foundation, Inc.
   
 \ This file is part of Gforth.  \ This file is part of Gforth.
   
Line 45  Variable last-block Line 45  Variable last-block
 $20 Value buffers  $20 Value buffers
   
 User block-fid  User block-fid
   User block-offset ( -- addr ) \ gforth
   \G User variable containing the number of the first block (default
   \G since 0.5.0: 0).  Block files created with Gforth versions before
   \G 0.5.0 have the offset 1.  If you use these files you can: @code{1
   \G offset !}; or add 1 to every block number used; or prepend 1024
   \G characters to the file.
   0 block-offset !  \ store 1 here fore 0.4.0 compatibility
   
   ' block-offset alias offset \ !! eliminate this?
   
 : block-cold ( -- )  : block-cold ( -- )
     block-fid off  last-block off      block-fid off  last-block off
Line 87  Defer flush-blocks ( -- ) \ gforth Line 96  Defer flush-blocks ( -- ) \ gforth
   
 : block-position ( u -- ) \ block  : block-position ( u -- ) \ block
     \G Position the block file to the start of block @i{u}.      \G Position the block file to the start of block @i{u}.
     1- chars/block chars um* get-block-fid reposition-file throw ;      offset @ - chars/block chars um* get-block-fid reposition-file throw ;
   
 : update ( -- ) \ block  : update ( -- ) \ block
     \G Mark the current block buffer as dirty.      \G Mark the state of the current block buffer as assigned-dirty.
     last-block @ ?dup IF  buffer-dirty on  THEN ;      last-block @ ?dup IF  buffer-dirty on  THEN ;
   
 : save-buffer ( buffer -- ) \ gforth  : save-buffer ( buffer -- ) \ gforth
Line 108  Defer flush-blocks ( -- ) \ gforth Line 117  Defer flush-blocks ( -- ) \ gforth
   
 : 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
     \G mass storage, then mark all block buffers as unassigned.      \G mass storage, then mark all block buffers as assigned-clean.
     block-buffers @      block-buffers @
     buffers 0 ?DO dup save-buffer next-buffer LOOP drop ;      buffers 0 ?DO dup save-buffer next-buffer LOOP drop ;
   
Line 127  Defer flush-blocks ( -- ) \ gforth Line 136  Defer flush-blocks ( -- ) \ gforth
   
 ' flush IS flush-blocks  ' flush IS flush-blocks
   
 : get-buffer ( n -- a-addr ) \ gforth  : get-buffer ( u -- a-addr ) \ gforth
     buffers mod buffer-struct %size * block-buffers @ + ;      0 buffers um/mod drop buffer-struct %size * block-buffers @ + ;
   
 : block ( u -- a-addr ) \ block- block  : block ( u -- a-addr ) \ gforthman- 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
     \G @code{update}d, transfer the contents to mass storage), read      \G @code{update}d, transfer the contents to mass storage), read
     \G the block into the block buffer and return its start address,      \G the block into the block buffer and return its start address,
     \G @i{a-addr}.      \G @i{a-addr}.
     dup 0= -35 and throw      dup offset @ u< -35 and throw
     dup get-buffer >r      dup get-buffer >r
     dup r@ buffer-block @ <>      dup r@ buffer-block @ <>
     r@ buffer-fid @ block-fid @ <> or      r@ buffer-fid @ block-fid @ <> or
Line 167  Defer flush-blocks ( -- ) \ gforth Line 176  Defer flush-blocks ( -- ) \ gforth
     \ reading in the block is unnecessary, but simpler      \ reading in the block is unnecessary, but simpler
     block ;      block ;
   
 User scr ( -- a-addr ) \ block-ext  User scr ( -- a-addr ) \ block-ext s-c-r
     \G USER VARIABLE: @i{a-addr} is the address of a cell containing      \G @code{User} variable -- @i{a-addr} is the address of a cell 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 !
   
 \ nac31Mar1999 moved "scr @" to list to make the stack comment correct  \ nac31Mar1999 moved "scr @" to list to make the stack comment correct
 : updated?  ( n -- f ) \ gforth  : updated?  ( n -- f ) \ gforth
     \G Return true if block @i{n} has been marked as dirty.      \G Return true if @code{updated} has been used to mark block @i{n}
       \G as assigned-dirty.
     buffer      buffer
     [ 0 buffer-dirty 0 block-buffer - ] Literal + @ ;      [ 0 buffer-dirty 0 block-buffer - ] Literal + @ ;
   
Line 206  User scr ( -- a-addr ) \ block-ext Line 216  User scr ( -- a-addr ) \ block-ext
     \G Save the current input source specification. Store @i{n} in      \G Save the current input source specification. Store @i{n} in
     \G @code{BLK}, set @code{>IN} to 0 and interpret. When the parse      \G @code{BLK}, set @code{>IN} to 0 and interpret. When the parse
     \G area is exhausted, restore the input source specification.      \G area is exhausted, restore the input source specification.
       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 throw ;      pop-file
       r> loadfilename# !
       throw ;
   
 : thru ( i*x n1 n2 -- j*x ) \ block-ext  : thru ( i*x n1 n2 -- j*x ) \ block-ext
     \G @code{load} the blocks @i{n1} through @i{n2} in sequence.      \G @code{load} the blocks @i{n1} through @i{n2} in sequence.
Line 224  User scr ( -- a-addr ) \ block-ext Line 238  User scr ( -- a-addr ) \ block-ext
     \G current block + @i{n1} thru the current block + @i{n2}.      \G current block + @i{n1} thru the current block + @i{n2}.
     1+ swap ?DO  I +load  LOOP ;      1+ swap ?DO  I +load  LOOP ;
   
 : --> ( -- ) \ block- block chain  : --> ( -- ) \ gforthman- gforth chain
     \G If this symbol is encountered whilst loading block @i{n},      \G If this symbol is encountered whilst loading block @i{n},
     \G discard the remainder of the block and load block @i{n+1}. Used      \G discard the remainder of the block and load block @i{n+1}. Used
     \G for chaining multiple blocks together as a single loadable unit.      \G for chaining multiple blocks together as a single loadable
       \G unit.  Not recommended, because it destroys the independence of
       \G loading.  Use @code{thru} (which is standard) or @code{+thru}
       \G instead.
     refill drop ; immediate      refill drop ; immediate
   
 : block-included ( a-addr u -- ) \ gforth  : block-included ( a-addr u -- ) \ gforth

Removed from v.1.24  
changed lines
  Added in v.1.32


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