Code archives/File Utilities/Bank IO commands
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| These functions will allow you to treat a bank like any other stream.. such as a file. | |||||
;;//// BANK IO COMMANDS BY Jeff Frazier / Rifraf
;;;-------------Example---------------;;....................
; .
; .
;SeedRnd(MilliSecs())
;f%=Bank_Openfile()
;For i=1 To 5
; Bank_writeint(f%,Rand(1,32))
;Next
;bank_writestring(f%,"Hello there")
;For i=1 To 5
; Bank_writefloat(f%,Rnd(1,32))
;Next
;bank_writestring(f%,"Hello again")
;For i=1 To 5
; Bank_writebyte(f%,Rnd(1,32))
;Next
;bank_seekfile(f%,bank_filepos(f)-4)
;bank_writestring(f%,"Final hello ")
;
;;; write data to a file using normal file functions .
;
;m$="testme.dat"
;
;bank_dump(f,m$)
;
;;; cleanup the bank
;
;Bank_CLOSEFILE(f)
;
;;;---------------------------------------------------------
;F=OpenFile("TESTME.DAT")
;For I=1 To 5
; DebugLog ReadInt(f)
; Next
;DebugLog ReadString$(f)
;For I=1 To 5
; DebugLog ReadFloat(f)
; Next
;DebugLog ReadString$(f)
;For I=1 To 1
; DebugLog ReadByte(f)
; Next
;DebugLog ReadString$(f)
;While Not Eof(f)
;DebugLog ReadByte(f)
;Wend
;CloseFile f
;WaitKey
;End
Type Bankoffset
Field Name$
Field offset
Field bankid
End Type
Function BANK_OPENFILE(name$="Bank",sizeoverride=0)
bo.bankoffset=New bankoffset
If sizeoverride<>0 Then
bo\bankid=CreateBank(size)
Else
bo\bankid=CreateBank(1)
EndIf
bo\name$=name$
Return Handle(bo)
End Function
Function BANK_OPENFILE_exists(originalbank,name$="banker")
bo.bankoffset=New bankoffset
bo\bankid=originalbank
bo\name$=name$
Return Handle(bo)
End Function
Function BANK_CLOSEFILE(bid%)
Thisbank.bankoffset=Object.bankoffset(bid%)
FreeBank THISBANK\BANKID
Delete thisbank
End Function
Function Bank_EOF(bid%)
Thisbank.bankoffset=Object.bankoffset(bid%)
If thisbank\offset=>BankSize(bid%) Then Return True
Return False
End Function
Function Bank_SeekFile(bid%,offset)
Thisbank.bankoffset=Object.bankoffset(bid%)
thisbank\offset=offset
End Function
Function Bank_FILEPOS(bid%)
Thisbank.bankoffset=Object.bankoffset(bid%)
Return thisbank\offset
End Function
Function Bank_FILELEN(bid%)
Return BankSize(bid%)
End Function
;;;;;;;;;;;;;;;;;;;WRITE FUNCTIONS;;;;;;;;;;;;;;;;;;;;;;;;
Function Bank_Writeint(bid%,intdata%)
Thisbank.bankoffset=Object.bankoffset(bid%)
If thisbank.bankoffset=Null Then RuntimeError "I/O bank does not exist : Bank_WriteInt"
If thisbank\offset+4>(BankSize(thisbank\bankid)) Then
neededsize=4-((BankSize(thisbank\bankid))-thisbank\offset)
Bankresize(thisbank.bankoffset,neededsize)
EndIf
PokeInt(thisbank\bankid,thisbank\offset,intdata)
thisbank\offset=thisbank\offset+4
End Function
Function Bank_WriteFloat(bid%,floatData#)
Thisbank.bankoffset=Object.bankoffset(bid%)
If thisbank.bankoffset=Null Then RuntimeError "I/O bank does not exist : Bank_WriteFloat"
If thisbank\offset+4>(BankSize(thisbank\bankid)) Then
neededsize=4-((BankSize(thisbank\bankid))-thisbank\offset)
Bankresize(thisbank.bankoffset,neededsize)
EndIf
PokeFloat(thisbank\bankid,thisbank\offset,floatData#)
thisbank\offset=thisbank\offset+4
End Function
Function Bank_WriteBytes(bid%,bytebank)
Local s=BankSize (bytebank)
Local i
For i=1 To s
bank_writebyte(bid%,PeekFloat(bytebank,i))
Next
End Function
Function Bank_WriteByte(bid%,bytedata)
Thisbank.bankoffset=Object.bankoffset(bid%)
If thisbank.bankoffset=Null Then RuntimeError "I/O bank does not exist : Bank_WriteByte"
If thisbank\offset+1>(BankSize(thisbank\bankid)) Then
neededsize=1-((BankSize(thisbank\bankid))-thisbank\offset)
Bankresize(thisbank.bankoffset,neededsize)
EndIf
PokeByte(thisbank\bankid,thisbank\offset,byteData)
thisbank\offset=thisbank\offset+1
End Function
Function Bank_WriteString(bid%,stringdata$)
Thisbank.bankoffset=Object.bankoffset(bid%)
If thisbank.bankoffset=Null Then RuntimeError "I/O bank does not exist : Bank_WriteString"
Length=Len(Stringdata$)
Bank_Writeint(bid,length)
For I=1 To Length
bank_Writebyte(bid,Asc(Mid$(stringdata$,I,1)))
Next
End Function
Function Bank_WriteLine(bid%,stringdata$)
stringdata$=stringdata$+Chr$(13)+Chr$(10)
Thisbank.bankoffset=Object.bankoffset(bid%)
If thisbank.bankoffset=Null Then RuntimeError "I/O bank does not exist : Bank_WriteString"
Length=Len(Stringdata$)
;Bank_Writeint(thisbank\bankid,length)
For I=1 To Length
bank_Writebyte(bid,Asc(Mid$(stringdata$,I,1)))
Next
End Function
;;;;;;;;;;;;;;;;;;;READ FUNCTIONS;;;;;;;;;;;;;;;;;;;;;;;;
Function Bank_ReadInt(bid%)
Local THISV
Thisbank.bankoffset=Object.bankoffset(bid%)
If thisbank.bankoffset=Null Then RuntimeError "I/O bank does not exist : Bank_ReadInt"
If thisbank\offset+4>(BankSize(thisbank\bankid)) Then RuntimeError "Bank io read, past eof: Bank_ReadInt"
THISV = PeekInt(thisbank\bankid,thisbank\offset)
thisbank\offset=thisbank\offset+4
Return THISV
End Function
Function Bank_ReadFloat#(bid%)
Local THISV#
Thisbank.bankoffset=Object.bankoffset(bid%)
If thisbank.bankoffset=Null Then RuntimeError "I/O bank does not exist : Bank_Readfloat"
If thisbank\offset+4>(BankSize(thisbank\bankid)) Then RuntimeError "Bank io read, past eof: Bank_ReadFloat"
THISV#= PeekFloat(thisbank\bankid,thisbank\offset)
thisbank\offset=thisbank\offset+4
Return THISV#
End Function
;ank
Function Bank_ReadByte(bid%)
Local THISV
Thisbank.bankoffset=Object.bankoffset(bid%)
If thisbank.bankoffset=Null Then RuntimeError "I/O bank does not exist : Bank_ReadByte"
If thisbank\offset+1>(BankSize(thisbank\bankid)) Then RuntimeError "Bank io read, past eof: Bank_ReadByte"
THISV= PeekByte(thisbank\bankid,thisbank\offset)
thisbank\offset=thisbank\offset+1
Return THISV
End Function
Function Bank_ReadString$(bid%)
Local StringV$=""
Local THISV
THISV=Bank_ReadInt(bid%)
For I=1 To thisv
Stringv$=stringv$+Chr$(bank_readbyte(bid%))
Next
Return Stringv$
End Function
Function Bank_ReadLine$(bid%)
Local StringV$=""
Local THISV
While Not Bank_EOF(bid%)
Temp$=Chr$(bank_readbyte(bid%))
If temp$=Chr$(13) Then
bank_readbyte(bid%)
Return stringv$
EndIf
Stringv$=stringv$+temp$
Wend
Return Stringv$
End Function
;;;;;;;;;;;;;;;;;;;MISC;;;;;;;;;;;;;;;;;;;;;;;;
Function Findbank.bankoffset(b_id)
For bo.bankoffset=Each bankoffset
If bo\bankid=b_id Then Return bo.bankoffset
Next
Return Null
End Function
Function Findbankname.bankoffset(name$)
For bo.bankoffset=Each bankoffset
If bo\name$=name$ Then Return bo.bankoffset
Next
Return Null
End Function
; BankSize, ResizeBank, CopyBank Example
Function BankResize(bo.bankoffset,size)
This=BankSize(bo\bankid)
ResizeBank bo\bankid,(this+size)
End Function
Function BANK_DUMP(b_id,fn$)
Thisbank.bankoffset=Object.bankoffset(b_id)
If thisbank.bankoffset=Null Then RuntimeError "I/O bank does not exist : Bank_Dump"
sz=BankSize(thisbank\bankid)
f=WriteFile(fn$)
WriteBytes (thisbank\bankid,f,0,sz)
CloseFile f
End Function
Function BANK_DUMPbyID(b_id,fn$)
Thisbank.bankoffset=FINDBANK(b_id)
If thisbank.bankoffset=Null Then RuntimeError "I/O bank does not exist : Bank_Dump"
sz=BankSize(thisbank\bankid)
f=WriteFile(fn$)
WriteBytes (thisbank\bankid,f,0,sz)
CloseFile f
End Function
Function BANK_DUMPbyName(name$,fn$)
Thisbank.bankoffset=Findbankname(name$)
If thisbank.bankoffset=Null Then RuntimeError "I/O bank does not exist : Bank_Dump"
sz=BankSize(thisbank\bankid)
f=WriteFile(fn$)
WriteBytes (thisbank\bankid,f,0,sz)
CloseFile f
End Function |
Comments
| ||
Updated.. using object() and Handle() now instead of manually finding objects
;;//// BANK IO COMMANDS BY Jeff Frazier / Rifraf
;;;-------------Example---------------;;....................
; .
; .
;SeedRnd(MilliSecs())
;f%=Bank_Openfile()
;For i=1 To 5
; Bank_writeint(f%,Rand(1,32))
;Next
;bank_writestring(f%,"Hello there")
;For i=1 To 5
; Bank_writefloat(f%,Rnd(1,32))
;Next
;bank_writestring(f%,"Hello again")
;For i=1 To 5
; Bank_writebyte(f%,Rnd(1,32))
;Next
;bank_seekfile(f%,bank_filepos(f)-4)
;bank_writestring(f%,"Final hello ")
;
;;; write data to a file using normal file functions .
;
;m$="testme.dat"
;
;bank_dump(f,m$)
;
;;; cleanup the bank
;
;Bank_CLOSEFILE(f)
;
;;;---------------------------------------------------------
;F=OpenFile("TESTME.DAT")
;For I=1 To 5
; DebugLog ReadInt(f)
; Next
;DebugLog ReadString$(f)
;For I=1 To 5
; DebugLog ReadFloat(f)
; Next
;DebugLog ReadString$(f)
;For I=1 To 1
; DebugLog ReadByte(f)
; Next
;DebugLog ReadString$(f)
;While Not Eof(f)
;DebugLog ReadByte(f)
;Wend
;CloseFile f
;WaitKey
;End
Type Bankoffset
Field Name$
Field offset
Field bankid
End Type
Function BANK_OPENFILE(name$="Bank",sizeoverride=0)
bo.bankoffset=New bankoffset
If sizeoverride<>0 Then
bo\bankid=CreateBank(size)
Else
bo\bankid=CreateBank(1)
EndIf
bo\name$=name$
Return Handle(bo)
End Function
Function BANK_OPENFILE_exists(originalbank,name$="banker")
bo.bankoffset=New bankoffset
bo\bankid=originalbank
bo\name$=name$
Return Handle(bo)
End Function
Function BANK_CLOSEFILE(bid%)
Thisbank.bankoffset=Object.bankoffset(bid%)
FreeBank THISBANK\BANKID
Delete thisbank
End Function
Function Bank_EOF(bid%)
Thisbank.bankoffset=Object.bankoffset(bid%)
If thisbank\offset=>BankSize(bid%) Then Return True
Return False
End Function
Function Bank_SeekFile(bid%,offset)
Thisbank.bankoffset=Object.bankoffset(bid%)
thisbank\offset=offset
End Function
Function Bank_FILEPOS(bid%)
Thisbank.bankoffset=Object.bankoffset(bid%)
Return thisbank\offset
End Function
Function Bank_FILELEN(bid%)
Return BankSize(bid%)
End Function
;;;;;;;;;;;;;;;;;;;WRITE FUNCTIONS;;;;;;;;;;;;;;;;;;;;;;;;
Function Bank_Writeint(bid%,intdata%)
Thisbank.bankoffset=Object.bankoffset(bid%)
If thisbank.bankoffset=Null Then RuntimeError "I/O bank does not exist : Bank_WriteInt"
If thisbank\offset+4>(BankSize(thisbank\bankid)) Then
neededsize=4-((BankSize(thisbank\bankid))-thisbank\offset)
Bankresize(thisbank.bankoffset,neededsize)
EndIf
PokeInt(thisbank\bankid,thisbank\offset,intdata)
thisbank\offset=thisbank\offset+4
End Function
Function Bank_WriteFloat(bid%,floatData#)
Thisbank.bankoffset=Object.bankoffset(bid%)
If thisbank.bankoffset=Null Then RuntimeError "I/O bank does not exist : Bank_WriteFloat"
If thisbank\offset+4>(BankSize(thisbank\bankid)) Then
neededsize=4-((BankSize(thisbank\bankid))-thisbank\offset)
Bankresize(thisbank.bankoffset,neededsize)
EndIf
PokeFloat(thisbank\bankid,thisbank\offset,floatData#)
thisbank\offset=thisbank\offset+4
End Function
Function Bank_WriteBytes(bid%,bytebank)
Local s=BankSize (bytebank)
Local i
For i=1 To s
bank_writebyte(bid%,PeekFloat(bytebank,i))
Next
End Function
Function Bank_WriteByte(bid%,bytedata)
Thisbank.bankoffset=Object.bankoffset(bid%)
If thisbank.bankoffset=Null Then RuntimeError "I/O bank does not exist : Bank_WriteByte"
If thisbank\offset+1>(BankSize(thisbank\bankid)) Then
neededsize=1-((BankSize(thisbank\bankid))-thisbank\offset)
Bankresize(thisbank.bankoffset,neededsize)
EndIf
PokeByte(thisbank\bankid,thisbank\offset,byteData)
thisbank\offset=thisbank\offset+1
End Function
Function Bank_WriteString(bid%,stringdata$)
Thisbank.bankoffset=Object.bankoffset(bid%)
If thisbank.bankoffset=Null Then RuntimeError "I/O bank does not exist : Bank_WriteString"
Length=Len(Stringdata$)
Bank_Writeint(bid,length)
For I=1 To Length
bank_Writebyte(bid,Asc(Mid$(stringdata$,I,1)))
Next
End Function
Function Bank_WriteLine(bid%,stringdata$)
stringdata$=stringdata$+Chr$(13)+Chr$(10)
Thisbank.bankoffset=Object.bankoffset(bid%)
If thisbank.bankoffset=Null Then RuntimeError "I/O bank does not exist : Bank_WriteString"
Length=Len(Stringdata$)
;Bank_Writeint(thisbank\bankid,length)
For I=1 To Length
bank_Writebyte(bid,Asc(Mid$(stringdata$,I,1)))
Next
End Function
;;;;;;;;;;;;;;;;;;;READ FUNCTIONS;;;;;;;;;;;;;;;;;;;;;;;;
Function Bank_ReadInt(bid%)
Local THISV
Thisbank.bankoffset=Object.bankoffset(bid%)
If thisbank.bankoffset=Null Then RuntimeError "I/O bank does not exist : Bank_ReadInt"
If thisbank\offset+4>(BankSize(thisbank\bankid)) Then RuntimeError "Bank io read, past eof: Bank_ReadInt"
THISV = PeekInt(thisbank\bankid,thisbank\offset)
thisbank\offset=thisbank\offset+4
Return THISV
End Function
Function Bank_ReadFloat#(bid%)
Local THISV#
Thisbank.bankoffset=Object.bankoffset(bid%)
If thisbank.bankoffset=Null Then RuntimeError "I/O bank does not exist : Bank_Readfloat"
If thisbank\offset+4>(BankSize(thisbank\bankid)) Then RuntimeError "Bank io read, past eof: Bank_ReadFloat"
THISV#= PeekFloat(thisbank\bankid,thisbank\offset)
thisbank\offset=thisbank\offset+4
Return THISV#
End Function
;ank
Function Bank_ReadByte(bid%)
Local THISV
Thisbank.bankoffset=Object.bankoffset(bid%)
If thisbank.bankoffset=Null Then RuntimeError "I/O bank does not exist : Bank_ReadByte"
If thisbank\offset+1>(BankSize(thisbank\bankid)) Then RuntimeError "Bank io read, past eof: Bank_ReadByte"
THISV= PeekByte(thisbank\bankid,thisbank\offset)
thisbank\offset=thisbank\offset+1
Return THISV
End Function
Function Bank_ReadString$(bid%)
Local StringV$=""
Local THISV
THISV=Bank_ReadInt(bid%)
For I=1 To thisv
Stringv$=stringv$+Chr$(bank_readbyte(bid%))
Next
Return Stringv$
End Function
Function Bank_ReadLine$(bid%)
Local StringV$=""
Local THISV
While Not Bank_EOF(bid%)
Temp$=Chr$(bank_readbyte(bid%))
If temp$=Chr$(13) Then
bank_readbyte(bid%)
Return stringv$
EndIf
Stringv$=stringv$+temp$
Wend
Return Stringv$
End Function
;;;;;;;;;;;;;;;;;;;MISC;;;;;;;;;;;;;;;;;;;;;;;;
Function Findbank.bankoffset(b_id)
For bo.bankoffset=Each bankoffset
If bo\bankid=b_id Then Return bo.bankoffset
Next
Return Null
End Function
Function Findbankname.bankoffset(name$)
For bo.bankoffset=Each bankoffset
If bo\name$=name$ Then Return bo.bankoffset
Next
Return Null
End Function
; BankSize, ResizeBank, CopyBank Example
Function BankResize(bo.bankoffset,size)
This=BankSize(bo\bankid)
ResizeBank bo\bankid,(this+size)
End Function
Function BANK_DUMP(b_id,fn$)
Thisbank.bankoffset=Object.bankoffset(b_id)
If thisbank.bankoffset=Null Then RuntimeError "I/O bank does not exist : Bank_Dump"
sz=BankSize(thisbank\bankid)
f=WriteFile(fn$)
WriteBytes (thisbank\bankid,f,0,sz)
CloseFile f
End Function
Function BANK_DUMPbyID(b_id,fn$)
Thisbank.bankoffset=FINDBANK(b_id)
If thisbank.bankoffset=Null Then RuntimeError "I/O bank does not exist : Bank_Dump"
sz=BankSize(thisbank\bankid)
f=WriteFile(fn$)
WriteBytes (thisbank\bankid,f,0,sz)
CloseFile f
End Function
Function BANK_DUMPbyName(name$,fn$)
Thisbank.bankoffset=Findbankname(name$)
If thisbank.bankoffset=Null Then RuntimeError "I/O bank does not exist : Bank_Dump"
sz=BankSize(thisbank\bankid)
f=WriteFile(fn$)
WriteBytes (thisbank\bankid,f,0,sz)
CloseFile f
End Function
Updated.. using object() and Handle() now instead of manually finding objects |
| ||
| This is a nice library. Good stuff. However, I find myself wondering... why do the functions all use integer IDs at all? Wouldn't it just be faster to pass the This pointer directly? |
| ||
| probably would be faster, I just tossed the handle / object in this morning and reposted.. ill edit it again later I like the integer id though, my simple brain likes to see smaller IDs |
Code Archives Forum