Code archives/File Utilities/INI file functions

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

Download source code

INI file functions by Murilo2002
The two main functions (INI_ReadValue and INI_WriteValue) require no external arrays/variables - I've kept them completely self contained. The WriteINIFile function will create the INI file if it does not exist, create new sections if required and delete key values etc.
; Title:	INI Read and Write functions 
; Version:	1.22
; Revised:	November 11th 2002 
; Author:	Leigh Bowers 

; Email:	leigh.bowers@curvesoftware.co.uk 
; Web:	http://www.curvesoftware.co.uk/blitz 

; History: 

; 1.22  Failed to rename a variable during the v1.21 update - Fixed.
; 1.21	Functions/variables renamed for consitency, clarity & to avoid conflicts with globals - Prefxed with "INI_".
; 1.20	Bug fix: INI files with a single section could behave weirdly (thanks to Jacob Sindelir for highlighting the problem).
; 1.13	More efficient use of Upper$.
; 1.12	Minor optimisations/tweaks.
; 1.11	First public release (1.10 + enhancement).
;		Read/Write: Added support for INI sections. 
;		Read: Now removes leader and trailer quotes where applicable (optional). 
; 1.04	Initial internal release. 

; Example usage: 

;Print "INI Value = " + INI_ReadValue("Archon", "Video", "Resolution", "800x600") 
;bSuccess% = INI_WriteValue("Archon", "Audio", "Music", "0") 

Function INI_ReadValue$(INI_sAppName$, INI_sSection$, INI_sKey$, INI_sDefault$)

; Returns: INI Value (String) - The INI_sDefault value is returned if no SECTION/KEY combination is found

	INI_sSection = "[" + Upper$(Trim$(INI_sSection)) + "]"
	INI_sKey = Upper$(Trim$(INI_sKey))
	INI_sFilename$ = CurrentDir$() + "\"  + INI_sAppName + ".ini"

; Retrieve the INI data

	INI_sContents$= INI_FileToString(INI_sFilename)
	INI_sUpperContents$ = Upper$(INI_sContents) ; Speed up checks below

; Locate the SECTION, KEY and VALUE

	INI_sValue$ = ""

	INI_lSectionPos% = Instr(INI_sUpperContents, INI_sSection)
	If (INI_lSectionPos <> 0) Then
		INI_lKeyPos% = Instr(INI_sUpperContents, INI_sKey, (INI_lSectionPos + Len(INI_sSection) + 1))
		If (INI_lKeyPos <> 0) Then
			INI_lStartPos% = Instr(INI_sUpperContents, "=", (INI_lKeyPos + 1))
			If (INI_lStartPos <> 0) Then
				INI_lEndPos% = Instr(INI_sUpperContents, Chr$(0), (INI_lStartPos + 1))
				If (INI_lEndPos <> 0) Then
					; We have located the required INI VALUE!
					INI_sValue = Trim$(Mid$(INI_sContents, INI_lStartPos + 1, (INI_lEndPos - INI_lStartPos - 1)))
					; Now remove any leader/trailer quotes (") - ** OPTIONAL **
					;If Left$(INI_sValue, 1) = Chr$(34) Then INI_sValue = Mid$(INI_sValue, 2)
					;If Right$(INI_sValue, 1) = Chr$(34) Then INI_sValue = Mid$(INI_sValue, 1, (Len(INI_sValue) - 1))
				End If
			End If
		End If
	End If

; Return the value

	If (INI_sValue <> "") Then Return INI_sValue Else Return INI_sDefault

End Function

Function INI_WriteValue%(INI_sAppName$, INI_sSection$, INI_sKey$, INI_sValue$)

; Returns: True (Success) or False (Failed)

	INI_sSection = "[" + Trim$(INI_sSection) + "]"
	INI_sUpperSection$ = Upper$(INI_sSection)
	INI_sKey = Trim$(INI_sKey)
	INI_sValue = Trim$(INI_sValue)
	INI_sFilename$ = CurrentDir$() + "\"  + INI_sAppName + ".ini"

; Retrieve the INI data (if it exists)

	INI_sContents$= INI_FileToString(INI_sFilename)

; (Re)Create the INI file updating/adding the SECTION, KEY and VALUE

	INI_bWrittenKey% = False
	INI_bSectionFound% = False
	INI_sCurrentSection$ = ""

	INI_lFileHandle = WriteFile(INI_sFilename)
	If INI_lFileHandle = 0 Then Return False ; Create file failed!

	INI_lOldPos% = 1
	INI_lPos% = Instr(INI_sContents, Chr$(0))

	While (INI_lPos <> 0)

		INI_sTemp$ =Trim$(Mid$(INI_sContents, INI_lOldPos, (INI_lPos - INI_lOldPos)))
		
		If (INI_sTemp <> "") Then

			If Left$(INI_sTemp, 1) = "[" And Right$(INI_sTemp, 1) = "]" Then

				; Process SECTION

				If (INI_sCurrentSection = INI_sUpperSection) And (INI_bWrittenKey = False) Then
					INI_bWrittenKey = INI_CreateKey(INI_lFileHandle, INI_sKey, INI_sValue)
				End If
				INI_sCurrentSection = Upper$(INI_CreateSection(INI_lFileHandle, INI_sTemp))
				If (INI_sCurrentSection = INI_sUpperSection) Then INI_bSectionFound = True

			Else

				; KEY=VALUE

				lEqualsPos% = Instr(INI_sTemp, "=")
				If (lEqualsPos <> 0) Then
					If (INI_sCurrentSection = INI_sUpperSection) And (Upper$(Trim$(Left$(INI_sTemp, (lEqualsPos - 1)))) = Upper$(INI_sKey)) Then
						If (INI_sValue <> "") Then INI_CreateKey INI_lFileHandle, INI_sKey, INI_sValue
						INI_bWrittenKey = True
					Else
						WriteLine INI_lFileHandle, INI_sTemp
					End If
				End If

			End If

		End If

		; Move through the INI file...

		INI_lOldPos = INI_lPos + 1
		INI_lPos% = Instr(INI_sContents, Chr$(0), INI_lOldPos)

	Wend

	; KEY wasn't found in the INI file - Append a new SECTION if required and create our KEY=VALUE line

	If (INI_bWrittenKey = False) Then
		If (INI_bSectionFound = False) Then INI_CreateSection INI_lFileHandle, INI_sSection
		INI_CreateKey INI_lFileHandle, INI_sKey, INI_sValue
	End If

	CloseFile INI_lFileHandle

	Return True ; Success

End Function

Function INI_FileToString$(INI_sFilename$)

	INI_sString$ = ""
	INI_lFileHandle% = ReadFile(INI_sFilename)
	If INI_lFileHandle <> 0 Then
		While Not(Eof(INI_lFileHandle))
			INI_sString = INI_sString + ReadLine$(INI_lFileHandle) + Chr$(0)
		Wend
		CloseFile INI_lFileHandle
	End If
	Return INI_sString

End Function

Function INI_CreateSection$(INI_lFileHandle%, INI_sNewSection$)

	If FilePos(INI_lFileHandle) <> 0 Then WriteLine INI_lFileHandle, "" ; Blank line between sections
	WriteLine INI_lFileHandle, INI_sNewSection
	Return INI_sNewSection

End Function

Function INI_CreateKey%(INI_lFileHandle%, INI_sKey$, INI_sValue$)

	WriteLine INI_lFileHandle, INI_sKey + "=" + INI_sValue
	Return True

End Function

Comments

None.

Code Archives Forum