Code archives/File Utilities/Simple ini functions

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

Download source code

Simple ini functions by skn32004
Simple to use ini access.

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

plus

CountIniGroups(ini$)
CountIniGroupItems(ini$,group$)
; ============================================================================================================
; 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("data\settings.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
		item\value$ = 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 item\value$
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 group\s = Null
				Return 0
			Else
				item  = group\s
				count = 0
				Repeat
					count = count + 1
					If item = group\e 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\name$ = 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 group\s <> Null
		item = group\s
		Repeat
			If item\name$ = name$ Return item
			If item = group\e 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\name$ = name$ Return Null
	Next
	found = False
	;look for inactive group to reuse
	For group = Each INI_groups
		If group\inactive
			found = True
			Exit
		End If
	Next
	If found = False group = New INI_groups
	group\inactive = False
	group\name$    = 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 group\s <> Null
		item = group\s
		Repeat
			If item\name$ = name$
				Return Null
			End If
			If item = group\e Exit
			item = After item
		Forever
	End If
	;look for inactive item to reuse
	found = False
	For item = Each INI_items
		If item\inactive
			Insert item After Last INI_items
			found = True
			Exit
		End If
	Next
	If found = False item = New INI_items
	item\inactive = False
	item\name$    = name$
	item\value$   = value$
	;update group this item belongs too
	If group\s = Null
		group\s = item
	Else
		Insert item After group\e
	End If
	group\e       = 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
		group\inactive = True
		group\name$    = ""
		group\s        = Null
		group\e        = Null
		;clear old items for group
		If group\s <> Null
			item = group\s
			Repeat
				item\inactive = True
				item\name$    = ""
				item\value$   = ""
				If item = group\e 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\name$+"]")
		If group\s <> Null
			item = group\s
			Repeat
				WriteLine(file,item\name$+"="+item\value$)
				If item = group\e Exit
				item = After item
			Forever
		End If
	Next
	CloseFile(file)
End Function
; ============================================================================================================

Comments

Koriolis2004
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 :)


skn32004
Thanks for the bug fixes.

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


Code Archives Forum