- oof VirtFile, MemFile, DiskFile

From: ForthCAD <mail_at_forthcad.com>
Date: Mon, 25 Jan 1999 19:21:55 -0000

\ ------------------------------------------------
\ Virtual class file example - not full tested ! -
\ ------------------------------------------------

Class Var

Public
    variable ADDR

    : @ ( -- v ) ADDR COMMON @ ;
    : ! ( v -- ) ADDR COMMON ! ;
    : ? ( -- ) ADDR COMMON ? ;

    : Clear ( -- ) 0 ! ;

    : +! ( v -- ) ADDR COMMON +! ;
    : 1+! ( -- ) @ +! ;

    : NEGATE ( -- ) @ COMMON NEGATE ! ;
End

\ ----------------------

Class VirtFile

Private
    variable _temp
    : _pure-virt ( -- ) TRUE abort" pure virtual" ;

Public
    VIRTUAL: Open ( caddr u fam -- bOK ) _pure-virt ;
    VIRTUAL: Create ( caddr u fam -- bOK ) _pure-virt ;
    VIRTUAL: Close ( -- bOK ) _pure-virt ;
    VIRTUAL: Seek ( ud -- bOK ) _pure-virt ;
    VIRTUAL: Read ( addr count -- u2 bOK ) _pure-virt ;
    VIRTUAL: Write ( addr count -- bOK ) _pure-virt ;
    VIRTUAL: GetSize ( -- len ) _pure-virt ;
    VIRTUAL: Tell ( -- pos ) _pure-virt ;

Public
    : WriteCell ( i -- bOK ) _temp ! _temp 1 cells Write ;
    : WriteChar ( c -- bOK ) _temp c! _temp 1 chars Write ;

    : ReadCell ( -- i bOK ) _temp 1 cells Read nip _temp @ swap ;
    : ReadChar ( -- c bOK ) _temp 1 chars Read nip _temp C@ swap ;
End

\ ----------------------

VirtFile SubClass MemFile

Private
    Var build _mem
    Var build _pos
    Var build _size
    Var build _maxsize
    8 cells constant _BLOCSIZE

Public
    VIRTUAL: Create ( caddr u fam -- bOK )
        rot 2drop
        R/W <> IF FALSE EXIT THEN
        _BLOCSIZE allocate 0= dup
        IF
           swap _mem !
           _BLOCSIZE _maxsize !
           _size Clear _pos Clear
        THEN ;

    VIRTUAL: Open ( caddr u fam -- bOK )
        abort" cannot open a MemFile - use Create" ;

    VIRTUAL: Close ( -- bOK )
        _mem @ free 0= ;

    VIRTUAL: Seek ( ud -- bOK )
        dup 0<
        IF
            _size @ 1- swap -
            dup 0< IF drop FALSE EXIT THEN
        ELSE
            dup _size @ >= IF drop FALSE EXIT THEN
        THEN
        _pos ! TRUE ;

    VIRTUAL: Read ( addr count -- u2 bOK )
        _pos @ over + _size @ >
        IF
            drop _size @ _pos @ -
        THEN
        swap over \ S: count addr count
        _mem @ _pos @ + \ S: count addr count ptr
        -rot move \ S: count
        dup _pos +! TRUE ;

    VIRTUAL: Write ( addr count -- bOK )
        _pos @ over + \ S: addr count endpos
        dup _maxsize @ >= \ S: addr count endpos notok?
        IF
            _BLOCSIZE / 1+ _BLOCSIZE *
            dup _mem @ resize 0= \ S: addr count max ptr ok?
            IF \ S: addr count max ptr
                _mem ! _maxsize ! \ S: addr count
            ELSE
                2drop 2drop
                FALSE EXIT
            THEN \ S: addr count
        ELSE
            drop
        THEN \ S: addr count
        _mem @ _pos @ + \ S: addr count ptrstart
        swap \ S: addr ptrstart count
        dup _pos +! move \ S: -
        _pos @ _size @ >
        IF _pos @ _size ! THEN
        TRUE ;

    VIRTUAL: GetSize ( -- len ) _size @ ;

    VIRTUAL: Tell ( -- pos ) _pos @ ;
End

\ ----------------------

VirtFile SubClass DiskFile

Public
    Var build fileid

    VIRTUAL: Open ( caddr u fam -- bOK )
        OPEN-FILE 0= dup
        IF swap fileid ! ELSE nip THEN ;

    VIRTUAL: Create ( caddr u fam -- bOK )
        CREATE-FILE 0= dup
        IF swap fileid ! ELSE nip THEN ;

    VIRTUAL: Close ( -- bOK )
        fileid @ CLOSE-FILE 0= ;

    VIRTUAL: Seek ( ud -- bOK )
        fileid @ REPOSITION-FILE 0= ;

    VIRTUAL: Read ( addr count -- u2 bOK )
        fileid @ READ-FILE 0= ;

    VIRTUAL: Write ( addr count -- bOK )
        fileid @ WRITE-FILE 0= ;

    VIRTUAL: GetSize ( -- len )
        fileid @ FILE-SIZE IF drop 0 THEN ;

    VIRTUAL: Tell ( -- pos )
        fileid @ FILE-POSITION IF drop 0 THEN ;
End

{
cr
..( File test - 1 2 3 if OK )
cr
\ MemFile build m
DiskFile build m
S" \TEST.TTT" R/W m Create drop

0 m seek
1 m WriteCell drop
2 m WriteCell drop
3 m WriteCell drop

0 m Seek
m ReadCell drop .
m ReadCell drop .
m ReadCell drop .
m Close
}

.
Received on Mon Jan 25 1999 - 19:21:55 PST


Subscribe to our e-mail list service. It's free for all SwiftForth and SwiftX users!

This archive was generated 08-Feb-2012. Archive updated nightly.