[bb] Simple ini functions by skn3 [ 1+ years ago ]

Started by BlitzBot, June 29, 2017, 00:28:40

Previous topic - Next topic

BlitzBot

Title : Simple ini functions
Author : skn3
Posted : 1+ years ago

Description : Simple to use ini access.

SetIniItem(ini$,group$,item$,value$)
GetIniItem(ini$,group$,name$)

plus

CountIniGroups(ini$)
CountIniGroupItems(ini$,group$)


Code :
Code (blitzbasic) Select
; ============================================================================================================
; example
SetIniItem("settings.ini","group1","x",50)
SetIniItem("settings.ini","group1","y",120)
SetIniItem("settings.ini","group2","open",False)
SetIniItem("settings.ini","group2","show",True)
RuntimeError GetIniItem("datasettings.ini","group1","y")
; ============================================================================================================


; ============================================================================================================
; functions
Function SetIniItem(ini$,groupname$,itemname$,itemvalue$)
Local group.INI_groups,item.INI_items

;load ini
INI_LoadIni(ini$)
;create group & item where needed
group = INI_FindGroup(groupname$)
If group = Null group = INI_CreateGroup(groupname$)
item  = INI_FindItem(group,itemname$)
If item = Null
item = INI_CreateItem(itemname$,itemvalue$,group)
Else
itemvalue$ = itemvalue$
End If
;save ini
INI_SaveIni(ini$)
Return True
End Function
Function GetIniItem$(ini$,groupname$,itemname$)
Local group.INI_groups,item.INI_items

;load ini
INI_LoadIni(ini$)
;check group & item exist
group = INI_FindGroup(groupname$)
If group = Null Return ""
item  = INI_FindItem(group,itemname$)
If item = Null Return ""
;return item value
Return itemvalue$
End Function
Function CountIniGroups(ini$)
Local group.INI_groups,count

If INI_LoadIni(ini$) = False
Return 0
Else
count = 0
For group = Each INI_groups
count = count + 1
Next
Return count
End If
End Function
Function CountIniGroupItems(ini$,name$)
Local group.INI_groups,item.INI_items,count

If INI_LoadIni(ini$) = False
Return 0
Else
group = INI_FindGroup(name$)
If group = Null
Return 0
Else
If groups = Null
Return 0
Else
item  = groups
count = 0
Repeat
count = count + 1
If item = groupe Return count
item = After item
Forever
End If
End If
End If
End Function
; ============================================================================================================


; ============================================================================================================
; this stuff doesn't need to be touched at all
Type INI_groups
Field inactive
Field name$
Field s.INI_items
Field e.INI_items
End Type
Type INI_items
Field inactive
Field name$
Field value$
End Type
Function INI_FindGroup.INI_groups(name$)
Local group.INI_groups

name$ = Lower$(name$)

For group = Each INI_groups
If group
ame$ = name$ Return group
Next
Return Null
End Function
Function INI_FindItem.INI_items(group.INI_groups,name$)
Local item.INI_items

name$ = Lower$(name$)

If groups <> Null
item = groups
Repeat
If item
ame$ = name$ Return item
If item = groupe Return Null
item = After item
Forever
End If
Return Null
End Function
Function INI_CreateGroup.INI_groups(name$)
Local found,group.INI_groups

name$ = Lower$(name$)

;make sure existing group is not using same name
For group = Each INI_groups
If group
ame$ = name$ Return Null
Next
found = False
;look for inactive group to reuse
For group = Each INI_groups
If groupinactive
found = True
Exit
End If
Next
If found = False group = New INI_groups
groupinactive = False
group
ame$    = name$

Return group
End Function
Function INI_CreateItem.INI_items(name$,value$,group.INI_groups)
Local found,item.INI_items

name$ = Lower$(name$)

;make sure existing variable is not using same name
If groups <> Null
item = groups
Repeat
If item
ame$ = name$
Return Null
End If
If item = groupe Exit
item = After item
Forever
End If
;look for inactive item to reuse
found = False
For item = Each INI_items
If iteminactive
Insert item After Last INI_items
found = True
Exit
End If
Next
If found = False item = New INI_items
iteminactive = False
item
ame$    = name$
itemvalue$   = value$
;update group this item belongs too
If groups = Null
groups = item
Else
Insert item After groupe
End If
groupe       = item

Return item
End Function
Function INI_LoadIni(path$)
Local group.INI_groups,item.INI_items,file,getline$,found

;check for error in path
If FileType(path$) <> 1 Return False
file = ReadFile(path$)
If file = False Return False

;clear old groups
For group = Each INI_groups
groupinactive = True
group
ame$    = ""
groups        = Null
groupe        = Null
;clear old items for group
If groups <> Null
item = groups
Repeat
iteminactive = True
item
ame$    = ""
itemvalue$   = ""
If item = groupe Exit
item = After item
Forever
End If
Next

;load ini file
group = Null
item  = Null
While Eof(file) = False
getline$ = Trim$(ReadLine$(file))
Select Left$(getline$,1)
Case "["     ; ini group
;create new group
group = INI_CreateGroup(Mid$(getline$,2,Len(getline$)-2))
Case ";","#","" ; ini comment, do nothing
Default      ; ini item
;create new item
item = INI_CreateItem(Trim$(Left$(getline$,Instr(getline$,"=")-1)),Right$(getline$,Len(getline$)-Instr(getline$,"=")),group)
End Select
Wend
CloseFile(file)
Return True
End Function
Function INI_SaveIni(path$)
Local file,group.INI_groups,item.INI_items,firstgroup

file       = WriteFile(path$)
firstgroup = True
For group = Each INI_groups
If firstgroup = False
WriteLine(file,"")
Else
firstgroup = False
End If
WriteLine(file,"["+group
ame$+"]")
If groups <> Null
item = groups
Repeat
WriteLine(file,item
ame$+"="+itemvalue$)
If item = groupe Exit
item = After item
Forever
End If
Next
CloseFile(file)
End Function
; ============================================================================================================


Comments :


Koriolis(Posted 1+ years ago)

 Nice litle functions. Some problems though:- you do CloseFile(path$), that's closefile(file)- replacing     Case ";","#"   by     Case ";","#", ""  would allow to have blank lines.Apart that, works well (just to be pit nicky, could be more efficient if you wasn't loading/saving the file at any item access...OK, who cares).Thanks to share :)


skn3(Posted 1+ years ago)

 Thanks for the bug fixes.I decided to make the functions encapsulated, because there are already solutions for the method you describe.