StrFilter: Difference between revisions

From NSIS Wiki
Jump to navigationJump to search
m (Adding new author and category links.)
No edit summary
Line 2: Line 2:


== Links ==
== Links ==
; Latest version of headers "nsh.zip":
; Latest version of headers "nsh.zip":
: http://forums.winamp.com/showthread.php?s=&threadid=203228&goto=lastpost
: 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.
If a function is used without header, put the function code in your script before calling it.


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


Line 18: Line 20:


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 51: Line 53:
-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 150: Line 160:
Pop $0
Pop $0
Exch $R0
Exch $R0
FunctionEnd*/
FunctionEnd
 
</highlight-nsis>


;---------------------------------------------------------------------------
== The Function Code==


<highlight-nsis>
Function StrFilter
Function StrFilter
!define StrFilter `!insertmacro StrFilterCall`
!define StrFilter `!insertmacro StrFilterCall`
Line 352: Line 363:
Pop $0
Pop $0
Exch $R0
Exch $R0
FunctionEnd</highlight-nsis>
FunctionEnd
</highlight-nsis>


[[Category:String Functions]]
[[Category:String Functions]]

Revision as of 14:14, 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 header, put the function code in your script before calling it.

The 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

The 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