StrFilter: Difference between revisions

From NSIS Wiki
Jump to navigationJump to search
m (Updated author links.)
No edit summary
 
(5 intermediate revisions by 2 users not shown)
Line 1: Line 1:
{|align=right
{{PageAuthor|Instructor}}
|<small>Author: [[{{ns:2}}:Instructor|Instructor]] ([[{{ns:3}}:Instructor|talk]], [[{{ns:-1}}:Contributions/Instructor|contrib]])</small>
|}
<br style="clear:both;">
== Links ==
; Latest version of headers "nsh.zip":
: http://forums.winamp.com/showthread.php?s=&threadid=203228&goto=lastpost


If function used without header then put the function in the script before calling it.
{{User:Instructor/Headers/Template}}


== The Function ==
== Function Description ==
<highlight-nsis>/*
 
<highlight-nsis>
____________________________________________________________________________
____________________________________________________________________________


Line 20: Line 15:


Features:
Features:
1. To convert string to uppercase or lowercase.
1. Convert string to uppercase or lowercase.
2. To set symbol filter.
2. Set symbol filter.




Line 53: Line 48:
-Error flag if syntax error
-Error flag if syntax error
-Same symbol to include & to exclude = to exclude
-Same symbol to include & to exclude = to exclude
</highlight-nsis>




Example (UpperCase):
<b>Example (UpperCase):</b>
Section
<highlight-nsis>Section
${StrFilter} "123abc 456DEF 7890|%#" "+" "" "" $R0
${StrFilter} "123abc 456DEF 7890|%#" "+" "" "" $R0
; $R0="123ABC 456DEF 7890|%#"
; $R0="123ABC 456DEF 7890|%#"
SectionEnd
SectionEnd
</highlight-nsis>


Example (LowerCase):
<b>Example (LowerCase):</b>
Section
<highlight-nsis>Section
${StrFilter} "123abc 456DEF 7890|%#" "-" "ef" "" $R0
${StrFilter} "123abc 456DEF 7890|%#" "-" "ef" "" $R0
; $R0="123abc 456dEF 7890|%#"
; $R0="123abc 456dEF 7890|%#"
SectionEnd
SectionEnd
</highlight-nsis>


Example (Filter1):
<b>Example (Filter1):</b>
Section
<highlight-nsis>Section
${StrFilter} "123abc 456DEF 7890|%#" "2" "|%" "" $R0
${StrFilter} "123abc 456DEF 7890|%#" "2" "|%" "" $R0
; $R0="abcDEF|%"      ;only Letters + |%
; $R0="abcDEF|%"      ;only Letters + |%
SectionEnd
SectionEnd
</highlight-nsis>


Example (Filter2):
<b>Example (Filter2):</b>
Section
<highlight-nsis>Section
${StrFilter} "123abc 456DEF 7890|%#" "13" "af" "4590" $R0
${StrFilter} "123abc 456DEF 7890|%#" "13" "af" "4590" $R0
; $R0="123a 6F 78|%#"  ;only Digits + Special + af - 4590
; $R0="123a 6F 78|%#"  ;only Digits + Special + af - 4590
SectionEnd
SectionEnd
</highlight-nsis>


Example (Filter3):
<b>Example (Filter3):</b>
Section
<highlight-nsis>Section
${StrFilter} "123abc 456DEF 7890|%#" "+12" "b" "def" $R0
${StrFilter} "123abc 456DEF 7890|%#" "+12" "b" "def" $R0
; $R0="123AbC4567890"  ;only Digits + Letters + b - def
; $R0="123AbC4567890"  ;only Digits + Letters + b - def
SectionEnd
SectionEnd
</highlight-nsis>


Example (Filter4):
<b>Example (Filter4):</b>
Section
<highlight-nsis>Section
${StrFilter} "123abc??? 456DEF??? 7890|%#" "+12rus" "?" "??" $R0
${StrFilter} "123abc�?БВ 456DEFгде 7890|%#" "+12rus" "д" "ге" $R0
; $R0="123???456?7890"  ;only Digits + Letters + ? - ??
; $R0="123�?БВ456д7890"  ;only Digits + Letters + д - ге
SectionEnd
SectionEnd
</highlight-nsis>


Example (English + Russian Letters):
<b>Example (English + Russian Letters):</b>
Section
<highlight-nsis>Section
${StrFilter} "123abc??? 456DEF??? 7890|%#" "2rus" "" "" $R0
${StrFilter} "123abc�?БВ 456DEFгде 7890|%#" "2rus" "" "" $R0
; $R0="??????"        ;only Russian Letters
; $R0="�?БВгде"        ;only Russian Letters
${StrFilter} "123abc??? 456DEF??? 7890|%#" "2" "$R0" "" $R0
${StrFilter} "123abc�?БВ 456DEFгде 7890|%#" "2" "$R0" "" $R0
; $R0="abc???DEF???"  ;only English + Russian Letters
; $R0="abc�?БВDEFгде"  ;only English + Russian Letters
SectionEnd
SectionEnd
</highlight-nsis>


Example (Word Capitalize):
<b>Example (Word Capitalize):</b>
Section
<highlight-nsis>Section
Push "_01-PERPETUOUS_DREAMER__-__THE_SOUND_OF_GOODBYE_(ORIG._MIX).MP3_"
Push "_01-PERPETUOUS_DREAMER__-__THE_SOUND_OF_GOODBYE_(ORIG._MIX).MP3_"
Call Capitalize
Call Capitalize
Line 152: Line 155:
Pop $0
Pop $0
Exch $R0
Exch $R0
FunctionEnd*/
FunctionEnd
</highlight-nsis>


== Function Code ==


;---------------------------------------------------------------------------
<highlight-nsis>
 
Function StrFilter
Function StrFilter
!define StrFilter `!insertmacro StrFilterCall`
!define StrFilter `!insertmacro StrFilterCall`
Line 354: Line 358:
Pop $0
Pop $0
Exch $R0
Exch $R0
FunctionEnd</highlight-nsis>
FunctionEnd
</highlight-nsis>
 
[[Category:String Functions]]

Latest revision as of 11:26, 30 November 2005

Author: Instructor (talk, contrib)


Page for NSIS 2.07 and below users

You can use the latest version of headers (recommended) or the following function code (put the function code in your script before calling it)

Function Description

____________________________________________________________________________
 
                           StrFilter v1.2
____________________________________________________________________________
 
Thanks sunjammer (Function "StrUpper")
 
 
Features:
1. Convert string to uppercase or lowercase.
2. Set symbol filter.
 
 
Syntax:
${StrFilter} "[string]" "[options]" "[symbols1]" "[symbols2]" $var
 
"[string]"       ;[string]
                 ;  input string
                 ;
"[options]"      ;[+|-][1|2|3|12|23|31][eng|rus]
                 ;  +   : covert string to uppercase
                 ;  -   : covert string to lowercase
                 ;  1   : only Digits
                 ;  2   : only Letters
                 ;  3   : only Special
                 ;  12  : only Digits  + Letters
                 ;  23  : only Letters + Special
                 ;  31  : only Special + Digits
                 ;  eng : English symbols (default)
                 ;  rus : Russian symbols
                 ;
"[symbols1]"     ;[symbols1]
                 ;  symbols include (not changeable)
                 ;
"[symbols2]"     ;[symbols2]
                 ;  symbols exclude
                 ;
$var             ;output (result)
 
Note:
-Error flag if syntax error
-Same symbol to include & to exclude = to exclude


Example (UpperCase):

Section
	${StrFilter} "123abc 456DEF 7890|%#" "+" "" "" $R0
	; $R0="123ABC 456DEF 7890|%#"
SectionEnd

Example (LowerCase):

Section
	${StrFilter} "123abc 456DEF 7890|%#" "-" "ef" "" $R0
	; $R0="123abc 456dEF 7890|%#"
SectionEnd

Example (Filter1):

Section
	${StrFilter} "123abc 456DEF 7890|%#" "2" "|%" "" $R0
	; $R0="abcDEF|%"       ;only Letters + |%
SectionEnd

Example (Filter2):

Section
	${StrFilter} "123abc 456DEF 7890|%#" "13" "af" "4590" $R0
	; $R0="123a 6F 78|%#"  ;only Digits + Special + af - 4590
SectionEnd

Example (Filter3):

Section
	${StrFilter} "123abc 456DEF 7890|%#" "+12" "b" "def" $R0
	; $R0="123AbC4567890"  ;only Digits + Letters + b - def
SectionEnd

Example (Filter4):

Section
	${StrFilter} "123abc�?БВ 456DEFгде 7890|%#" "+12rus" "д" "ге" $R0
	; $R0="123�?БВ456д7890"  ;only Digits + Letters + д - ге
SectionEnd

Example (English + Russian Letters):

Section
	${StrFilter} "123abc�?БВ 456DEFгде 7890|%#" "2rus" "" "" $R0
	; $R0="�?БВгде"        ;only Russian Letters
	${StrFilter} "123abc�?БВ 456DEFгде 7890|%#" "2" "$R0" "" $R0
	; $R0="abc�?БВDEFгде"  ;only English + Russian Letters
SectionEnd

Example (Word Capitalize):

Section
	Push "_01-PERPETUOUS_DREAMER__-__THE_SOUND_OF_GOODBYE_(ORIG._MIX).MP3_"
	Call Capitalize
	Pop $R0
	; $R0="_01-Perpetuous_Dreamer__-__The_Sound_Of_Goodbye_(Orig._Mix).mp3_"
 
	${WordReplace} "$R0" "_" " " "+*" $R0
	; $R0=" 01-Perpetuous Dreamer - The Sound Of Goodbye (Orig. Mix).mp3 "
 
	${WordReplace} "$R0" " " "" "{}" $R0
	; $R0="01-Perpetuous Dreamer - The Sound Of Goodbye (Orig. Mix).mp3"
SectionEnd
 
Function Capitalize
	Exch $R0
	Push $0
	Push $1
	Push $2
 
	${StrFilter} '$R0' '-eng' '' '' $R0
	${StrFilter} '$R0' '-rus' '' '' $R0
 
	StrCpy $0 0
 
	loop:
	IntOp $0 $0 + 1
	StrCpy $1 $R0 1 $0
	StrCmp $1 '' end
	StrCmp $1 ' ' +5
	StrCmp $1 '_' +4
	StrCmp $1 '-' +3
	StrCmp $1 '(' +2
	StrCmp $1 '[' 0 loop
	IntOp $0 $0 + 1
	StrCpy $1 $R0 1 $0
	StrCmp $1 '' end
 
	${StrFilter} '$1' '+eng' '' '' $1
	${StrFilter} '$1' '+rus' '' '' $1
 
	StrCpy $2 $R0 $0
	IntOp $0 $0 + 1
	StrCpy $R0 $R0 '' $0
	IntOp $0 $0 - 2
	StrCpy $R0 '$2$1$R0'
	goto loop
 
	end:
	Pop $2
	Pop $1
	Pop $0
	Exch $R0
FunctionEnd

Function Code

Function StrFilter
	!define StrFilter `!insertmacro StrFilterCall`
 
	!macro StrFilterCall _STRING _FILTER _INCLUDE _EXCLUDE _RESULT
		Push `${_STRING}`
		Push `${_FILTER}`
		Push `${_INCLUDE}`
		Push `${_EXCLUDE}`
		Call StrFilter
		Pop ${_RESULT}
	!macroend
 
	Exch $2
	Exch
	Exch $1
	Exch
	Exch 2
	Exch $0
	Exch 2
	Exch 3
	Exch $R0
	Exch 3
	Push $3
	Push $4
	Push $5
	Push $6
	Push $7
	Push $R1
	Push $R2
	Push $R3
	Push $R4
	Push $R5
	Push $R6
	Push $R7
	Push $R8
	ClearErrors
 
	StrCpy $R2 $0 '' -3
	StrCmp $R2 eng eng
	StrCmp $R2 rus rus
	eng:
	StrCpy $4 65
	StrCpy $5 90
	StrCpy $6 97
	StrCpy $7 122
	goto langend
	rus:
	StrCpy $4 192
	StrCpy $5 223
	StrCpy $6 224
	StrCpy $7 255
	goto langend
	;...
 
	langend:
	StrCpy $R7 ''
	StrCpy $R8 ''
 
	StrCmp $2 '' 0 begin
 
	restart1:
	StrCpy $2 ''
	StrCpy $3 $0 1
	StrCmp $3 '+' +2
	StrCmp $3 '-' 0 +3
	StrCpy $0 $0 '' 1
	goto +2
	StrCpy $3 ''
 
	IntOp $0 $0 + 0
	StrCmp $0 0 +5
	StrCpy $R7 $0 1 0
	StrCpy $R8 $0 1 1
	StrCpy $R2 $0 1 2
	StrCmp $R2 '' filter error
 
	restart2:
	StrCmp $3 '' end
	StrCpy $R7 ''
	StrCpy $R8 '+-'
	goto begin
 
	filter:
	StrCmp $R7 '1' +3
	StrCmp $R7 '2' +2
	StrCmp $R7 '3' 0 error
 
	StrCmp $R8 '' begin
	StrCmp $R7$R8 '23' +2
	StrCmp $R7$R8 '32' 0 +3
	StrCpy $R7 -1
	goto begin
	StrCmp $R7$R8 '13' +2
	StrCmp $R7$R8 '31' 0 +3
	StrCpy $R7 -2
	goto begin
	StrCmp $R7$R8 '12' +2
	StrCmp $R7$R8 '21' 0 error
	StrCpy $R7 -3
 
	begin:
	StrCpy $R6 0
	StrCpy $R1 ''
 
	loop:
	StrCpy $R2 $R0 1 $R6
	StrCmp $R2 '' restartchk
 
	StrCmp $2 '' +7
	StrCpy $R4 0
	StrCpy $R5 $2 1 $R4
	StrCmp $R5 '' addsymbol
	StrCmp $R5 $R2 skipsymbol
	IntOp $R4 $R4 + 1
	goto -4
 
	StrCmp $1 '' +7
	StrCpy $R4 0
	StrCpy $R5 $1 1 $R4
	StrCmp $R5 '' +4
	StrCmp $R5 $R2 addsymbol
	IntOp $R4 $R4 + 1
	goto -4
 
	StrCmp $R7 '1' +2
	StrCmp $R7 '-1' 0 +4
	StrCpy $R4 48
	StrCpy $R5 57
	goto loop2
	StrCmp $R8 '+-' 0 +2
	StrCmp $3 '+' 0 +4
	StrCpy $R4 $4
	StrCpy $R5 $5
	goto loop2
	StrCpy $R4 $6
	StrCpy $R5 $7
 
	loop2:
	IntFmt $R3 '%c' $R4
	StrCmp $R2 $R3 found
	StrCmp $R4 $R5 notfound
	IntOp $R4 $R4 + 1
	goto loop2
 
	found:
	StrCmp $R8 '+-' setcase
	StrCmp $R7 '3' skipsymbol
	StrCmp $R7 '-3' addsymbol
	StrCmp $R8 '' addsymbol skipsymbol
 
	notfound:
	StrCmp $R8 '+-' addsymbol
	StrCmp $R7 '3' 0 +2
	StrCmp $R5 57 addsymbol +3
	StrCmp $R7 '-3' 0 +5
	StrCmp $R5 57 skipsymbol
	StrCpy $R4 48
	StrCpy $R5 57
	goto loop2
	StrCmp $R8 '' skipsymbol addsymbol
 
	setcase:
	StrCpy $R2 $R3
	addsymbol:
	StrCpy $R1 $R1$R2
	skipsymbol:
	IntOp $R6 $R6 + 1
	goto loop
 
	error:
	SetErrors
	StrCpy $R0 ''
	goto end
 
	restartchk:
	StrCpy $R0 $R1
	StrCmp $2 '' 0 restart1
	StrCmp $R8 '+-' 0 restart2
 
	end:
	Pop $R8
	Pop $R7
	Pop $R6
	Pop $R5
	Pop $R4
	Pop $R3
	Pop $R2
	Pop $R1
	Pop $7
	Pop $6
	Pop $5
	Pop $4
	Pop $3
	Pop $2
	Pop $1
	Pop $0
	Exch $R0
FunctionEnd