Advertisement
zinthose

FindINIStr

Oct 20th, 2011
392
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ## This Pastebin is in response to Forum Post at: http://forums.winamp.com/showthread.php?t=336325
  2.  
  3. !define FindINIStr '!insertmacro _FindINIStr'  
  4. !macro _FindINIStr _OutVar _INIFileName _MatchName _MatchValue _ReadValue  
  5.     ;FindINIStr $0 $INIfilename 'LocalFileName=Language.DevPak' 'Version'  
  6.     Push `${_ReadValue}`  
  7.     Push `${_MatchValue}`  
  8.     Push `${_MatchName}`  
  9.     Push `${_INIFileName}`  
  10.     Call FindINIStr  
  11.     Pop ${_OutVar}  
  12. !macroend  
  13.  
  14. Section  
  15.      
  16.     ${FindINIStr} $0 $INIFilePath 'LocalFileName' 'Language.DevPak' 'Version'  
  17.     DetailPrint $0  
  18.  
  19. SectionEnd  
  20.  
  21.  
  22. Function FindINIStr  
  23.     # Stack:  _INIFileName _MatchName _MatchValue _ReadValue  
  24.     Exch $0 ; r0 _MatchName _MatchValue _ReadValue  
  25.      
  26.     IfFileExists $0 0 FileNotFound  
  27.      
  28.     Exch    ; _MatchName r0 _MatchValue _ReadValue  
  29.     Exch $1 ; r1 r0 _MatchValue _ReadValue  
  30.     Exch 2  ; _MatchValue r0 r1 _ReadValue  
  31.     Exch $2 ; r2 r0 r1 _ReadValue  
  32.     Exch 3  ; _ReadValue r0 r1 r2  
  33.     Exch $3 ; r3 r0 r1 r2  
  34.     Push $4 ; r4 r3 r0 r1 r2  
  35.     Push $5 ; r5 r4 r3 r0 r1 r2  
  36.     Push $6 ; r6 r5 r4 r3 r0 r1 r2  
  37.     Push $7 ; r7 r6 r5 r4 r3 r0 r1 r2  
  38.     Push $8 ; r8 r7 r6 r5 r4 r3 r0 r1 r2  
  39.     Push $9 ; r9 r8 r7 r6 r5 r4 r3 r0 r1 r2  
  40.      
  41.     ; $0 = _INIFileName  
  42.     ; $1 = _MatchName  
  43.     ; $2 = _MatchValue  
  44.     ; $3 = _ReadValue  
  45.     ; $4 = StrBuffer  
  46.     ; $5 = RC / Max  
  47.     ; $6 = Offset  
  48.     ; $7 = Temp  
  49.     ; $8 = Temp  
  50.     ; $9 = ReturnValue  
  51.  
  52.     ## Allocate Memory  
  53.         System::Alloc ${NSIS_MAX_STRLEN}      
  54.         Pop $4  
  55.          
  56.     ## Get INI Section Names from file  
  57.         System::Call 'Kernel32::GetPrivateProfileSectionNames(i r4,i ${NSIS_MAX_STRLEN},t r0)i .r5'  
  58.         ## WARNING ASSUMTIONS MADE HERE  
  59.          
  60.         StrCpy $6 0  
  61.         StrCpy $9 ""  
  62.         Loop:  
  63.             IntCmp $5 $6 NoMoreSections NoMoreSections  
  64.             System::Call '*$4(&v$6,&t${NSIS_MAX_STRLEN} .r7)'  
  65.             StrLen $8 $7  
  66.             IntOp $6 $6 + $8  
  67.             IntOp $6 $6 + 1  
  68.             ReadINIStr $8 $0 $7 $1  
  69.             StrCmp $8 $2 0 Loop  
  70.             ReadINIStr $9 $0 $7 $3  
  71.         NoMoreSections:  
  72.         StrCmp $9 "" 0 +2  
  73.             SetErrors  
  74.              
  75.     System::Free $4  
  76.      
  77.     ## Restore The Stack  
  78.         ;STACK:   r9 r8 r7 r6 r5 r4 r3 r0 r1 r2  
  79.         Exch $9 ; _RetVar r8 r7 r6 r5 r4 r3 r0 r1 r2  
  80.         Exch 9  ; r2 r8 r7 r6 r5 r4 r3 r0 r1 _RetVar  
  81.         Pop $2  ; r8 r7 r6 r5 r4 r3 r0 r1 _RetVar  
  82.         Pop $8  ; r7 r6 r5 r4 r3 r0 r1 _RetVar  
  83.         Pop $7  ; r6 r5 r4 r3 r0 r1 _RetVar  
  84.         Pop $6  ; r5 r4 r3 r0 r1 _RetVar  
  85.         Pop $5  ; r4 r3 r0 r1 _RetVar  
  86.         Pop $4  ; r3 r0 r1 _RetVar  
  87.         Pop $3  ; r0 r1 _RetVar  
  88.         Pop $0  ; r1 _RetVar  
  89.         Pop $1  ; _RetVar  
  90.     Return  
  91.     FileNotFound:  
  92.         Pop $0  
  93.         Push ""  
  94.         SetErrors  
  95. FunctionEnd
  96.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement