comments
Uses: FileMap2.inc, FileMemMang2.inc, FLLList1.inc, FStr16.inc
String/String ~ Key/Value ~ file-based List
Unlimited string length.
Uses the Long List to store string handles.
get and test 10,000 Key/Value strings 0.047 seconds
traverse 10,000 items = 0.0 seconds
Uses: FileMap2.inc, FileMemMang2.inc, FLLList1.inc, FStr16.inc
String/String ~ Key/Value ~ file-based List
Unlimited string length.
Uses the Long List to store string handles.
get and test 10,000 Key/Value strings 0.047 seconds
traverse 10,000 items = 0.0 seconds
Code:
'pb 5/9 'FSSList1.inc ' ' File Based: String/String ~ Key/Value ~ List ' ' unlimited string length - nulls OK ' ' add 10,000 Key/Value strings = 0.18 seconds ' get and test 10,000 Key/Value strings 0.047 seconds ' ' traverse 10,000 items = 0.0 seconds ' add 10,000 Key/Value strings after file expanded = 0.08 seconds ' ' #Include Once "C:\PB9\FileMapping\FileMap2.inc" #Include Once "C:\PB9\FileMapping\FileMemMang2.inc" #Include Once "C:\PB9\FileMapping\FStr16.inc" #Include Once "C:\PB9\FileMapping\FLLList1.inc" ' ' $FSSList_Err_FileNotOpen = "FSSList: file not open" $FSSList_Err_NullHandle = "FSSList: null handle" $FSSList_Err_NullPointer = "FSSList: null pointer" ' Macro FSSList_ExitFalse(test, procedure, msg) If test Then Else #Debug Print FuncName$ +": "+ msg t.isErr = %TRUE t.errMsg = msg Exit procedure End If End Macro Macro FSSList_ExitTrue(test, procedure, msg) If test Then #Debug Print FuncName$ +": "+ msg t.isErr = %TRUE t.errMsg = msg Exit procedure End If End Macro Macro FSSList_GoFalse(test, MARKER, msg) If test Then Else #Debug Print FuncName$ +": "+ msg t.isErr = %TRUE t.errMsg = msg GoTo MARKER End If End Macro Macro FSSList_GoTrue(test, MARKER, msg) If test Then #Debug Print FuncName$ +": "+ msg t.isErr = %TRUE t.errMsg = msg GoTo MARKER End If End Macro ' ' ' Type FSSListT list As FLLListT str As FStr16T isOpen As Long isErr As Long errMsg As Asciiz * 256 End Type ' ' ' Function FSSList_Create(t As FSSListT, ByVal file As String) As Long 'create new file - open for use - True/False success t.isErr = %FALSE t.isOpen = %FALSE FSSList_ExitFalse(FLLList_Create(t.list, file), Function, t.list.errMsg) If t.str.pMem = %NULL Then t.str.pMem = VarPtr(t.list.mem) t.isOpen = %TRUE Function = %TRUE End Function ' Function FSSList_Open(t As FSSListT, ByVal file As String) As Long 'open existing file - True/False success t.isErr = %FALSE t.isOpen = %FALSE FSSList_ExitFalse(FLLList_Open(t.list, file), Function, t.list.errMsg) If t.str.pMem = %NULL Then t.str.pMem = VarPtr(t.list.mem) t.isOpen = %TRUE Function = %TRUE End Function ' Sub FSSList_Close(t As FSSListT) 'close file t.isErr = %FALSE FSSList_ExitFalse(t.isOpen, Sub, $FSSList_Err_FileNotOpen) FLLList_Close t.list t.isOpen = %FALSE FSSList_ExitTrue(t.list.isErr, Sub, t.list.errMsg) End Sub ' Sub FSSList_Clear(t As FSSListT) 'delete all data - shrink file t.isErr = %FALSE FSSList_ExitFalse(t.isOpen, Sub, $FSSList_Err_FileNotOpen) FLLList_Clear t.list FSSList_ExitTrue(t.list.isErr, Sub, t.list.errMsg) End Sub ' Function FSSList_Count(t As FSSListT) As Long 'get stack count t.isErr = %FALSE FLLList_ExitFalse(t.isOpen, Function, $FSSList_Err_FileNotOpen) Function = t.list.hdr.count End Function ' Function FSSList_Add(t As FSSListT, ByRef key As String, ByRef value As String) As Long 'append Key/Value to end of list 'return node handle - False if fail Local hNode As Long ' t.isErr = %FALSE FSSList_ExitFalse(t.isOpen, Function, $FSSList_Err_FileNotOpen) hNode = FLLList_Add(t.list, %NULL, %NULL) FSSList_ExitFalse(hNode, Function, t.list.errMsg) FLLList_SetKeyAt t.list, hNode, FStr16_Put(t.str, key) FLLList_SetValueAt t.list, hNode, FStr16_Put(t.str, value) Function = hNode End Function ' Function FSSList_Insert(t As FSSListT, ByRef key As String, ByRef value As String) As Long 'insert Key/Value in front of list 'return node handle - False if fail Local hNode As Long ' t.isErr = %FALSE FSSList_ExitFalse(t.isOpen, Function, $FSSList_Err_FileNotOpen) hNode = FLLList_Insert(t.list, %NULL, %NULL) FSSList_ExitFalse(hNode, Function, t.list.errMsg) FLLList_SetKeyAt t.list, hNode, FStr16_Put(t.str, key) FLLList_SetValueAt t.list, hNode, FStr16_Put(t.str, value) Function = hNode End Function ' Function FSSList_InsertAt(t As FSSListT, ByVal hNode As Long, ByRef key As String, ByRef value As String) As Long 'insert Key/Value before hNode 'return node handle - False if fail Local hNew As Long ' t.isErr = %FALSE FSSList_ExitFalse(t.isOpen, Function, $FSSList_Err_FileNotOpen) hNew = FLLList_InsertAt(t.list, hNode, %NULL, %NULL) FSSList_ExitFalse(hNew, Function, t.list.errMsg) FLLList_SetKeyAt t.list, hNew, FStr16_Put(t.str, key) FLLList_SetValueAt t.list, hNew, FStr16_Put(t.str, value) Function = hNew End Function ' Sub FSSList_DeleteAt(t As FSSListT, ByVal hNode As Long) 'remove node from list Local hKey, hValue As Long ' t.isErr = %FALSE FSSList_ExitFalse(t.isOpen, Sub, $FSSList_Err_FileNotOpen) FSSList_ExitFalse(hNode, Sub, $FSSList_Err_NullHandle) hKey = FLLList_GetKeyAt(t.list, hNode) hValue = FLLList_GetValueAt(t.list, hNode) If hKey Then FStr16_Remove(t.str, hKey) If hValue Then FStr16_Remove(t.str, hValue) FLLList_DeleteAt t.list, hNode FSSList_ExitTrue(t.list.isErr, Sub, t.list.errMsg) End Sub ' Function FSSList_First(t As FSSListT) As Long 'move to first node in list - return node handle - False if fail t.isErr = %FALSE FSSList_ExitFalse(t.isOpen, Function, $FSSList_Err_FileNotOpen) Function = t.list.hdr.hFirst End Function ' Function FSSList_Last(t As FSSListT) As Long 'move to last node in list - return node handle - False if fail t.isErr = %FALSE FSSList_ExitFalse(t.isOpen, Function, $FSSList_Err_FileNotOpen) Function = t.list.hdr.hLast End Function ' Function FSSList_Right(t As FSSListT, ByVal hNode As Long) As Long 'move right from current node - return node handle - False if fail t.isErr = %FALSE FSSList_ExitFalse(t.isOpen, Function, $FSSList_Err_FileNotOpen) If hNode Then Function = FLLList_Node_GetRight(t.list, hNode) End Function ' Function FSSList_Left(t As FSSListT, ByVal hNode As Long) As Long 'move left from current node - return node handle - False if fail t.isErr = %FALSE FSSList_ExitFalse(t.isOpen, Function, $FSSList_Err_FileNotOpen) If hNode Then Function = FLLList_Node_GetLeft(t.list, hNode) End Function ' Sub FSSList_SetKeyAt(t As FSSListT, ByVal hNode As Long, ByRef key As String) 'change Key at current position t.isErr = %FALSE FSSList_ExitFalse(t.isOpen, Sub, $FSSList_Err_FileNotOpen) FSSList_ExitFalse(hNode, Sub, $FSSList_Err_NullHandle) Local pNode As FLLListNodeT Ptr pNode = FMem_Get(t.list.mem, hNode) : FSSList_ExitFalse(pNode, Sub, $FSSList_Err_NullPointer) If @pNode.key Then @pNode.key = FStr16_Remove(t.str, @pNode.key) @pNode.key = FStr16_Put(t.str, key) End Sub ' Function FSSList_GetKeyAt(t As FSSListT, ByVal hNode As Long) As String 'get Key at current position t.isErr = %FALSE FSSList_ExitFalse(t.isOpen, Function, $FSSList_Err_FileNotOpen) FSSList_ExitFalse(hNode, Function, $FSSList_Err_NullHandle) Local pNode As FLLListNodeT Ptr pNode = FMem_Get(t.list.mem, hNode) : FSSList_ExitFalse(pNode, Function, $FSSList_Err_NullPointer) If @pNode.key Then Function = FStr16_Get(t.str, @pNode.key) End Function ' Sub FSSList_SetValueAt(t As FSSListT, ByVal hNode As Long, ByRef value As String) 'change Value at current position t.isErr = %FALSE FSSList_ExitFalse(t.isOpen, Sub, $FSSList_Err_FileNotOpen) FSSList_ExitFalse(hNode, Sub, $FSSList_Err_NullHandle) Local pNode As FLLListNodeT Ptr pNode = FMem_Get(t.list.mem, hNode) : FSSList_ExitFalse(pNode, Sub, $FSSList_Err_NullPointer) If @pNode.value Then @pNode.value = FStr16_Remove(t.str, @pNode.value) @pNode.value = FStr16_Put(t.str, value) End Sub ' Function FSSList_GetValueAt(t As FSSListT, ByVal hNode As Long) As String 'get Value at current position t.isErr = %FALSE FSSList_ExitFalse(t.isOpen, Function, $FSSList_Err_FileNotOpen) FSSList_ExitFalse(hNode, Function, $FSSList_Err_NullHandle) Local pNode As FLLListNodeT Ptr pNode = FMem_Get(t.list.mem, hNode) : FSSList_ExitFalse(pNode, Function, $FSSList_Err_NullPointer) If @pNode.value Then Function = FStr16_Get(t.str, @pNode.value) End Function ' Function FSSList_IsErr(t As FSSListT) As Long 'True/False if last operation caused an error Function = t.isErr End Function ' Function FSSList_ErrMsg(t As FSSListT) As String 'get error message If t.isErr Then Function = t.errMsg End Function '
Comment