Get all section names of INI file: Difference between revisions

From NSIS Wiki
Jump to navigationJump to search
No edit summary
Line 60: Line 60:


<highlight-nsis>
<highlight-nsis>
!define GetSectionNames `!insertmacro GetSectionNamesCall`
!define GetSectionNames `!insertmacro GetSectionNamesCall`
   
   
!macro GetSectionNamesCall _FILE _FUNC
!macro GetSectionNamesCall _FILE _FUNC
Push $0
Push $0
Push `${_FILE}`
Push `${_FILE}`
GetFunctionAddress $0 `${_FUNC}`
GetFunctionAddress $0 `${_FUNC}`
Push `$0`
Push `$0`
Call GetSectionNames
Call GetSectionNames
Pop $0
Pop $0
!macroend
!macroend


Function GetSectionNames
Exch $1
Exch $1
Exch
Exch

Revision as of 09:12, 12 July 2007

Author: nechai (talk, contrib)


Links

If a function is used without header, put the function code in your script before calling it.

The Function Description

Based on the method to loop over a buffer of null-terminated strings in function "GetDrives"
 
Loop over all available sections in an INI file.
 
Syntax:
${GetSectionNames} "File" "Function"
 
"File"     ; name of the initialization file
"Function" ; Callback function
 
Function "Function"
         ; $9    "section name"
         ; $R0-$R9  are not used (save data in them).
 
         ; ...
 
         Push $var    ; If $var="StopGetSectionNames" Then exit from function
FunctionEnd

Example1:

Section
	${GetSectionNames} "c:\test.ini" "Example1"
SectionEnd
 
Function Example1
	MessageBox MB_OK "$9"
 
	Push $0
FunctionEnd

Example2:

Section
	${GetSectionNames} "c:\test.ini" "Example2"
SectionEnd
 
Function Example2
	StrCmp $9 $R0 0 +3
	StrCpy $R1 $9
	StrCpy $0 StopGetSectionNames
 
	Push $0
FunctionEnd

The Function Code

!define GetSectionNames `!insertmacro GetSectionNamesCall`
 
!macro GetSectionNamesCall _FILE _FUNC
	Push $0
	Push `${_FILE}`
	GetFunctionAddress $0 `${_FUNC}`
	Push `$0`
	Call GetSectionNames
	Pop $0
!macroend
 
Function GetSectionNames
	Exch $1
	Exch
	Exch $0
	Exch
	Push $2
	Push $3
	Push $4
	Push $5
	Push $8
	Push $9
 
	System::Alloc 1024
	Pop $2
        StrCpy $3 $2
 
        System::Call "kernel32::GetPrivateProfileSectionNamesA(i, i, t) i(r3, 1024, r0) .r4"
 
	enumok:
        System::Call 'kernel32::lstrlenA(t) i(i r3) .r5'
	StrCmp $5 '0' enumex
 
	System::Call '*$3(&t1024 .r9)'
 
	Push $0
	Push $1
	Push $2
	Push $3
	Push $4
	Push $5
	Push $8
	Call $1
	Pop $9
	Pop $8
	Pop $5
	Pop $4
	Pop $3
	Pop $2
	Pop $1
	Pop $0
        StrCmp $9 'StopGetSectionNames' enumex
 
	enumnext:
	IntOp $3 $3 + $5
	IntOp $3 $3 + 1
	goto enumok
 
	enumex:
	System::Free $2
 
	Pop $9
	Pop $8
	Pop $5
	Pop $4
	Pop $3
	Pop $2
	Pop $1
	Pop $0
FunctionEnd