/*਍ഀ o-----------------------------------------------------------------------------o਍ഀ |String Functions Header File 1.09 |਍ഀ (-----------------------------------------------------------------------------)਍ഀ | By deguix / A Header file for NSIS 2.01 |਍ഀ | -------------------------------|਍ഀ | |਍ഀ | This header file contains NSIS functions for string manipulation. |਍ഀ o-----------------------------------------------------------------------------o਍ഀ */਍ഀ ਍ഀ !verbose push਍ഀ !verbose 3਍ഀ !ifndef STRFUNC_VERBOSITY਍ഀ !define STRFUNC_VERBOSITY 3਍ഀ !endif਍ഀ !define _STRFUNC_VERBOSITY ${STRFUNC_VERBOSITY}਍ഀ !undef STRFUNC_VERBOSITY਍ഀ !verbose ${_STRFUNC_VERBOSITY}਍ഀ ਍ഀ !include LogicLib.nsh਍ഀ ਍ഀ !ifndef STRFUNC਍ഀ ਍ഀ !define FALSE 0਍ഀ !define TRUE 1਍ഀ ਍ഀ ;Header File Identification਍ഀ ਍ഀ !define STRFUNC `String Functions Header File`਍ഀ !define STRFUNC_SHORT `StrFunc`਍ഀ !define STRFUNC_CREDITS `2004 Diego Pedroso`਍ഀ ਍ഀ ;Header File Version਍ഀ ਍ഀ !define STRFUNC_VERMAJ 1਍ഀ !define STRFUNC_VERMED 09਍ഀ ;!define STRFUNC_VERMIN 0਍ഀ ;!define STRFUNC_VERBLD 0਍ഀ ਍ഀ !define STRFUNC_VER `${STRFUNC_VERMAJ}.${STRFUNC_VERMED}`਍ഀ ਍ഀ ;Header File Init Message Prefix and Postfix਍ഀ ਍ഀ !define STRFUNC_INITMSGPRE `----------------------------------------------------------------------$\r$\n`਍ഀ !define STRFUNC_INITMSGPOST `$\r$\n----------------------------------------------------------------------$\r$\n`਍ഀ ਍ഀ ;Header File Init Message਍ഀ ਍ഀ !verbose push਍ഀ !verbose 4਍ഀ !echo `${STRFUNC_INITMSGPRE}NSIS ${STRFUNC} ${STRFUNC_VER} - Copyright ${STRFUNC_CREDITS}${STRFUNC_INITMSGPOST}`਍ഀ !verbose pop਍ഀ ਍ഀ ;Header File Function Init Message Prefix and Postfix਍ഀ ਍ഀ !define STRFUNC_FUNCMSGPRE ``਍ഀ !define STRFUNC_FUNCMSGPOST ``਍ഀ ਍ഀ ;Header File Function Macros਍ഀ ਍ഀ !macro STRFUNC_FUNCLIST_INSERT Name਍ഀ !ifdef StrFunc_List਍ഀ !define StrFunc_List2 `${StrFunc_List}`਍ഀ !undef StrFunc_List਍ഀ !define StrFunc_List `${StrFunc_List2}|${Name}`਍ഀ !undef StrFunc_List2਍ഀ !else਍ഀ !define StrFunc_List `${Name}`਍ഀ !endif਍ഀ !macroend਍ഀ ਍ഀ !macro STRFUNC_DEFFUNC Name਍ഀ !insertmacro STRFUNC_FUNCLIST_INSERT ${Name}਍ഀ ਍ഀ !define `${Name}` `!insertmacro FUNCTION_STRING_${Name}`਍ഀ !define `Un${Name}` `!insertmacro FUNCTION_STRING_Un${Name}`਍ഀ !macroend਍ഀ ਍ഀ !macro STRFUNC_FUNC ShortName Credits਍ഀ !verbose push਍ഀ !verbose 4਍ഀ ਍ഀ !ifndef `Un${ShortName}`਍ഀ !echo `${STRFUNC_FUNCMSGPRE}$ {Un${ShortName}} - Copyright ${Credits}${STRFUNC_FUNCMSGPOST}`਍ഀ !verbose pop਍ഀ !define `Un${ShortName}` `!insertmacro FUNCTION_STRING_Un${ShortName}_Call`਍ഀ !define `Un${ShortName}_INCLUDED`਍ഀ Function `un.${ShortName}`਍ഀ !else਍ഀ !echo `${STRFUNC_FUNCMSGPRE}$ {${ShortName}} - Copyright ${Credits}${STRFUNC_FUNCMSGPOST}`਍ഀ !verbose pop਍ഀ !undef `${ShortName}`਍ഀ !define `${ShortName}` `!insertmacro FUNCTION_STRING_${ShortName}_Call`਍ഀ !define `${ShortName}_INCLUDED`਍ഀ Function `${ShortName}`਍ഀ !endif਍ഀ !macroend਍ഀ ਍ഀ ;Function Names Startup Definition਍ഀ ਍ഀ !insertmacro STRFUNC_DEFFUNC StrCase਍ഀ !define StrCase_List `ResultVar|String|Type`਍ഀ !define StrCase_TypeList `Output|Text|Option U L T S <>`਍ഀ !macro `FUNCTION_STRING_UnStrCase`਍ഀ !undef UnStrCase਍ഀ !insertmacro FUNCTION_STRING_StrCase਍ഀ !macroend਍ഀ ਍ഀ !insertmacro STRFUNC_DEFFUNC StrClb਍ഀ !define StrClb_List `ResultVar|String|Action`਍ഀ !define StrClb_TypeList `Output|Text|Option > < <>`਍ഀ !macro `FUNCTION_STRING_UnStrClb`਍ഀ !undef UnStrClb਍ഀ !insertmacro FUNCTION_STRING_StrClb਍ഀ !macroend਍ഀ ਍ഀ !insertmacro STRFUNC_DEFFUNC StrIOToNSIS਍ഀ !define StrIOToNSIS_List `ResultVar|String`਍ഀ !define StrIOToNSIS_TypeList `Output|Text`਍ഀ !macro `FUNCTION_STRING_UnStrIOToNSIS`਍ഀ !undef UnStrIOToNSIS਍ഀ !insertmacro FUNCTION_STRING_StrIOToNSIS਍ഀ !macroend਍ഀ ਍ഀ !insertmacro STRFUNC_DEFFUNC StrLoc਍ഀ !define StrLoc_List `ResultVar|String|StrToSearchFor|CounterDirection`਍ഀ !define StrLoc_TypeList `Output|Text|Text|Option > <`਍ഀ !macro `FUNCTION_STRING_UnStrLoc`਍ഀ !undef UnStrLoc਍ഀ !insertmacro FUNCTION_STRING_StrLoc਍ഀ !macroend਍ഀ ਍ഀ !insertmacro STRFUNC_DEFFUNC StrNSISToIO਍ഀ !define StrNSISToIO_List `ResultVar|String`਍ഀ !define StrNSISToIO_TypeList `Output|Text`਍ഀ !macro `FUNCTION_STRING_UnStrNSISToIO`਍ഀ !undef UnStrNSISToIO਍ഀ !insertmacro FUNCTION_STRING_StrNSISToIO਍ഀ !macroend਍ഀ ਍ഀ !insertmacro STRFUNC_DEFFUNC StrRep਍ഀ !define StrRep_List `ResultVar|String|StrToReplace|ReplacementString`਍ഀ !define StrRep_TypeList `Output|Text|Text|Text`਍ഀ !macro `FUNCTION_STRING_UnStrRep`਍ഀ !undef UnStrRep਍ഀ !insertmacro FUNCTION_STRING_StrRep਍ഀ !macroend਍ഀ ਍ഀ !insertmacro STRFUNC_DEFFUNC StrSort਍ഀ !define StrSort_List `ResultVar|String|LeftStr|CenterStr|RightStr|IncludeLeftStr|IncludeCenterStr|IncludeRightStr`਍ഀ !define StrSort_TypeList `Output|Text|Text|Text|Text|Option 1 0|Option 1 0|Option 1 0`਍ഀ !macro `FUNCTION_STRING_UnStrSort`਍ഀ !undef UnStrSort਍ഀ !insertmacro FUNCTION_STRING_StrSort਍ഀ !macroend਍ഀ ਍ഀ !insertmacro STRFUNC_DEFFUNC StrStr਍ഀ !define StrStr_List `ResultVar|String|StrToSearchFor`਍ഀ !define StrStr_TypeList `Output|Text|Text`਍ഀ !macro `FUNCTION_STRING_UnStrStr`਍ഀ !undef UnStrStr਍ഀ !insertmacro FUNCTION_STRING_StrStr਍ഀ !macroend਍ഀ ਍ഀ !insertmacro STRFUNC_DEFFUNC StrStrAdv਍ഀ !define StrStrAdv_List `ResultVar|String|StrToSearchFor|SearchDirection|ResultStrDirection|DisplayStrToSearch|Loops|CaseSensitive`਍ഀ !define StrStrAdv_TypeList `Output|Text|Text|Option > <|Option > <|Option 1 0|Text|Option 0 1`਍ഀ !macro `FUNCTION_STRING_UnStrStrAdv`਍ഀ !undef UnStrStrAdv਍ഀ !insertmacro FUNCTION_STRING_StrStrAdv਍ഀ !macroend਍ഀ ਍ഀ !insertmacro STRFUNC_DEFFUNC StrTok਍ഀ !define StrTok_List `ResultVar|String|Separators|ResultPart|SkipEmptyParts`਍ഀ !define StrTok_TypeList `Output|Text|Text|Mixed L|Option 1 0`਍ഀ !macro `FUNCTION_STRING_UnStrTok`਍ഀ !undef UnStrTok਍ഀ !insertmacro FUNCTION_STRING_StrTok਍ഀ !macroend਍ഀ ਍ഀ !insertmacro STRFUNC_DEFFUNC StrTrimNewLines਍ഀ !define StrTrimNewLines_List `ResultVar|String`਍ഀ !define StrTrimNewLines_TypeList `Output|Text`਍ഀ !macro `FUNCTION_STRING_UnStrTrimNewLines`਍ഀ !undef UnStrTrimNewLines਍ഀ !insertmacro FUNCTION_STRING_StrTrimNewLines਍ഀ !macroend਍ഀ ਍ഀ ;Function Codes for Install and Uninstall਍ഀ ਍ഀ # Function StrCase਍ഀ ################਍ഀ ਍ഀ !macro FUNCTION_STRING_StrCase਍ഀ !insertmacro STRFUNC_FUNC `StrCase` `2004 Diego Pedroso - Based on functions by Dave Laundon`਍ഀ ਍ഀ /*After this point:਍ഀ ------------------------------------------਍ഀ $0 = String (input)਍ഀ $1 = Type (input)਍ഀ $2 = StrLength (temp)਍ഀ $3 = StartChar (temp)਍ഀ $4 = EndChar (temp)਍ഀ $5 = ResultStr (temp)਍ഀ $6 = CurrentChar (temp)਍ഀ $7 = LastChar (temp)਍ഀ $8 = Temp (temp)*/਍ഀ ਍ഀ ;Get input from user਍ഀ Exch $1਍ഀ Exch਍ഀ Exch $0਍ഀ Exch਍ഀ Push $2਍ഀ Push $3਍ഀ Push $4਍ഀ Push $5਍ഀ Push $6਍ഀ Push $7਍ഀ Push $8਍ഀ ਍ഀ ;Initialize variables਍ഀ StrCpy $2 ""਍ഀ StrCpy $3 ""਍ഀ StrCpy $4 ""਍ഀ StrCpy $5 ""਍ഀ StrCpy $6 ""਍ഀ StrCpy $7 ""਍ഀ StrCpy $8 ""਍ഀ ਍ഀ ;Upper and lower cases are simple to use਍ഀ ${If} $1 == "U"਍ഀ ਍ഀ ;Upper Case System:਍ഀ ;------------------਍ഀ ; Convert all characters to upper case.਍ഀ ਍ഀ System::Call "User32::CharUpperW(w r0 r5)i"਍ഀ Goto StrCase_End਍ഀ ${ElseIf} $1 == "L"਍ഀ ਍ഀ ;Lower Case System:਍ഀ ;------------------਍ഀ ; Convert all characters to lower case.਍ഀ ਍ഀ System::Call "User32::CharLowerW(w r0 r5)i"਍ഀ Goto StrCase_End਍ഀ ${EndIf}਍ഀ ਍ഀ ;For the rest of cases:਍ഀ ;Get "String" length਍ഀ StrLen $2 $0਍ഀ ਍ഀ ;Make a loop until the end of "String"਍ഀ ${For} $3 0 $2਍ഀ ;Add 1 to "EndChar" counter also਍ഀ IntOp $4 $3 + 1਍ഀ ਍ഀ # Step 1: Detect one character at a time਍ഀ ਍ഀ ;Remove characters before "StartChar" except when਍ഀ ;"StartChar" is the first character of "String"਍ഀ ${If} $3 <> 0਍ഀ StrCpy $6 $0 `` $3਍ഀ ${EndIf}਍ഀ ਍ഀ ;Remove characters after "EndChar" except when਍ഀ ;"EndChar" is the last character of "String"਍ഀ ${If} $4 <> $2਍ഀ ${If} $3 = 0਍ഀ StrCpy $6 $0 1਍ഀ ${Else}਍ഀ StrCpy $6 $6 1਍ഀ ${EndIf}਍ഀ ${EndIf}਍ഀ ਍ഀ # Step 2: Convert to the advanced case user chose:਍ഀ ਍ഀ ${If} $1 == "T"਍ഀ ਍ഀ ;Title Case System:਍ഀ ;------------------਍ഀ ; Convert all characters after a non-alphabetic character to upper case.਍ഀ ; Else convert to lower case.਍ഀ ਍ഀ ;Use "IsCharAlpha" for the job਍ഀ System::Call "*(&w1 r7) i .r8"਍ഀ System::Call "*$8(&i1 .r7)"਍ഀ System::Free $8਍ഀ System::Call "user32::IsCharAlphaW(i r7) i .r8"਍ഀ ਍ഀ ;Verify "IsCharAlpha" result and convert the character਍ഀ ${If} $8 = 0਍ഀ System::Call "User32::CharUpperW(w r6 r6)i"਍ഀ ${Else}਍ഀ System::Call "User32::CharLowerW(w r6 r6)i"਍ഀ ${EndIf}਍ഀ ${ElseIf} $1 == "S"਍ഀ ਍ഀ ;Sentence Case System:਍ഀ ;------------------਍ഀ ; Convert all characters after a ".", "!" or "?" character to upper case.਍ഀ ; Else convert to lower case. Spaces or tabs after these marks are ignored.਍ഀ ਍ഀ ;Detect current characters and ignore if necessary਍ഀ ${If} $6 == " "਍ഀ ${OrIf} $6 == "$\t"਍ഀ Goto IgnoreLetter਍ഀ ${EndIf}਍ഀ ਍ഀ ;Detect last characters and convert਍ഀ ${If} $7 == "."਍ഀ ${OrIf} $7 == "!"਍ഀ ${OrIf} $7 == "?"਍ഀ ${OrIf} $7 == ""਍ഀ System::Call "User32::CharUpperW(w r6 r6)i"਍ഀ ${Else}਍ഀ System::Call "User32::CharLowerW(w r6 r6)i"਍ഀ ${EndIf}਍ഀ ${ElseIf} $1 == "<>"਍ഀ ਍ഀ ;Switch Case System:਍ഀ ;------------------਍ഀ ; Switch all characters cases to their inverse case.਍ഀ ਍ഀ ;Use "IsCharUpper" for the job਍ഀ System::Call "*(&w1 r6) i .r8"਍ഀ System::Call "*$8(&i1 .r7)"਍ഀ System::Free $8਍ഀ System::Call "user32::IsCharUpperW(i r7) i .r8"਍ഀ ਍ഀ ;Verify "IsCharUpper" result and convert the character਍ഀ ${If} $8 = 0਍ഀ System::Call "User32::CharUpperW(w r6 r6)i"਍ഀ ${Else}਍ഀ System::Call "User32::CharLowerW(w r6 r6)i"਍ഀ ${EndIf}਍ഀ ${EndIf}਍ഀ ਍ഀ ;Write the character to "LastChar"਍ഀ StrCpy $7 $6਍ഀ ਍ഀ IgnoreLetter:਍ഀ ;Add this character to "ResultStr"਍ഀ StrCpy $5 `$5$6`਍ഀ ${Next}਍ഀ ਍ഀ StrCase_End:਍ഀ ਍ഀ /*After this point:਍ഀ ------------------------------------------਍ഀ $0 = OutVar (output)*/਍ഀ ਍ഀ ; Copy "ResultStr" to "OutVar"਍ഀ StrCpy $0 $5਍ഀ ਍ഀ ;Return output to user਍ഀ Pop $8਍ഀ Pop $7਍ഀ Pop $6਍ഀ Pop $5਍ഀ Pop $4਍ഀ Pop $3਍ഀ Pop $2਍ഀ Pop $1਍ഀ Exch $0਍ഀ FunctionEnd਍ഀ ਍ഀ !macroend਍ഀ ਍ഀ !macro FUNCTION_STRING_StrClb਍ഀ !insertmacro STRFUNC_FUNC `StrClb` `2004 Diego Pedroso - Based on functions by Nik Medved`਍ഀ ਍ഀ /*After this point:਍ഀ ------------------------------------------਍ഀ $0 = String (input)਍ഀ $1 = Action (input)਍ഀ $2 = Lock/Unlock (temp)਍ഀ $3 = Temp (temp)਍ഀ $4 = Temp2 (temp)*/਍ഀ ਍ഀ ;Get input from user਍ഀ ਍ഀ Exch $1਍ഀ Exch਍ഀ Exch $0਍ഀ Exch਍ഀ Push $2਍ഀ Push $3਍ഀ Push $4਍ഀ ਍ഀ StrCpy $2 ""਍ഀ StrCpy $3 ""਍ഀ StrCpy $4 ""਍ഀ ਍ഀ ;Open the clipboard to do the operations the user chose (kichik's fix)਍ഀ System::Call 'user32::OpenClipboard(i $HWNDPARENT)'਍ഀ ਍ഀ ${If} $1 == ">" ;Set਍ഀ ਍ഀ ;Step 1: Clear the clipboard਍ഀ System::Call 'user32::EmptyClipboard()'਍ഀ ਍ഀ ;Step 2: Allocate global heap਍ഀ StrLen $2 $0਍ഀ IntOp $2 $2 + 1਍ഀ ਍ഀ ;Because of Unicode x2਍ഀ IntOp $2 $2 * 2਍ഀ System::Call 'kernel32::GlobalAlloc(i 2, i r2) i.r2'਍ഀ ਍ഀ ;Step 3: Lock the handle਍ഀ System::Call 'kernel32::GlobalLock(i r2) i.r3'਍ഀ ਍ഀ ;Step 4: Copy the text to locked clipboard buffer਍ഀ System::Call 'kernel32::lstrcpyW(i r3, w r0)'਍ഀ ਍ഀ ;Step 5: Unlock the handle again਍ഀ System::Call 'kernel32::GlobalUnlock(i r2)'਍ഀ ਍ഀ ;Step 6: Set the information to the clipboard਍ഀ System::Call 'user32::SetClipboardData(i 1, i r2)'਍ഀ ਍ഀ StrCpy $0 ""਍ഀ ਍ഀ ${ElseIf} $1 == "<" ;Get਍ഀ ਍ഀ ;Step 1: Get clipboard data਍ഀ System::Call 'user32::GetClipboardData(i 1) i .r2'਍ഀ ਍ഀ ;Step 2: Lock and copy data (kichik's fix)਍ഀ System::Call 'kernel32::GlobalLock(i r2) w .r0'਍ഀ ਍ഀ ;Step 3: Unlock (kichik's fix)਍ഀ System::Call 'kernel32::GlobalUnlock(i r2)'਍ഀ ਍ഀ ${ElseIf} $1 == "<>" ;Swap਍ഀ ਍ഀ ;Step 1: Get clipboard data਍ഀ System::Call 'user32::GetClipboardData(i 1) i .r2'਍ഀ ਍ഀ ;Step 2: Lock and copy data (kichik's fix)਍ഀ System::Call 'kernel32::GlobalLock(i r2) w .r4'਍ഀ ਍ഀ ;Step 3: Unlock (kichik's fix)਍ഀ System::Call 'kernel32::GlobalUnlock(i r2)'਍ഀ ਍ഀ ;Step 4: Clear the clipboard਍ഀ System::Call 'user32::EmptyClipboard()'਍ഀ ਍ഀ ;Step 5: Allocate global heap਍ഀ StrLen $2 $0਍ഀ IntOp $2 $2 + 1਍ഀ ;Because of Unicode x2਍ഀ IntOp $2 $2 * 2਍ഀ System::Call 'kernel32::GlobalAlloc(i 2, i r2) i.r2'਍ഀ ਍ഀ ;Step 6: Lock the handle਍ഀ System::Call 'kernel32::GlobalLock(i r2) i.r3'਍ഀ ਍ഀ ;Step 7: Copy the text to locked clipboard buffer਍ഀ System::Call 'kernel32::lstrcpyW(i r3, w r0)'਍ഀ ਍ഀ ;Step 8: Unlock the handle again਍ഀ System::Call 'kernel32::GlobalUnlock(i r2)'਍ഀ ਍ഀ ;Step 9: Set the information to the clipboard਍ഀ System::Call 'user32::SetClipboardData(i 1, i r2)'਍ഀ ਍ഀ StrCpy $0 $4਍ഀ ${Else} ;Clear਍ഀ ਍ഀ ;Step 1: Clear the clipboard਍ഀ System::Call 'user32::EmptyClipboard()'਍ഀ ਍ഀ StrCpy $0 ""਍ഀ ${EndIf}਍ഀ ਍ഀ ;Close the clipboard਍ഀ System::Call 'user32::CloseClipboard()'਍ഀ ਍ഀ /*After this point:਍ഀ ------------------------------------------਍ഀ $0 = OutVar (output)*/਍ഀ ਍ഀ ;Return result to user਍ഀ Pop $4਍ഀ Pop $3਍ഀ Pop $2਍ഀ Pop $1਍ഀ Exch $0਍ഀ FunctionEnd਍ഀ ਍ഀ !macroend਍ഀ ਍ഀ # Function StrIOToNSIS਍ഀ ####################਍ഀ ਍ഀ !macro FUNCTION_STRING_StrIOToNSIS਍ഀ !insertmacro STRFUNC_FUNC `StrIOToNSIS` `2004 "bluenet" - Based on functions by Amir Szekely, Joost Verburg, Dave Laundon and Diego Pedroso`਍ഀ ਍ഀ /*After this point:਍ഀ ------------------------------------------਍ഀ $R0 = String (input/output)਍ഀ $R1 = StartCharPos (temp)਍ഀ $R2 = StrLen (temp)਍ഀ $R3 = TempStr (temp)਍ഀ $R4 = TempRepStr (temp)*/਍ഀ ਍ഀ ;Get input from user਍ഀ Exch $R0਍ഀ Push $R1਍ഀ Push $R2਍ഀ Push $R3਍ഀ Push $R4਍ഀ ਍ഀ ;Get "String" length਍ഀ StrLen $R2 $R0਍ഀ ਍ഀ ;Loop until "String" end is reached਍ഀ ${For} $R1 0 $R2਍ഀ ;Get the next "String" characters਍ഀ StrCpy $R3 $R0 2 $R1਍ഀ ਍ഀ ;Detect if current character is:਍ഀ ${If} $R3 == "\\" ;Back-slash਍ഀ StrCpy $R4 "\"਍ഀ ${ElseIf} $R3 == "\r" ;Carriage return਍ഀ StrCpy $R4 "$\r"਍ഀ ${ElseIf} $R3 == "\n" ;Line feed਍ഀ StrCpy $R4 "$\n"਍ഀ ${ElseIf} $R3 == "\t" ;Tab਍ഀ StrCpy $R4 "$\t"਍ഀ ${Else} ;Anything else਍ഀ StrCpy $R4 ""਍ഀ ${EndIf}਍ഀ ਍ഀ ;Detect if "TempRepStr" is not empty਍ഀ ${If} $R4 != ""਍ഀ ;Replace the old characters with the new one਍ഀ StrCpy $R3 $R0 $R1਍ഀ IntOp $R1 $R1 + 2਍ഀ StrCpy $R0 $R0 "" $R1਍ഀ StrCpy $R0 "$R3$R4$R0"਍ഀ IntOp $R2 $R2 - 1 ;Decrease "StrLen"਍ഀ IntOp $R1 $R1 - 2 ;Go back to the next character਍ഀ ${EndIf}਍ഀ ${Next}਍ഀ Pop $R4਍ഀ Pop $R3਍ഀ Pop $R2਍ഀ Pop $R1਍ഀ Exch $R0਍ഀ FunctionEnd਍ഀ !macroend਍ഀ ਍ഀ # Function StrLoc਍ഀ ###############਍ഀ ਍ഀ !macro FUNCTION_STRING_StrLoc਍ഀ !insertmacro STRFUNC_FUNC `StrLoc` `2004 Diego Pedroso - Based on functions by Ximon Eighteen`਍ഀ ਍ഀ /*After this point:਍ഀ ------------------------------------------਍ഀ $R0 = OffsetDirection (input)਍ഀ $R1 = StrToSearch (input)਍ഀ $R2 = String (input)਍ഀ $R3 = StrToSearchLen (temp)਍ഀ $R4 = StrLen (temp)਍ഀ $R5 = StartCharPos (temp)਍ഀ $R6 = TempStr (temp)*/਍ഀ ਍ഀ ;Get input from user਍ഀ Exch $R0਍ഀ Exch਍ഀ Exch $R1਍ഀ Exch 2਍ഀ Exch $R2਍ഀ Push $R3਍ഀ Push $R4਍ഀ Push $R5਍ഀ Push $R6਍ഀ ਍ഀ ;Get "String" and "StrToSearch" length਍ഀ StrLen $R3 $R1਍ഀ StrLen $R4 $R2਍ഀ ;Start "StartCharPos" counter਍ഀ StrCpy $R5 0਍ഀ ਍ഀ ;Loop until "StrToSearch" is found or "String" reaches its end਍ഀ ${Do}਍ഀ ;Remove everything before and after the searched part ("TempStr")਍ഀ StrCpy $R6 $R2 $R3 $R5਍ഀ ਍ഀ ;Compare "TempStr" with "StrToSearch"਍ഀ ${If} $R6 == $R1਍ഀ ${If} $R0 == `<`਍ഀ IntOp $R6 $R3 + $R5਍ഀ IntOp $R0 $R4 - $R6਍ഀ ${Else}਍ഀ StrCpy $R0 $R5਍ഀ ${EndIf}਍ഀ ${ExitDo}਍ഀ ${EndIf}਍ഀ ;If not "StrToSearch", this could be "String" end਍ഀ ${If} $R5 >= $R4਍ഀ StrCpy $R0 ``਍ഀ ${ExitDo}਍ഀ ${EndIf}਍ഀ ;If not, continue the loop਍ഀ IntOp $R5 $R5 + 1਍ഀ ${Loop}਍ഀ ਍ഀ ;Return output to user਍ഀ Pop $R6਍ഀ Pop $R5਍ഀ Pop $R4਍ഀ Pop $R3਍ഀ Pop $R2਍ഀ Exch਍ഀ Pop $R1਍ഀ Exch $R0਍ഀ FunctionEnd਍ഀ ਍ഀ !macroend਍ഀ ਍ഀ # Function StrNSISToIO਍ഀ ####################਍ഀ ਍ഀ !macro FUNCTION_STRING_StrNSISToIO਍ഀ !insertmacro STRFUNC_FUNC `StrNSISToIO` `2004 "bluenet" - Based on functions by Amir Szekely, Joost Verburg, Dave Laundon and Diego Pedroso`਍ഀ ਍ഀ /*After this point:਍ഀ ------------------------------------------਍ഀ $R0 = String (input/output)਍ഀ $R1 = StartCharPos (temp)਍ഀ $R2 = StrLen (temp)਍ഀ $R3 = TempStr (temp)਍ഀ $R4 = TempRepStr (temp)*/਍ഀ ਍ഀ ;Get input from user਍ഀ Exch $R0਍ഀ Push $R1਍ഀ Push $R2਍ഀ Push $R3਍ഀ Push $R4਍ഀ ਍ഀ ;Get "String" length਍ഀ StrLen $R2 $R0਍ഀ ਍ഀ ;Loop until "String" end is reached਍ഀ ${For} $R1 0 $R2਍ഀ ;Get the next "String" character਍ഀ StrCpy $R3 $R0 1 $R1਍ഀ ਍ഀ ;Detect if current character is:਍ഀ ${If} $R3 == "$\r" ;Back-slash਍ഀ StrCpy $R4 "\r"਍ഀ ${ElseIf} $R3 == "$\n" ;Carriage return਍ഀ StrCpy $R4 "\n"਍ഀ ${ElseIf} $R3 == "$\t" ;Line feed਍ഀ StrCpy $R4 "\t"਍ഀ ${ElseIf} $R3 == "\" ;Tab਍ഀ StrCpy $R4 "\\"਍ഀ ${Else} ;Anything else਍ഀ StrCpy $R4 ""਍ഀ ${EndIf}਍ഀ ਍ഀ ;Detect if "TempRepStr" is not empty਍ഀ ${If} $R4 != ""਍ഀ ;Replace the old character with the new ones਍ഀ StrCpy $R3 $R0 $R1਍ഀ IntOp $R1 $R1 + 1਍ഀ StrCpy $R0 $R0 "" $R1਍ഀ StrCpy $R0 "$R3$R4$R0"਍ഀ IntOp $R2 $R2 + 1 ;Increase "StrLen"਍ഀ ${EndIf}਍ഀ ${Next}਍ഀ ਍ഀ ;Return output to user਍ഀ Pop $R4਍ഀ Pop $R3਍ഀ Pop $R2਍ഀ Pop $R1਍ഀ Exch $R0਍ഀ FunctionEnd਍ഀ !macroend਍ഀ ਍ഀ # Function StrRep਍ഀ ###############਍ഀ ਍ഀ !macro FUNCTION_STRING_StrRep਍ഀ !insertmacro STRFUNC_FUNC `StrRep` `2004 Diego Pedroso - Based on functions by Hendri Adriaens`਍ഀ ਍ഀ /*After this point:਍ഀ ------------------------------------------਍ഀ $R0 = ReplacementString (input)਍ഀ $R1 = StrToSearch (input)਍ഀ $R2 = String (input)਍ഀ $R3 = RepStrLen (temp)਍ഀ $R4 = StrToSearchLen (temp)਍ഀ $R5 = StrLen (temp)਍ഀ $R6 = StartCharPos (temp)਍ഀ $R7 = TempStrL (temp)਍ഀ $R8 = TempStrR (temp)*/਍ഀ ਍ഀ ;Get input from user਍ഀ Exch $R0਍ഀ Exch਍ഀ Exch $R1਍ഀ Exch਍ഀ Exch 2਍ഀ Exch $R2਍ഀ Push $R3਍ഀ Push $R4਍ഀ Push $R5਍ഀ Push $R6਍ഀ Push $R7਍ഀ Push $R8਍ഀ ਍ഀ ;Return "String" if "StrToSearch" is ""਍ഀ ${IfThen} $R1 == "" ${|} Goto Done ${|}਍ഀ ਍ഀ ;Get "ReplacementString", "String" and "StrToSearch" length਍ഀ StrLen $R3 $R0਍ഀ StrLen $R4 $R1਍ഀ StrLen $R5 $R2਍ഀ ;Start "StartCharPos" counter਍ഀ StrCpy $R6 0਍ഀ ਍ഀ ;Loop until "StrToSearch" is found or "String" reaches its end਍ഀ ${Do}਍ഀ ;Remove everything before and after the searched part ("TempStrL")਍ഀ StrCpy $R7 $R2 $R4 $R6਍ഀ ਍ഀ ;Compare "TempStrL" with "StrToSearch"਍ഀ ${If} $R7 == $R1਍ഀ ;Split "String" to replace the string wanted਍ഀ StrCpy $R7 $R2 $R6 ;TempStrL਍ഀ ਍ഀ ;Calc: "StartCharPos" + "StrToSearchLen" = EndCharPos਍ഀ IntOp $R8 $R6 + $R4਍ഀ ਍ഀ StrCpy $R8 $R2 "" $R8 ;TempStrR਍ഀ ਍ഀ ;Insert the new string between the two separated parts of "String"਍ഀ StrCpy $R2 $R7$R0$R8਍ഀ ;Now calculate the new "StrLen" and "StartCharPos"਍ഀ StrLen $R5 $R2਍ഀ IntOp $R6 $R6 + $R3਍ഀ ${Continue}਍ഀ ${EndIf}਍ഀ ਍ഀ ;If not "StrToSearch", this could be "String" end਍ഀ ${IfThen} $R6 >= $R5 ${|} ${ExitDo} ${|}਍ഀ ;If not, continue the loop਍ഀ IntOp $R6 $R6 + 1਍ഀ ${Loop}਍ഀ ਍ഀ Done:਍ഀ ਍ഀ /*After this point:਍ഀ ------------------------------------------਍ഀ $R0 = OutVar (output)*/਍ഀ ਍ഀ ;Return output to user਍ഀ StrCpy $R0 $R2਍ഀ Pop $R8਍ഀ Pop $R7਍ഀ Pop $R6਍ഀ Pop $R5਍ഀ Pop $R4਍ഀ Pop $R3਍ഀ Pop $R2਍ഀ Pop $R1਍ഀ Exch $R0਍ഀ FunctionEnd਍ഀ ਍ഀ !macroend਍ഀ ਍ഀ # Function StrSort਍ഀ ################਍ഀ ਍ഀ !macro FUNCTION_STRING_StrSort਍ഀ !insertmacro STRFUNC_FUNC `StrSort` `2004 Diego Pedroso - Based on functions by Stuart Welch`਍ഀ ਍ഀ /*After this point:਍ഀ ------------------------------------------਍ഀ $R0 = String (input)਍ഀ $R1 = LeftStr (input)਍ഀ $R2 = CenterStr (input)਍ഀ $R3 = RightStr (input)਍ഀ $R4 = IncludeLeftStr (input)਍ഀ $R5 = IncludeCenterStr (input)਍ഀ $R6 = IncludeRightStr (input)਍ഀ ਍ഀ $0 = StrLen (temp)਍ഀ $1 = LeftStrLen (temp)਍ഀ $2 = CenterStrLen (temp)਍ഀ $3 = RightStrLen (temp)਍ഀ $4 = StartPos (temp)਍ഀ $5 = EndPos (temp)਍ഀ $6 = StartCharPos (temp)਍ഀ $7 = EndCharPos (temp)਍ഀ $8 = TempStr (temp)*/਍ഀ ਍ഀ ;Get input from user਍ഀ Exch $R6਍ഀ Exch਍ഀ Exch $R5਍ഀ Exch਍ഀ Exch 2਍ഀ Exch $R4਍ഀ Exch 2਍ഀ Exch 3਍ഀ Exch $R3਍ഀ Exch 3਍ഀ Exch 4਍ഀ Exch $R2਍ഀ Exch 4਍ഀ Exch 5਍ഀ Exch $R1਍ഀ Exch 5਍ഀ Exch 6਍ഀ Exch $R0਍ഀ Exch 6਍ഀ Push $0਍ഀ Push $1਍ഀ Push $2਍ഀ Push $3਍ഀ Push $4਍ഀ Push $5਍ഀ Push $6਍ഀ Push $7਍ഀ Push $8਍ഀ ਍ഀ ;Parameter defaults਍ഀ ${IfThen} $R4 == `` ${|} StrCpy $R4 `1` ${|}਍ഀ ${IfThen} $R5 == `` ${|} StrCpy $R5 `1` ${|}਍ഀ ${IfThen} $R6 == `` ${|} StrCpy $R6 `1` ${|}਍ഀ ਍ഀ ;Get "String", "CenterStr", "LeftStr" and "RightStr" length਍ഀ StrLen $0 $R0਍ഀ StrLen $1 $R1਍ഀ StrLen $2 $R2਍ഀ StrLen $3 $R3਍ഀ ;Start "StartCharPos" counter਍ഀ StrCpy $6 0਍ഀ ;Start "EndCharPos" counter based on "CenterStr" length਍ഀ IntOp $7 $6 + $2਍ഀ ਍ഀ ;Loop until "CenterStr" is found or "String" reaches its end਍ഀ ${Do}਍ഀ ;Remove everything before and after the searched part ("TempStr")਍ഀ StrCpy $8 $R0 $2 $6਍ഀ ਍ഀ ;Compare "TempStr" with "CenterStr"਍ഀ ${IfThen} $8 == $R2 ${|} ${ExitDo} ${|}਍ഀ ;If not, this could be "String" end਍ഀ ${IfThen} $7 >= $0 ${|} Goto Done ${|}਍ഀ ;If not, continue the loop਍ഀ IntOp $6 $6 + 1਍ഀ IntOp $7 $7 + 1਍ഀ ${Loop}਍ഀ ਍ഀ # "CenterStr" was found਍ഀ ਍ഀ ;Remove "CenterStr" from "String" if the user wants਍ഀ ${If} $R5 = ${FALSE}਍ഀ StrCpy $8 $R0 $6਍ഀ StrCpy $R0 $R0 `` $7਍ഀ StrCpy $R0 $8$R0਍ഀ ${EndIf}਍ഀ ਍ഀ ;"StartPos" and "EndPos" will record "CenterStr" coordinates for now਍ഀ StrCpy $4 $6਍ഀ StrCpy $5 $7਍ഀ ;"StartCharPos" and "EndCharPos" should be before "CenterStr"਍ഀ IntOp $6 $6 - $1਍ഀ IntOp $7 $6 + $1਍ഀ ਍ഀ ;Loop until "LeftStr" is found or "String" reaches its start਍ഀ ${Do}਍ഀ ;Remove everything before and after the searched part ("TempStr")਍ഀ StrCpy $8 $R0 $1 $6਍ഀ ਍ഀ ;If "LeftStr" is empty਍ഀ ${If} $R1 == ``਍ഀ StrCpy $6 0਍ഀ StrCpy $7 0਍ഀ ${ExitDo}਍ഀ ${EndIf}਍ഀ ਍ഀ ;Compare "TempStr" with "LeftStr"਍ഀ ${IfThen} $8 == $R1 ${|} ${ExitDo} ${|}਍ഀ ;If not, this could be "String" start਍ഀ ${IfThen} $6 <= 0 ${|} ${ExitDo} ${|}਍ഀ ;If not, continue the loop਍ഀ IntOp $6 $6 - 1਍ഀ IntOp $7 $7 - 1਍ഀ ${Loop}਍ഀ ਍ഀ # "LeftStr" is found or "String" start was reached਍ഀ ਍ഀ ;Remove "LeftStr" from "String" if the user wants਍ഀ ${If} $R4 = ${FALSE}਍ഀ IntOp $6 $6 + $1਍ഀ ${EndIf}਍ഀ ਍ഀ ;Record "LeftStr" first character position on "TempStr" (temporarily)਍ഀ StrCpy $8 $6਍ഀ ਍ഀ ;"StartCharPos" and "EndCharPos" should be after "CenterStr"਍ഀ ${If} $R5 = ${FALSE}਍ഀ StrCpy $6 $4਍ഀ ${Else}਍ഀ IntOp $6 $4 + $2਍ഀ ${EndIf}਍ഀ IntOp $7 $6 + $3਍ഀ ਍ഀ ;Record "LeftStr" first character position on "StartPos"਍ഀ StrCpy $4 $8਍ഀ ਍ഀ ;Loop until "RightStr" is found or "String" reaches its end਍ഀ ${Do}਍ഀ ;Remove everything before and after the searched part ("TempStr")਍ഀ StrCpy $8 $R0 $3 $6਍ഀ ਍ഀ ;If "RightStr" is empty਍ഀ ${If} $R3 == ``਍ഀ StrCpy $6 $0਍ഀ StrCpy $7 $0਍ഀ ${ExitDo}਍ഀ ${EndIf}਍ഀ ਍ഀ ;Compare "TempStr" with "RightStr"਍ഀ ${IfThen} $8 == $R3 ${|} ${ExitDo} ${|}਍ഀ ;If not, this could be "String" end਍ഀ ${IfThen} $7 >= $0 ${|} ${ExitDo} ${|}਍ഀ ;If not, continue the loop਍ഀ IntOp $6 $6 + 1਍ഀ IntOp $7 $7 + 1਍ഀ ${Loop}਍ഀ ਍ഀ ;Remove "RightStr" from "String" if the user wants਍ഀ ${If} $R6 = ${FALSE}਍ഀ IntOp $7 $7 - $3਍ഀ ${EndIf}਍ഀ ਍ഀ ;Record "RightStr" last character position on "StartPos"਍ഀ StrCpy $5 $7਍ഀ ਍ഀ ;As the positionment is relative...਍ഀ IntOp $5 $5 - $4਍ഀ ਍ഀ ;Write the string and finish the job਍ഀ StrCpy $R0 $R0 $5 $4਍ഀ Goto +2਍ഀ ਍ഀ Done:਍ഀ StrCpy $R0 ``਍ഀ ਍ഀ /*After this point:਍ഀ ------------------------------------------਍ഀ $R0 = OutVar (output)*/਍ഀ ਍ഀ ;Return output to user਍ഀ Pop $8਍ഀ Pop $7਍ഀ Pop $6਍ഀ Pop $5਍ഀ Pop $4਍ഀ Pop $3਍ഀ Pop $2਍ഀ Pop $1਍ഀ Pop $0਍ഀ Pop $R6਍ഀ Pop $R5਍ഀ Pop $R4਍ഀ Pop $R3਍ഀ Pop $R2਍ഀ Pop $R1਍ഀ Exch $R0਍ഀ FunctionEnd਍ഀ ਍ഀ !macroend਍ഀ ਍ഀ # Function StrStr਍ഀ ###############਍ഀ ਍ഀ !macro FUNCTION_STRING_StrStr਍ഀ !insertmacro STRFUNC_FUNC `StrStr` `2004 Diego Pedroso - Based on functions by Ximon Eighteen`਍ഀ ਍ഀ /*After this point:਍ഀ ------------------------------------------਍ഀ $R0 = StrToSearch (input)਍ഀ $R1 = String (input)਍ഀ $R2 = StrToSearchLen (temp)਍ഀ $R3 = StrLen (temp)਍ഀ $R4 = StartCharPos (temp)਍ഀ $R5 = TempStr (temp)*/਍ഀ ਍ഀ ;Get input from user਍ഀ Exch $R0਍ഀ Exch਍ഀ Exch $R1਍ഀ Push $R2਍ഀ Push $R3਍ഀ Push $R4਍ഀ Push $R5਍ഀ ਍ഀ ;Get "String" and "StrToSearch" length਍ഀ StrLen $R2 $R0਍ഀ StrLen $R3 $R1਍ഀ ;Start "StartCharPos" counter਍ഀ StrCpy $R4 0਍ഀ ਍ഀ ;Loop until "StrToSearch" is found or "String" reaches its end਍ഀ ${Do}਍ഀ ;Remove everything before and after the searched part ("TempStr")਍ഀ StrCpy $R5 $R1 $R2 $R4਍ഀ ਍ഀ ;Compare "TempStr" with "StrToSearch"਍ഀ ${IfThen} $R5 == $R0 ${|} ${ExitDo} ${|}਍ഀ ;If not "StrToSearch", this could be "String" end਍ഀ ${IfThen} $R4 >= $R3 ${|} ${ExitDo} ${|}਍ഀ ;If not, continue the loop਍ഀ IntOp $R4 $R4 + 1਍ഀ ${Loop}਍ഀ ਍ഀ /*After this point:਍ഀ ------------------------------------------਍ഀ $R0 = OutVar (output)*/਍ഀ ਍ഀ ;Remove part before "StrToSearch" on "String" (if there has one)਍ഀ StrCpy $R0 $R1 `` $R4਍ഀ ਍ഀ ;Return output to user਍ഀ Pop $R5਍ഀ Pop $R4਍ഀ Pop $R3਍ഀ Pop $R2਍ഀ Pop $R1਍ഀ Exch $R0਍ഀ FunctionEnd਍ഀ ਍ഀ !macroend਍ഀ ਍ഀ # Function StrStrAdv਍ഀ ##################਍ഀ ਍ഀ !macro FUNCTION_STRING_StrStrAdv਍ഀ !insertmacro STRFUNC_FUNC `StrStrAdv` `2003-2004 Diego Pedroso`਍ഀ ਍ഀ /*After this point:਍ഀ ------------------------------------------਍ഀ $0 = String (input)਍ഀ $1 = StringToSearch (input)਍ഀ $2 = DirectionOfSearch (input)਍ഀ $3 = DirectionOfReturn (input)਍ഀ $4 = ShowStrToSearch (input)਍ഀ $5 = NumLoops (input)਍ഀ $6 = CaseSensitive (input)਍ഀ $7 = StringLength (temp)਍ഀ $8 = StrToSearchLength (temp)਍ഀ $9 = CurrentLoop (temp)਍ഀ $R0 = EndCharPos (temp)਍ഀ $R1 = StartCharPos (temp)਍ഀ $R2 = OutVar (output)਍ഀ $R3 = Temp (temp)*/਍ഀ ਍ഀ ;Get input from user਍ഀ ਍ഀ Exch $6਍ഀ Exch਍ഀ Exch $5਍ഀ Exch਍ഀ Exch 2਍ഀ Exch $4਍ഀ Exch 2਍ഀ Exch 3਍ഀ Exch $3਍ഀ Exch 3਍ഀ Exch 4਍ഀ Exch $2਍ഀ Exch 4਍ഀ Exch 5਍ഀ Exch $1਍ഀ Exch 5਍ഀ Exch 6਍ഀ Exch $0਍ഀ Exch 6਍ഀ Push $7਍ഀ Push $8਍ഀ Push $9਍ഀ Push $R3਍ഀ Push $R2਍ഀ Push $R1਍ഀ Push $R0਍ഀ ਍ഀ ; Clean $R0-$R3 variables਍ഀ StrCpy $R0 ""਍ഀ StrCpy $R1 ""਍ഀ StrCpy $R2 ""਍ഀ StrCpy $R3 ""਍ഀ ਍ഀ ; Verify if we have the correct values on the variables਍ഀ ${If} $0 == ``਍ഀ SetErrors ;AdvStrStr_StrToSearch not found਍ഀ Goto AdvStrStr_End਍ഀ ${EndIf}਍ഀ ਍ഀ ${If} $1 == ``਍ഀ SetErrors ;No text to search਍ഀ Goto AdvStrStr_End਍ഀ ${EndIf}਍ഀ ਍ഀ ${If} $2 != <਍ഀ StrCpy $2 >਍ഀ ${EndIf}਍ഀ ਍ഀ ${If} $3 != <਍ഀ StrCpy $3 >਍ഀ ${EndIf}਍ഀ ਍ഀ ${If} $4 <> 0਍ഀ StrCpy $4 1਍ഀ ${EndIf}਍ഀ ਍ഀ ${If} $5 <= 0਍ഀ StrCpy $5 0਍ഀ ${EndIf}਍ഀ ਍ഀ ${If} $6 <> 1਍ഀ StrCpy $6 0਍ഀ ${EndIf}਍ഀ ਍ഀ ; Find "AdvStrStr_String" length਍ഀ StrLen $7 $0਍ഀ ਍ഀ ; Then find "AdvStrStr_StrToSearch" length਍ഀ StrLen $8 $1਍ഀ ਍ഀ ; Now set up basic variables਍ഀ ਍ഀ ${If} $2 == <਍ഀ IntOp $R1 $7 - $8਍ഀ StrCpy $R2 $7਍ഀ ${Else}਍ഀ StrCpy $R1 0਍ഀ StrCpy $R2 $8਍ഀ ${EndIf}਍ഀ ਍ഀ StrCpy $9 0 ; First loop਍ഀ ਍ഀ ;Let's begin the search਍ഀ ਍ഀ ${Do}਍ഀ ; Step 1: If the starting or ending numbers are negative਍ഀ ; or more than AdvStrStr_StringLen, we return਍ഀ ; error਍ഀ ਍ഀ ${If} $R1 < 0਍ഀ StrCpy $R1 ``਍ഀ StrCpy $R2 ``਍ഀ StrCpy $R3 ``਍ഀ SetErrors ;AdvStrStr_StrToSearch not found਍ഀ Goto AdvStrStr_End਍ഀ ${ElseIf} $R2 > $7਍ഀ StrCpy $R1 ``਍ഀ StrCpy $R2 ``਍ഀ StrCpy $R3 ``਍ഀ SetErrors ;AdvStrStr_StrToSearch not found਍ഀ Goto AdvStrStr_End਍ഀ ${EndIf}਍ഀ ਍ഀ ; Step 2: Start the search depending on਍ഀ ; AdvStrStr_DirectionOfSearch. Chop down not needed਍ഀ ; characters.਍ഀ ਍ഀ ${If} $R1 <> 0਍ഀ StrCpy $R3 $0 `` $R1਍ഀ ${EndIf}਍ഀ ਍ഀ ${If} $R2 <> $7਍ഀ ${If} $R1 = 0਍ഀ StrCpy $R3 $0 $8਍ഀ ${Else}਍ഀ StrCpy $R3 $R3 $8਍ഀ ${EndIf}਍ഀ ${EndIf}਍ഀ ਍ഀ ; Step 3: Make sure that's the string we want਍ഀ ਍ഀ ; Case-Sensitive Support <- Use "AdvStrStr_Temp"਍ഀ ; variable because it won't be used anymore਍ഀ ਍ഀ ${If} $6 == 1਍ഀ System::Call `kernel32::lstrcmpW(ws, ws) i.s` `$R3` `$1`਍ഀ Pop $R3਍ഀ ${If} $R3 = 0਍ഀ StrCpy $R3 1 ; Continue਍ഀ ${Else}਍ഀ StrCpy $R3 0 ; Break਍ഀ ${EndIf}਍ഀ ${Else}਍ഀ ${If} $R3 == $1਍ഀ StrCpy $R3 1 ; Continue਍ഀ ${Else}਍ഀ StrCpy $R3 0 ; Break਍ഀ ${EndIf}਍ഀ ${EndIf}਍ഀ ਍ഀ ; After the comparasion, confirm that it is the਍ഀ ; value we want.਍ഀ ਍ഀ ${If} $R3 = 1਍ഀ ਍ഀ ;We found it, return except if the user has set up to਍ഀ ;search for another one:਍ഀ ${If} $9 >= $5਍ഀ ਍ഀ ;Now, let's see if the user wants਍ഀ ;AdvStrStr_StrToSearch to appear:਍ഀ ${If} $4 == 0਍ഀ ;Return depends on AdvStrStr_DirectionOfReturn਍ഀ ${If} $3 == <਍ഀ ; RTL਍ഀ StrCpy $R0 $0 $R1਍ഀ ${Else}਍ഀ ; LTR਍ഀ StrCpy $R0 $0 `` $R2਍ഀ ${EndIf}਍ഀ ${Break}਍ഀ ${Else}਍ഀ ;Return depends on AdvStrStr_DirectionOfReturn਍ഀ ${If} $3 == <਍ഀ ; RTL਍ഀ StrCpy $R0 $0 $R2਍ഀ ${Else}਍ഀ ; LTR਍ഀ StrCpy $R0 $0 `` $R1਍ഀ ${EndIf}਍ഀ ${Break}਍ഀ ${EndIf}਍ഀ ${Else}਍ഀ ;If the user wants to have more loops, let's do it so!਍ഀ IntOp $9 $9 + 1਍ഀ ਍ഀ ${If} $2 == <਍ഀ IntOp $R1 $R1 - 1਍ഀ IntOp $R2 $R2 - 1਍ഀ ${Else}਍ഀ IntOp $R1 $R1 + 1਍ഀ IntOp $R2 $R2 + 1਍ഀ ${EndIf}਍ഀ ${EndIf}਍ഀ ${Else}਍ഀ ; Step 4: We didn't find it, so do steps 1 thru 3 again਍ഀ ਍ഀ ${If} $2 == <਍ഀ IntOp $R1 $R1 - 1਍ഀ IntOp $R2 $R2 - 1਍ഀ ${Else}਍ഀ IntOp $R1 $R1 + 1਍ഀ IntOp $R2 $R2 + 1਍ഀ ${EndIf}਍ഀ ${EndIf}਍ഀ ${Loop}਍ഀ ਍ഀ AdvStrStr_End:਍ഀ ਍ഀ ;Add 1 to AdvStrStr_EndCharPos to be supportable਍ഀ ;by "StrCpy"਍ഀ ਍ഀ IntOp $R2 $R2 - 1਍ഀ ਍ഀ ;Return output to user਍ഀ ਍ഀ Exch $R0਍ഀ Exch਍ഀ Pop $R1਍ഀ Exch਍ഀ Pop $R2਍ഀ Exch਍ഀ Pop $R3਍ഀ Exch਍ഀ Pop $9਍ഀ Exch਍ഀ Pop $8਍ഀ Exch਍ഀ Pop $7਍ഀ Exch਍ഀ Pop $6਍ഀ Exch਍ഀ Pop $5਍ഀ Exch਍ഀ Pop $4਍ഀ Exch਍ഀ Pop $3਍ഀ Exch਍ഀ Pop $2਍ഀ Exch਍ഀ Pop $1਍ഀ Exch਍ഀ Pop $0਍ഀ ਍ഀ FunctionEnd਍ഀ ਍ഀ !macroend਍ഀ ਍ഀ # Function StrTok਍ഀ ###############਍ഀ ਍ഀ !macro FUNCTION_STRING_StrTok਍ഀ !insertmacro STRFUNC_FUNC `StrTok` `2004 Diego Pedroso - Based on functions by "bigmac666"`਍ഀ /*After this point:਍ഀ ------------------------------------------਍ഀ $0 = SkipEmptyParts (input)਍ഀ $1 = ResultPart (input)਍ഀ $2 = Separators (input)਍ഀ $3 = String (input)਍ഀ $4 = StrToSearchLen (temp)਍ഀ $5 = StrLen (temp)਍ഀ $6 = StartCharPos (temp)਍ഀ $7 = TempStr (temp)਍ഀ $8 = CurrentLoop਍ഀ $9 = CurrentSepChar਍ഀ $R0 = CurrentSepCharNum਍ഀ */਍ഀ ਍ഀ ;Get input from user਍ഀ Exch $0਍ഀ Exch਍ഀ Exch $1਍ഀ Exch਍ഀ Exch 2਍ഀ Exch $2਍ഀ Exch 2਍ഀ Exch 3਍ഀ Exch $3਍ഀ Exch 3਍ഀ Push $4਍ഀ Push $5਍ഀ Push $6਍ഀ Push $7਍ഀ Push $8਍ഀ Push $9਍ഀ Push $R0਍ഀ ਍ഀ ;Parameter defaults਍ഀ ${IfThen} $2 == `` ${|} StrCpy $2 `|` ${|}਍ഀ ${IfThen} $1 == `` ${|} StrCpy $1 `L` ${|}਍ഀ ${IfThen} $0 == `` ${|} StrCpy $0 `0` ${|}਍ഀ ਍ഀ ;Get "String" and "StrToSearch" length਍ഀ StrLen $4 $2਍ഀ StrLen $5 $3਍ഀ ;Start "StartCharPos" and "ResultPart" counters਍ഀ StrCpy $6 0਍ഀ StrCpy $8 -1਍ഀ ਍ഀ ;Loop until "ResultPart" is met, "StrToSearch" is found or਍ഀ ;"String" reaches its end਍ഀ ResultPartLoop: ;"CurrentLoop" Loop਍ഀ ਍ഀ ;Increase "CurrentLoop" counter਍ഀ IntOp $8 $8 + 1਍ഀ ਍ഀ StrSearchLoop:਍ഀ ${Do} ;"String" Loop਍ഀ ;Remove everything before and after the searched part ("TempStr")਍ഀ StrCpy $7 $3 1 $6਍ഀ ਍ഀ ;Verify if it's the "String" end਍ഀ ${If} $6 >= $5਍ഀ ;If "CurrentLoop" is what the user wants, remove the part਍ഀ ;after "TempStr" and itself and get out of here਍ഀ ${If} $8 == $1਍ഀ ${OrIf} $1 == `L`਍ഀ StrCpy $3 $3 $6਍ഀ ${Else} ;If not, empty "String" and get out of here਍ഀ StrCpy $3 ``਍ഀ ${EndIf}਍ഀ StrCpy $R0 `End`਍ഀ ${ExitDo}਍ഀ ${EndIf}਍ഀ ਍ഀ ;Start "CurrentSepCharNum" counter (for "Separators" Loop)਍ഀ StrCpy $R0 0਍ഀ ਍ഀ ${Do} ;"Separators" Loop਍ഀ ;Use one "Separators" character at a time਍ഀ ${If} $R0 <> 0਍ഀ StrCpy $9 $2 1 $R0਍ഀ ${Else}਍ഀ StrCpy $9 $2 1਍ഀ ${EndIf}਍ഀ ਍ഀ ;Go to the next "String" char if it's "Separators" end਍ഀ ${IfThen} $R0 >= $4 ${|} ${ExitDo} ${|}਍ഀ ਍ഀ ;Or, if "TempStr" equals "CurrentSepChar", then...਍ഀ ${If} $7 == $9਍ഀ StrCpy $7 $3 $6਍ഀ ਍ഀ ;If "String" is empty because this result part doesn't਍ഀ ;contain data, verify if "SkipEmptyParts" is activated,਍ഀ ;so we don't return the output to user yet਍ഀ ਍ഀ ${If} $7 == ``਍ഀ ${AndIf} $0 = ${TRUE}਍ഀ IntOp $6 $6 + 1਍ഀ StrCpy $3 $3 `` $6਍ഀ StrCpy $6 0਍ഀ Goto StrSearchLoop਍ഀ ${ElseIf} $8 == $1਍ഀ StrCpy $3 $3 $6਍ഀ StrCpy $R0 "End"਍ഀ ${ExitDo}਍ഀ ${EndIf} ;If not, go to the next result part਍ഀ IntOp $6 $6 + 1਍ഀ StrCpy $3 $3 `` $6਍ഀ StrCpy $6 0਍ഀ Goto ResultPartLoop਍ഀ ${EndIf}਍ഀ ਍ഀ ;Increase "CurrentSepCharNum" counter਍ഀ IntOp $R0 $R0 + 1਍ഀ ${Loop}਍ഀ ${IfThen} $R0 == "End" ${|} ${ExitDo} ${|}਍ഀ ਍ഀ ;Increase "StartCharPos" counter਍ഀ IntOp $6 $6 + 1਍ഀ ${Loop}਍ഀ ਍ഀ /*After this point:਍ഀ ------------------------------------------਍ഀ $3 = OutVar (output)*/਍ഀ ਍ഀ ;Return output to user਍ഀ ਍ഀ Pop $R0਍ഀ Pop $9਍ഀ Pop $8਍ഀ Pop $7਍ഀ Pop $6਍ഀ Pop $5਍ഀ Pop $4਍ഀ Pop $0਍ഀ Pop $1਍ഀ Pop $2਍ഀ Exch $3਍ഀ FunctionEnd਍ഀ ਍ഀ !macroend਍ഀ ਍ഀ # Function StrTrimNewLines਍ഀ ########################਍ഀ ਍ഀ !macro FUNCTION_STRING_StrTrimNewLines਍ഀ !insertmacro STRFUNC_FUNC `StrTrimNewLines` `2004 Diego Pedroso - Based on functions by Ximon Eighteen`਍ഀ ਍ഀ /*After this point:਍ഀ ------------------------------------------਍ഀ $R0 = String (input)਍ഀ $R1 = TrimCounter (temp)਍ഀ $R2 = Temp (temp)*/਍ഀ ਍ഀ ;Get input from user਍ഀ Exch $R0਍ഀ Push $R1਍ഀ Push $R2਍ഀ ਍ഀ ;Initialize trim counter਍ഀ StrCpy $R1 0਍ഀ ਍ഀ loop:਍ഀ ;Subtract to get "String"'s last characters਍ഀ IntOp $R1 $R1 - 1਍ഀ ਍ഀ ;Verify if they are either $\r or $\n਍ഀ StrCpy $R2 $R0 1 $R1਍ഀ ${If} $R2 == `$\r`਍ഀ ${OrIf} $R2 == `$\n`਍ഀ Goto loop਍ഀ ${EndIf}਍ഀ ਍ഀ ;Trim characters (if needed)਍ഀ IntOp $R1 $R1 + 1਍ഀ ${If} $R1 < 0਍ഀ StrCpy $R0 $R0 $R1਍ഀ ${EndIf}਍ഀ ਍ഀ /*After this point:਍ഀ ------------------------------------------਍ഀ $R0 = OutVar (output)*/਍ഀ ਍ഀ ;Return output to user਍ഀ Pop $R2਍ഀ Pop $R1਍ഀ Exch $R0਍ഀ FunctionEnd਍ഀ ਍ഀ !macroend਍ഀ ਍ഀ ;Function Calls for Install and Uninstall਍ഀ ਍ഀ !macro FUNCTION_STRING_StrCase_Call ResultVar String Type਍ഀ !verbose push਍ഀ !verbose 4਍ഀ !echo `$ {StrCase} "${ResultVar}" "${String}" "${Type}"`਍ഀ !verbose pop਍ഀ ਍ഀ Push `${String}`਍ഀ Push `${Type}`਍ഀ Call StrCase਍ഀ Pop `${ResultVar}`਍ഀ !macroend਍ഀ !macro FUNCTION_STRING_UnStrCase_Call ResultVar String Type਍ഀ !verbose push਍ഀ !verbose 4਍ഀ !echo `$ {UnStrCase} "${ResultVar}" "${String}" "${Type}"`਍ഀ !verbose pop਍ഀ ਍ഀ Push `${String}`਍ഀ Push `${Type}`਍ഀ Call un.StrCase਍ഀ Pop `${ResultVar}`਍ഀ !macroend਍ഀ ਍ഀ !macro FUNCTION_STRING_StrClb_Call ResultVar String Action਍ഀ !verbose push਍ഀ !verbose 4਍ഀ !echo `$ {StrClb} "${ResultVar}" "${String}" "${Action}"`਍ഀ !verbose pop਍ഀ ਍ഀ Push `${String}`਍ഀ Push `${Action}`਍ഀ Call StrClb਍ഀ Pop `${ResultVar}`਍ഀ !macroend਍ഀ !macro FUNCTION_STRING_UnStrClb_Call ResultVar String Action਍ഀ !verbose push਍ഀ !verbose 4਍ഀ !echo `$ {UnStrClb} "${ResultVar}" "${String}" "${Action}"`਍ഀ !verbose pop਍ഀ ਍ഀ Push `${String}`਍ഀ Push `${Action}`਍ഀ Call un.StrClb਍ഀ Pop `${ResultVar}`਍ഀ !macroend਍ഀ ਍ഀ !macro FUNCTION_STRING_StrIOToNSIS_Call ResultVar String਍ഀ !verbose push਍ഀ !verbose 4਍ഀ !echo `$ {StrIOToNSIS} "${ResultVar}" "${String}"`਍ഀ !verbose pop਍ഀ ਍ഀ Push `${String}`਍ഀ Call StrIOToNSIS਍ഀ Pop `${ResultVar}`਍ഀ !macroend਍ഀ !macro FUNCTION_STRING_UnStrIOToNSIS_Call ResultVar String਍ഀ !verbose push਍ഀ !verbose 4਍ഀ !echo `$ {UnStrIOToNSIS} "${ResultVar}" "${String}"`਍ഀ !verbose pop਍ഀ ਍ഀ Push `${String}`਍ഀ Call un.StrIOToNSIS਍ഀ Pop `${ResultVar}`਍ഀ !macroend਍ഀ ਍ഀ !macro FUNCTION_STRING_StrLoc_Call ResultVar String StrToSearchFor OffsetDirection਍ഀ !verbose push਍ഀ !verbose 4਍ഀ !echo `$ {StrLoc} "${ResultVar}" "${String}" "${StrToSearchFor}" "${OffsetDirection}"`਍ഀ !verbose pop਍ഀ ਍ഀ Push `${String}`਍ഀ Push `${StrToSearchFor}`਍ഀ Push `${OffsetDirection}`਍ഀ Call StrLoc਍ഀ Pop `${ResultVar}`਍ഀ !macroend਍ഀ !macro FUNCTION_STRING_UnStrLoc_Call ResultVar String StrToSearchFor OffsetDirection਍ഀ !verbose push਍ഀ !verbose 4਍ഀ !echo `$ {UnStrLoc} "${ResultVar}" "${String}" "${StrToSearchFor}" "${OffsetDirection}"`਍ഀ !verbose pop਍ഀ ਍ഀ Push `${String}`਍ഀ Push `${StrToSearchFor}`਍ഀ Push `${OffsetDirection}`਍ഀ Call un.StrLoc਍ഀ Pop `${ResultVar}`਍ഀ !macroend਍ഀ ਍ഀ !macro FUNCTION_STRING_StrNSISToIO_Call ResultVar String਍ഀ !verbose push਍ഀ !verbose 4਍ഀ !echo `$ {StrNSISToIO} "${ResultVar}" "${String}"`਍ഀ !verbose pop਍ഀ ਍ഀ Push `${String}`਍ഀ Call StrNSISToIO਍ഀ Pop `${ResultVar}`਍ഀ !macroend਍ഀ !macro FUNCTION_STRING_UnStrNSISToIO_Call ResultVar String਍ഀ !verbose push਍ഀ !verbose 4਍ഀ !echo `$ {UnStrNSISToIO} "${ResultVar}" "${String}"`਍ഀ !verbose pop਍ഀ ਍ഀ Push `${String}`਍ഀ Call un.StrNSISToIO਍ഀ Pop `${ResultVar}`਍ഀ !macroend਍ഀ ਍ഀ !macro FUNCTION_STRING_StrRep_Call ResultVar String StringToReplace ReplacementString਍ഀ !verbose push਍ഀ !verbose 4਍ഀ !echo `$ {StrRep} "${ResultVar}" "${String}" "${StringToReplace}" "${ReplacementString}"`਍ഀ !verbose pop਍ഀ ਍ഀ Push `${String}`਍ഀ Push `${StringToReplace}`਍ഀ Push `${ReplacementString}`਍ഀ Call StrRep਍ഀ Pop `${ResultVar}`਍ഀ !macroend਍ഀ !macro FUNCTION_STRING_UnStrRep_Call ResultVar String StringToReplace ReplacementString਍ഀ !verbose push਍ഀ !verbose 4਍ഀ !echo `$ {UnStrRep} "${ResultVar}" "${String}" "${StringToReplace}" "${ReplacementString}"`਍ഀ !verbose pop਍ഀ ਍ഀ Push `${String}`਍ഀ Push `${StringToReplace}`਍ഀ Push `${ReplacementString}`਍ഀ Call un.StrRep਍ഀ Pop `${ResultVar}`਍ഀ !macroend਍ഀ ਍ഀ !macro FUNCTION_STRING_StrSort_Call ResultVar String CenterStr LeftStr RightStr IncludeCenterStr IncludeLeftStr IncludeRightStr਍ഀ !verbose push਍ഀ !verbose 4਍ഀ !echo `$ {StrSort} "${ResultVar}" "${String}" "${CenterStr}" "${LeftStr}" "${RightStr}" "${IncludeCenterStr}" "${IncludeLeftStr}" "${IncludeRightStr}"`਍ഀ !verbose pop਍ഀ ਍ഀ Push `${String}`਍ഀ Push `${CenterStr}`਍ഀ Push `${LeftStr}`਍ഀ Push `${RightStr}`਍ഀ Push `${IncludeCenterStr}`਍ഀ Push `${IncludeLeftStr}`਍ഀ Push `${IncludeRightStr}`਍ഀ Call StrSort਍ഀ Pop `${ResultVar}`਍ഀ !macroend਍ഀ !macro FUNCTION_STRING_UnStrSort_Call ResultVar String CenterStr LeftStr RightStr IncludeCenterStr IncludeLeftStr IncludeRightStr਍ഀ !verbose push਍ഀ !verbose 4਍ഀ !echo `$ {UnStrSort} "${ResultVar}" "${String}" "${CenterStr}" "${LeftStr}" "${RightStr}" "${IncludeCenterStr}" "${IncludeLeftStr}" "${IncludeRightStr}"`਍ഀ !verbose pop਍ഀ ਍ഀ Push `${String}`਍ഀ Push `${CenterStr}`਍ഀ Push `${LeftStr}`਍ഀ Push `${RightStr}`਍ഀ Push `${IncludeCenterStr}`਍ഀ Push `${IncludeLeftStr}`਍ഀ Push `${IncludeRightStr}`਍ഀ Call un.StrSort਍ഀ Pop `${ResultVar}`਍ഀ !macroend਍ഀ ਍ഀ !macro FUNCTION_STRING_StrStr_Call ResultVar String StrToSearchFor਍ഀ !verbose push਍ഀ !verbose 4਍ഀ !echo `$ {StrStr} "${ResultVar}" "${String}" "${StrToSearchFor}"`਍ഀ !verbose pop਍ഀ ਍ഀ Push `${String}`਍ഀ Push `${StrToSearchFor}`਍ഀ Call StrStr਍ഀ Pop `${ResultVar}`਍ഀ !macroend਍ഀ !macro FUNCTION_STRING_UnStrStr_Call ResultVar String StrToSearchFor਍ഀ !verbose push਍ഀ !verbose 4਍ഀ !echo `$ {UnStrStr} "${ResultVar}" "${String}" "${StrToSearchFor}"`਍ഀ !verbose pop਍ഀ ਍ഀ Push `${String}`਍ഀ Push `${StrToSearchFor}`਍ഀ Call un.StrStr਍ഀ Pop `${ResultVar}`਍ഀ !macroend਍ഀ ਍ഀ !macro FUNCTION_STRING_StrStrAdv_Call ResultVar String StrToSearchFor SearchDirection ResultStrDirection DisplayStrToSearch Loops CaseSensitive਍ഀ !verbose push਍ഀ !verbose 4਍ഀ !echo `$ {StrStrAdv} "${ResultVar}" "${String}" "${StrToSearchFor}" "${SearchDirection}" "${ResultStrDirection}" "${DisplayStrToSearch}" "${Loops}" "${CaseSensitive}"`਍ഀ !verbose pop਍ഀ ਍ഀ Push `${String}`਍ഀ Push `${StrToSearchFor}`਍ഀ Push `${SearchDirection}`਍ഀ Push `${ResultStrDirection}`਍ഀ Push `${DisplayStrToSearch}`਍ഀ Push `${Loops}`਍ഀ Push `${CaseSensitive}`਍ഀ Call StrStrAdv਍ഀ Pop `${ResultVar}`਍ഀ !macroend਍ഀ !macro FUNCTION_STRING_UnStrStrAdv_Call ResultVar String StrToSearchFor SearchDirection ResultStrDirection DisplayStrToSearch Loops CaseSensitive਍ഀ !verbose push਍ഀ !verbose 4਍ഀ !echo `$ {UnStrStrAdv} "${ResultVar}" "${String}" "${StrToSearchFor}" "${SearchDirection}" "${ResultStrDirection}" "${DisplayStrToSearch}" "${Loops}" "${CaseSensitive}"`਍ഀ !verbose pop਍ഀ ਍ഀ Push `${String}`਍ഀ Push `${StrToSearchFor}`਍ഀ Push `${SearchDirection}`਍ഀ Push `${ResultStrDirection}`਍ഀ Push `${DisplayStrToSearch}`਍ഀ Push `${Loops}`਍ഀ Push `${CaseSensitive}`਍ഀ Call un.StrStrAdv਍ഀ Pop `${ResultVar}`਍ഀ !macroend਍ഀ ਍ഀ !macro FUNCTION_STRING_StrTok_Call ResultVar String Separators ResultPart SkipEmptyParts਍ഀ !verbose push਍ഀ !verbose 4਍ഀ !echo `$ {StrTok} "${ResultVar}" "${String}" "${Separators}" "${ResultPart}" "${SkipEmptyParts}"`਍ഀ !verbose pop਍ഀ ਍ഀ Push `${String}`਍ഀ Push `${Separators}`਍ഀ Push `${ResultPart}`਍ഀ Push `${SkipEmptyParts}`਍ഀ Call StrTok਍ഀ Pop `${ResultVar}`਍ഀ !macroend਍ഀ !macro FUNCTION_STRING_UnStrTok_Call ResultVar String Separators ResultPart SkipEmptyParts਍ഀ !verbose push਍ഀ !verbose 4਍ഀ !echo `$ {UnStrTok} "${ResultVar}" "${String}" "${Separators}" "${ResultPart}" "${SkipEmptyParts}"`਍ഀ !verbose pop਍ഀ ਍ഀ Push `${String}`਍ഀ Push `${Separators}`਍ഀ Push `${ResultPart}`਍ഀ Push `${SkipEmptyParts}`਍ഀ Call un.StrTok਍ഀ Pop `${ResultVar}`਍ഀ !macroend਍ഀ ਍ഀ !macro FUNCTION_STRING_StrTrimNewLines_Call ResultVar String਍ഀ !verbose push਍ഀ !verbose 4਍ഀ !echo `$ {StrTrimNewLines} "${ResultVar}" "${String}"`਍ഀ !verbose pop਍ഀ ਍ഀ Push `${String}`਍ഀ Call StrTrimNewLines਍ഀ Pop `${ResultVar}`਍ഀ !macroend਍ഀ !macro FUNCTION_STRING_UnStrTrimNewLines_Call ResultVar String਍ഀ !verbose push਍ഀ !verbose 4਍ഀ !echo `$ {UnStrTrimNewLines} "${ResultVar}" "${String}"`਍ഀ !verbose pop਍ഀ ਍ഀ Push `${String}`਍ഀ Call un.StrTrimNewLines਍ഀ Pop `${ResultVar}`਍ഀ !macroend਍ഀ ਍ഀ !endif਍ഀ !verbose 3਍ഀ !define STRFUNC_VERBOSITY ${_STRFUNC_VERBOSITY}਍ഀ !undef _STRFUNC_VERBOSITY਍ഀ !verbose pop਍ഀ