StrFilter: Difference between revisions
From NSIS Wiki
Jump to navigationJump to search
Instructor (talk | contribs) No edit summary |
Instructor (talk | contribs) No edit summary |
||
Line 363: | 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:15, 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