WordFind: Difference between revisions
m (Adding new author and category links.) |
Instructor (talk | contribs) |
||
Line 7: | Line 7: | ||
If a function is used without an header, you should put the function below in your script before calling it. | If a function is used without an header, you should put the function below in your script before calling it. | ||
== The Function == | == The Function Description== | ||
<highlight-nsis> | |||
<highlight-nsis> | |||
____________________________________________________________________________ | |||
WordFind v2.0 | WordFind v2.0 | ||
____________________________________________________________________________ | |||
Multi-features string function. | Multi-features string function. | ||
Strings: | Strings: | ||
Line 77: | Line 76: | ||
Note: | Note: | ||
-Accepted numbers 1,01,001,... | -Accepted numbers 1,01,001,... | ||
</highlight-nsis> | |||
Example (Find word by number): | Example (Find word by number): | ||
<highlight-nsis> | |||
Section | Section | ||
${WordFind} "C:\io.sys C:\Program Files C:\WINDOWS" " C:\" "-02" $R0 | ${WordFind} "C:\io.sys C:\Program Files C:\WINDOWS" " C:\" "-02" $R0 | ||
; $R0="Program Files" | ; $R0="Program Files" | ||
SectionEnd | SectionEnd | ||
</highlight-nsis> | |||
Example (Delimiter exclude): | Example (Delimiter exclude): | ||
<highlight-nsis> | |||
Section | Section | ||
${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" "sys" "-2}" $R0 | ${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" "sys" "-2}" $R0 | ||
; $R0=" C:\logo.sys C:\WINDOWS" | ; $R0=" C:\logo.sys C:\WINDOWS" | ||
SectionEnd | SectionEnd | ||
</highlight-nsis> | |||
Example (Sum of words): | Example (Sum of words): | ||
<highlight-nsis> | |||
Section | Section | ||
${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" " C:\" "#" $R0 | ${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" " C:\" "#" $R0 | ||
; $R0="3" | ; $R0="3" | ||
SectionEnd | SectionEnd | ||
</highlight-nsis> | |||
Example (Sum of delimiters): | Example (Sum of delimiters): | ||
<highlight-nsis> | |||
Section | Section | ||
${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" "sys" "*" $R0 | ${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" "sys" "*" $R0 | ||
; $R0="2" | ; $R0="2" | ||
SectionEnd | SectionEnd | ||
</highlight-nsis> | |||
Example (Find word number): | Example (Find word number): | ||
<highlight-nsis> | |||
Section | Section | ||
${WordFind} "C:\io.sys C:\Program Files C:\WINDOWS" " " "/Files" $R0 | ${WordFind} "C:\io.sys C:\Program Files C:\WINDOWS" " " "/Files" $R0 | ||
; $R0="3" | ; $R0="3" | ||
SectionEnd | SectionEnd | ||
</highlight-nsis> | |||
Example ( }} ): | Example ( }} ): | ||
<highlight-nsis> | |||
Section | Section | ||
${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" " " "+2}}" $R0 | ${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" " " "+2}}" $R0 | ||
; $R0=" C:\WINDOWS" | ; $R0=" C:\WINDOWS" | ||
SectionEnd | SectionEnd | ||
</highlight-nsis> | |||
Example ( {} ): | Example ( {} ): | ||
<highlight-nsis> | |||
Section | Section | ||
${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" " " "+2{}" $R0 | ${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" " " "+2{}" $R0 | ||
; $R0="C:\io.sys C:\WINDOWS" | ; $R0="C:\io.sys C:\WINDOWS" | ||
SectionEnd | SectionEnd | ||
</highlight-nsis> | |||
Example ( *} ): | Example ( *} ): | ||
<highlight-nsis> | |||
Section | Section | ||
${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" " " "+2*}" $R0 | ${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" " " "+2*}" $R0 | ||
; $R0="C:\logo.sys C:\WINDOWS" | ; $R0="C:\logo.sys C:\WINDOWS" | ||
SectionEnd | SectionEnd | ||
</highlight-nsis> | |||
Example (Get parent directory): | Example (Get parent directory): | ||
<highlight-nsis> | |||
Section | Section | ||
StrCpy $R0 "C:\Program | StrCpy $R0 "C:\Program Files\NSIS\NSIS.chm" | ||
; "C:\Program | ; "C:\Program Files\NSIS\Include\" | ||
; "C:\\Program Files\ | ; "C:\\Program Files\\NSIS\\NSIS.chm" | ||
${WordFind} "$R0" "\" "-2{*" $R0 | ${WordFind} "$R0" "\" "-2{*" $R0 | ||
; $R0="C:\Program | ; $R0="C:\Program Files\NSIS" | ||
; "C:\\Program Files\ | ; "C:\\Program Files\\NSIS" | ||
SectionEnd | SectionEnd | ||
</highlight-nsis> | |||
Example (Coordinates): | Example (Coordinates): | ||
<highlight-nsis> | |||
Section | Section | ||
${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" ":\lo" "E+1{" $R0 | ${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" ":\lo" "E+1{" $R0 | ||
Line 150: | Line 169: | ||
end: | end: | ||
SectionEnd | SectionEnd | ||
</highlight-nsis> | |||
Example (With errorlevel output): | Example (With errorlevel output): | ||
<highlight-nsis> | |||
Section | Section | ||
${WordFind} "[string]" "[delimiter]" "E[options]" $R0 | ${WordFind} "[string]" "[delimiter]" "E[options]" $R0 | ||
Line 165: | Line 186: | ||
end: | end: | ||
SectionEnd | SectionEnd | ||
</highlight-nsis> | |||
Example (Without errorlevel output): | Example (Without errorlevel output): | ||
<highlight-nsis> | |||
Section | Section | ||
${WordFind} "C:\io.sys C:\logo.sys" "_" "+1" $R0 | ${WordFind} "C:\io.sys C:\logo.sys" "_" "+1" $R0 | ||
Line 172: | Line 195: | ||
; $R0="C:\io.sys C:\logo.sys" (error: delimiter "_" not found) | ; $R0="C:\io.sys C:\logo.sys" (error: delimiter "_" not found) | ||
SectionEnd | SectionEnd | ||
</highlight-nsis> | |||
Example (If found): | Example (If found): | ||
<highlight-nsis> | |||
Section | Section | ||
${WordFind} "C:\io.sys C:\logo.sys" ":\lo" "E+1{" $R0 | ${WordFind} "C:\io.sys C:\logo.sys" ":\lo" "E+1{" $R0 | ||
Line 185: | Line 210: | ||
end: | end: | ||
SectionEnd | SectionEnd | ||
</highlight-nsis> | |||
Example (If found 2): | Example (If found 2): | ||
<highlight-nsis> | |||
Section | Section | ||
${WordFind} "C:\io.sys C:\logo.sys" ":\lo" "+1{" $R0 | ${WordFind} "C:\io.sys C:\logo.sys" ":\lo" "+1{" $R0 | ||
Line 198: | Line 225: | ||
end: | end: | ||
SectionEnd | SectionEnd | ||
</highlight-nsis> | |||
Example (To accept one word in string if delimiter not found): | Example (To accept one word in string if delimiter not found): | ||
<highlight-nsis> | |||
Section | Section | ||
StrCpy $0 'OneWord' | StrCpy $0 'OneWord' | ||
Line 222: | Line 251: | ||
end: | end: | ||
; $R0="OneWord" | ; $R0="OneWord" | ||
SectionEnd | SectionEnd | ||
</highlight-nsis> | |||
Function WordFind | Function WordFind |
Revision as of 12:41, 4 July 2005
Author: Instructor (talk, contrib) |
Links
- Latest version of headers "nsh.zip"
- http://forums.winamp.com/showthread.php?s=&threadid=203228&goto=lastpost
If a function is used without an header, you should put the function below in your script before calling it.
The Function Description
____________________________________________________________________________ WordFind v2.0 ____________________________________________________________________________ Multi-features string function. Strings: "[word+1][delimiter][word+2][delimiter][word+3]..." "[delimiter][word+1][delimiter][word+2][delimiter]..." "[delimiter][delimiter][word+1][delimiter][delimiter][delimiter]..." "...[word-3][delimiter][word-2][delimiter][word-1]" "...[delimiter][word-2][delimiter][word-1][delimiter]" "...[delimiter][delimiter][word-1][delimiter][delimiter][delimiter]" Syntax: ${WordFind} "[string]" "[delimiter]" "[E][options]" $var "[string]" ;[string] ; input string "[delimiter]" ;[delimiter] ; one or several symbols "[E][options]" ;[options] ; +number : word number from start ; -number : word number from end ; +number} : delimiter number from start ; all space after this ; delimiter to output ; +number{ : delimiter number from start ; all space before this ; delimiter to output ; +number}} : word number from start ; all space after this word ; to output ; +number{{ : word number from start ; all space before this word ; to output ; +number{} : word number from start ; all space before and after ; this word (word exclude) ; +number*} : word number from start ; all space after this ; word to output with word ; +number{* : word number from start ; all space before this ; word to output with word ; # : sum of words to output ; * : sum of delimiters to output ; /word : number of word to output ; ;[E] ; with errorlevel output ; IfErrors: ; $var=1 delimiter not found ; $var=2 no such word number ; $var=3 syntax error (Use: +1,-1},#,*,/word,...) ;[] ; no errorlevel output (default) ; If some errors found then (result=input string) ; $var ;output (result) Note: -Accepted numbers 1,01,001,...
Example (Find word by number):
Section ${WordFind} "C:\io.sys C:\Program Files C:\WINDOWS" " C:\" "-02" $R0 ; $R0="Program Files" SectionEnd
Example (Delimiter exclude):
Section ${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" "sys" "-2}" $R0 ; $R0=" C:\logo.sys C:\WINDOWS" SectionEnd
Example (Sum of words):
Section ${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" " C:\" "#" $R0 ; $R0="3" SectionEnd
Example (Sum of delimiters):
Section ${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" "sys" "*" $R0 ; $R0="2" SectionEnd
Example (Find word number):
Section ${WordFind} "C:\io.sys C:\Program Files C:\WINDOWS" " " "/Files" $R0 ; $R0="3" SectionEnd
Example ( }} ):
Section ${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" " " "+2}}" $R0 ; $R0=" C:\WINDOWS" SectionEnd
Example ( {} ):
Section ${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" " " "+2{}" $R0 ; $R0="C:\io.sys C:\WINDOWS" SectionEnd
Example ( *} ):
Section ${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" " " "+2*}" $R0 ; $R0="C:\logo.sys C:\WINDOWS" SectionEnd
Example (Get parent directory):
Section StrCpy $R0 "C:\Program Files\NSIS\NSIS.chm" ; "C:\Program Files\NSIS\Include\" ; "C:\\Program Files\\NSIS\\NSIS.chm" ${WordFind} "$R0" "\" "-2{*" $R0 ; $R0="C:\Program Files\NSIS" ; "C:\\Program Files\\NSIS" SectionEnd
Example (Coordinates):
Section ${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" ":\lo" "E+1{" $R0 ; $R0="C:\io.sys C" IfErrors end StrLen $0 $R0 ; $0 = Start position of word (11) StrLen $1 ':\lo' ; $1 = Word leght (4) ; StrCpy $R0 $R1 $1 $0 ; $R0 = :\lo end: SectionEnd
Example (With errorlevel output):
Section ${WordFind} "[string]" "[delimiter]" "E[options]" $R0 IfErrors 0 end StrCmp $R0 1 0 +2 ; errorlevel 1? MessageBox MB_OK 'delimiter not found' IDOK end StrCmp $R0 2 0 +2 ; errorlevel 2? MessageBox MB_OK 'no such word number' IDOK end StrCmp $R0 3 0 +2 ; errorlevel 3? MessageBox MB_OK 'syntax error' end: SectionEnd
Example (Without errorlevel output):
Section ${WordFind} "C:\io.sys C:\logo.sys" "_" "+1" $R0 ; $R0="C:\io.sys C:\logo.sys" (error: delimiter "_" not found) SectionEnd
Example (If found):
Section ${WordFind} "C:\io.sys C:\logo.sys" ":\lo" "E+1{" $R0 IfErrors notfound found found: MessageBox MB_OK 'Found' IDOK end notfound: MessageBox MB_OK 'Not found' end: SectionEnd
Example (If found 2):
Section ${WordFind} "C:\io.sys C:\logo.sys" ":\lo" "+1{" $R0 StrCmp $R0 "C:\io.sys C:\logo.sys" notfound found ; error? found: MessageBox MB_OK 'Found' IDOK end notfound: MessageBox MB_OK 'Not found' end: SectionEnd
Example (To accept one word in string if delimiter not found):
Section StrCpy $0 'OneWord' StrCpy $1 1 loop: ${WordFind} "$0" " " "E+$1" $R0 IfErrors 0 code StrCmp $1$R0 11 0 error StrCpy $R0 $0 goto end code: ; ... IntOp $1 $1 + 1 goto loop error: StrCpy $1 '' StrCpy $R0 '' end: ; $R0="OneWord" SectionEnd
Function WordFind
!define WordFind `!insertmacro WordFindCall`
!macro WordFindCall _STRING _DELIMITER _OPTION _RESULT Push `${_STRING}` Push `${_DELIMITER}` Push `${_OPTION}` Call WordFind Pop ${_RESULT} !macroend
Exch $1 Exch Exch $0 Exch Exch 2 Exch $R0 Exch 2 Push $2 Push $3 Push $4 Push $5 Push $6 Push $7 Push $8 Push $9 Push $R1 ClearErrors
StrCpy $9 StrCpy $2 $1 1 StrCpy $1 $1 1 StrCmp $2 'E' 0 +3 StrCpy $9 E goto -4
StrCpy $3 StrCmp $2 '+' +6 StrCmp $2 '-' +5 StrCmp $2 '/' restart StrCmp $2 '#' restart StrCmp $2 '*' restart goto error3
StrCpy $4 $1 1 -1 StrCmp $4 '*' +4 StrCmp $4 '}' +3 StrCmp $4 '{' +2 goto +4 StrCpy $1 $1 -1 StrCpy $3 '$4$3' goto -7 StrCmp $3 '*' error3 StrCmp $3 '**' error3 StrCmp $3 '}{' error3 IntOp $1 $1 + 0 StrCmp $1 0 error2
restart: StrCmp $R0 error1 StrCpy $4 0 StrCpy $5 0 StrCpy $6 0 StrLen $7 $0 goto loop
preloop: IntOp $6 $6 + 1
loop: StrCpy $8 $R0 $7 $6 StrCmp $8$5 0 error1 StrCmp $8 +2 StrCmp $8 $0 +5 preloop StrCmp $3 '{' minus StrCmp $3 '}' minus StrCmp $2 '*' minus StrCmp $5 $6 minus +5 StrCmp $3 '{' +4 StrCmp $3 '}' +3 StrCmp $2 '*' +2 StrCmp $5 $6 nextword IntOp $4 $4 + 1 StrCmp $2$4 +$1 plus StrCmp $2 '/' 0 nextword IntOp $8 $6 - $5 StrCpy $8 $R0 $8 $5 StrCmp $1 $8 0 nextword StrCpy $R1 $4 goto end nextword: IntOp $6 $6 + $7 StrCpy $5 $6 goto loop
minus: StrCmp $2 '-' 0 sum StrCpy $2 '+' IntOp $1 $4 - $1 IntOp $1 $1 + 1 IntCmp $1 0 error2 error2 restart sum: StrCmp $2 '#' 0 sumdelim StrCpy $R1 $4 goto end sumdelim: StrCmp $2 '*' 0 error2 StrCpy $R1 $4 goto end
plus: StrCmp $3 0 +4 IntOp $6 $6 - $5 StrCpy $R1 $R0 $6 $5 goto end StrCmp $3 '{' 0 +3 StrCpy $R1 $R0 $6 goto end StrCmp $3 '}' 0 +4 IntOp $6 $6 + $7 StrCpy $R1 $R0 $6 goto end StrCmp $3 '{*' +2 StrCmp $3 '*{' 0 +3 StrCpy $R1 $R0 $6 goto end StrCmp $3 '*}' +2 StrCmp $3 '}*' 0 +3 StrCpy $R1 $R0 $5 goto end StrCmp $3 '}}' 0 +3 StrCpy $R1 $R0 $6 goto end StrCmp $3 '{{' 0 +3 StrCpy $R1 $R0 $5 goto end StrCmp $3 '{}' 0 error3 StrLen $3 $R0 StrCmp $3 $6 0 +3 StrCpy $0 goto +2 IntOp $6 $6 + $7 StrCpy $8 $R0 $6 StrCmp $4$8 1 +6 StrCmp $4 1 +2 +7 IntOp $6 $6 + $7 StrCpy $3 $R0 $7 $6 StrCmp $3 +2 StrCmp $3 $0 -3 +3 StrCpy $R1 goto end StrCmp $5 0 0 +3 StrCpy $0 goto +2 IntOp $5 $5 - $7 StrCpy $3 $R0 $5 StrCpy $R1 '$3$0$8' goto end
error3: StrCpy $R1 3 goto error error2: StrCpy $R1 2 goto error error1: StrCpy $R1 1 error: StrCmp $9 'E' 0 +3 SetErrors
end: StrCpy $R0 $R1
Pop $R1 Pop $9 Pop $8 Pop $7 Pop $6 Pop $5 Pop $4 Pop $3 Pop $2 Pop $1 Pop $0 Exch $R0 FunctionEnd </highlight-nsis>