Code archives/Miscellaneous/Data Bank System

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

Download source code

Data Bank System by Ken Lynch2003
A set of functions to allow you to use banks more like a collection of variables.

[edit]
I've improved the code to work with strings and there are some code optimisations.

Strings are fixed in length once defined, so make sure you reserve enough space.

Default string size is 255 characters.
[/edit]

[edit]
Another restructure of the code removes the need for the CreateDataBank command, now just uses CreateBank
[/edit]

[edit]
Added LoadBank and SaveBank functions - I think it's complete now. Enjoy ;-)
[/edit]

[edit]
Major speed increase, now uses a binary search algorithm.
[/edit]
;=================================================
;
; DataBank library
;
; (c)2003 Ken Lynch
;
;=================================================

;=================================================
;
; Global variables (NB: Do not use)
;
;=================================================

Global db_field_index
Global db_field_name$
Global db_data_offset

;=================================================
;
; Peek and poke string functions
;
;=================================================

;
; PokeString bank,offset,value$
;
Function PokeString(bank, offset, value$)
	For i = 1 To Len(value$)
		a = Asc(Mid(value$, i, 1))
		PokeByte bank, offset + i - 1, a
	Next
	PokeByte bank, offset + i - 1, 0
End Function

;
; PeekString bank,offset
;
Function PeekString$(bank, offset)
	a = PeekByte(bank, offset)
	While a <> 0
		s$ = s$ + Chr(a)
		i = i + 1
		a = PeekByte(bank, offset + i)
	Wend
	Return s$
End Function

;=================================================
;
; Internal functions (NB: Do not use)
;
;=================================================

;
; LocateField(bank,name$)
;
Function LocateField(bank, name$)
	If BankSize(bank) > 0 Then
		field_count = PeekInt(bank, 0)
		If field_count > 0
			low = 0
			high = field_count
			old_middle = -1
			Repeat
				middle = low + (high - low) / 2
				If middle = old_middle Then
					If name$ > db_field_name$ Then middle = middle + 1
					db_field_index = middle
					db_data_offset = -1
					Return
				End If
				db_field_name$ = PeekString(bank, middle * 64 + 4)
				If name$ < db_field_name$ Then high = middle
				If name$ > db_field_name$ Then low = middle
				If name$ = db_field_name$ Then
					db_field_index = middle
					db_data_offset = (field_count * 64 + 4) + PeekInt(bank, db_field_index * 64 + 4 + 60)
					Return
				End If
				old_middle = middle
			Forever
		End If
	End If
	db_field_index = 0
	db_field_name$ = ""
	db_data_offset = -1
End Function

;
; AllocateField bank,name$,size
;
Function AllocateField(bank, name$, size)
	If BankSize(bank) = 0 Then
		ResizeBank(bank, 4)
		PokeInt bank, 0, 0
	End If
	
	name$ = Left(name$, 59)

	field_count = PeekInt(bank, 0)
	old_bank_size = BankSize(bank)
	new_bank_size = old_bank_size + 64 + size
	header_size = (field_count * 64) + 4
	data_size = old_bank_size - header_size
	insert_pos = db_field_index
	copy_offset = header_size - (field_count - insert_pos) * 64
	copy_size = data_size + (field_count - insert_pos) * 64

	ResizeBank bank, new_bank_size
	
	CopyBank bank, copy_offset, bank, copy_offset + 64, copy_size

	PokeString bank, copy_offset, name$
	offset = new_bank_size - size - header_size - 64
	PokeInt bank, copy_offset + 60, offset
	
	PokeInt bank, 0, field_count + 1
		
	db_data_offset = new_bank_size - size
End Function

;=================================================
;
; Set Field functions
;
;=================================================

;
; SetByteField bank,name$,value
;
Function SetByteField(bank, name$, value)
	LocateField(bank, name$)
	If db_data_offset = -1 Then AllocateField(bank, name$, 1)
	PokeByte bank, db_data_offset, value
End Function

;
; SetShortField bank,name$,value
;
Function SetShortField(bank, name$, value)
	LocateField(bank, name$)
	If db_data_offset = -1 Then AllocateField(bank, name$, 2)
	PokeShort bank, db_data_offset, value
End Function

;
; SetIntField bank,name$,value
;
Function SetIntField(bank, name$, value)
	LocateField(bank, name$)
	If db_data_offset = -1 Then AllocateField(bank, name$, 4)
	PokeInt bank, db_data_offset, value
End Function

;
; SetFloatField bank,name$,value#
;
Function SetFloatField(bank, name$, value#)
	LocateField(bank, name$)
	If db_data_offset = -1 Then AllocateField(bank, name$, 4)
	PokeFloat bank, db_data_offset, value#
End Function

;
; SetStringField bank,name$,value$[,size]
;
Function SetStringField(bank, name$, value$, size=255)
	LocateField(bank, name$)
	If db_data_offset = -1 Then AllocateField(bank, name$, size + 1)
	PokeString bank, db_data_offset, Left(value$, size)
End Function

;=================================================
;
; Get Field functions
;
;=================================================

;
; GetByteField(bank,name$)
;
Function GetByteField(bank, name$)
	LocateField(bank, name$)
	If db_data_offset = -1 Then Return 0
	Return PeekByte(bank, db_data_offset)
End Function

;
; GetShortField(bank,name$)
;
Function GetShortField(bank, name$)
	LocateField(bank, name$)
	If db_data_offset = -1 Then Return 0
	Return PeekShort(bank, db_data_offset)
End Function

;
; GetIntField(bank,name$)
;
Function GetIntField(bank, name$)
	LocateField(bank, name$)
	If db_data_offset = -1 Then Return 0
	Return PeekInt(bank, db_data_offset)
End Function

;
; GetFloatField#(bank,name$)
;
Function GetFloatField#(bank, name$)
	LocateField(bank, name$)
	If db_data_offset = -1 Then Return 0
	Return PeekFloat(bank, db_data_offset)
End Function

;
; GetStringField$(bank,name$)
;
Function GetStringField$(bank, name$)
	LocateField(bank, name$)
	If db_data_offset = -1 Then Return ""
	Return PeekString(bank, db_data_offset)
End Function

;=================================================
;
; Load/save functions
;
;=================================================

;
; SaveBank bank,file_name$
;
Function SaveBank(bank, file_name$)
	file = WriteFile(file_name$)
	WriteBytes bank, file, 0, BankSize(bank)
	CloseFile file
End Function

;
; LoadBank(file$,bank)
;
Function LoadBank(file_name$)
	bank = CreateBank(FileSize(file_name$))
	file = ReadFile(file_name$)
	ReadBytes bank, file, 0, BankSize(bank)
	CloseFile file
	Return bank
End Function

;=================================================
;
; DataBank system test code
;
; (c)2003 Ken Lynch
;
;=================================================

db = CreateBank()

SetIntField db, "Field1", 125
SetIntField db, "Field2", 45
SetIntField db, "Field3", 72
SetFloatField db, "Field4", 12.324
SetFloatField db, "Field5", 1.43
SetFloatField db, "Field6", 9.34
SetStringField db, "String1", "Hello World!"

Print GetIntField(db, "Field1")
Print GetIntField(db, "Field2")
Print GetIntField(db, "Field3")
Print GetFloatField(db, "Field4")
Print GetFloatField(db, "Field5")
Print GetFloatField(db, "Field6")
Print GetStringField(db, "String1")

Comments

None.

Code Archives Forum