Code archives/File Utilities/Bank IO commands

This code has been declared by its author to be Public Domain code.

Download source code

Bank IO commands by RifRaf
(Posted 18 years ago)
These functions were made to export models directly to memory, so they could be encypted BEFORE ever going to hard disk. the calls work exactly like those of normal file operations the new bank will dynamically scale to fit whatever data is written to it
;;//// BANK IO COMMANDS BY Jeff Frazier / Rifraf
;;//// These functions were made to export models directly to memory, so
;;//// they could be encypted BEFORE ever going to hard disk. 
;;//// the calls work exactly like those of normal file operations
;;//// the new bank will dynamically scale to fit whatever data is 
;;//// written to it

;;;-------------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


;bank file system
Type Bankoffset
 Field offset
 Field bankid
 End Type

Function BANK_OPENFILE()
 bo.bankoffset=New bankoffset
 bo\bankid=CreateBank(1)
 Return bo\bankid 
End Function 

Function BANK_CLOSEFILE(bank)
Thisbank.bankoffset=Findbank(bank)
FreeBank THISBANK\BANKID
Delete thisbank
End Function 

Function Bank_EOF(bank)
Thisbank.bankoffset=Findbank(bank)
If thisbank\offset=>BankSize(bank) Then Return True
Return False
End Function  

Function Bank_SeekFile(bank,offset)
Thisbank.bankoffset=Findbank(bank)
thisbank\offset=offset
End Function 

Function Bank_FILEPOS(bank)
Thisbank.bankoffset=Findbank(bank)
Return thisbank\offset
End Function 
;;;;;;;;;;;;;;;;;;;WRITE FUNCTIONS;;;;;;;;;;;;;;;;;;;;;;;;

Function Bank_Writeint(bank,intdata)
Thisbank.bankoffset=Findbank(bank)
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(bank,floatData#)
Thisbank.bankoffset=Findbank(bank)
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_WriteByte(bank,bytedata)
Thisbank.bankoffset=Findbank(bank)
If thisbank\offset+1>(BankSize(thisbank\bankid)) Then 
   neededsize=1-((BankSize(thisbank\bankid))-thisbank\offset)
   Bankresize(thisbank.bankoffset,neededsize)
EndIf
Thisbank.bankoffset=Findbank(bank)
If thisbank.bankoffset=Null Then RuntimeError "I/O bank does not exist : Bank_WriteByte"
PokeByte(thisbank\bankid,thisbank\offset,byteData)
thisbank\offset=thisbank\offset+1
End Function 

Function Bank_WriteString(bank,stringdata$)
Thisbank.bankoffset=Findbank(bank)
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(thisbank\bankid,Asc(Mid$(stringdata$,I,1)))
Next
End Function 

;;;;;;;;;;;;;;;;;;;READ FUNCTIONS;;;;;;;;;;;;;;;;;;;;;;;;

Function Bank_ReadInt(bank)
Local THISV
Thisbank.bankoffset=Findbank(bank)
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#(bank)
Local THISV#
Thisbank.bankoffset=Findbank(bank)
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 

Function Bank_ReadByte(bank)
Local THISV
Thisbank.bankoffset=Findbank(bank)
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$(bank)
Local StringV$=""
Local THISV
THISV=Bank_ReadInt(bank)
For I=1 To thisv
	Stringv$=stringv$+Chr$(bank_readbyte(bank))
Next
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 

; 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=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