diff --git a/Examples/StrFunc.nsi b/Examples/StrFunc.nsi index 8e5f9019..5f7987f0 100644 --- a/Examples/StrFunc.nsi +++ b/Examples/StrFunc.nsi @@ -31,12 +31,60 @@ ${UnStrTok} ${UnStrTrimNewLines} ${UnStrSort} +!macro StackVerificationStart + StrCpy $0 S0 + StrCpy $1 S1 + StrCpy $2 S2 + StrCpy $3 S3 + StrCpy $4 S4 + StrCpy $5 S5 + StrCpy $6 S6 + StrCpy $7 S7 + StrCpy $8 S8 + StrCpy $9 S9 + StrCpy $R0 SR0 + StrCpy $R1 SR1 + StrCpy $R2 SR2 + StrCpy $R3 SR3 + StrCpy $R4 SR4 + StrCpy $R5 SR5 + StrCpy $R6 SR6 + StrCpy $R7 SR7 + StrCpy $R8 SR8 + StrCpy $R9 SR9 +!macroend + +!macro StackVerificationEnd + ClearErrors + ${If} $1 != "S1" + ${OrIf} $2 != "S2" + ${OrIf} $3 != "S3" + ${OrIf} $4 != "S4" + ${OrIf} $5 != "S5" + ${OrIf} $6 != "S6" + ${OrIf} $7 != "S7" + ${OrIf} $8 != "S8" + ${OrIf} $9 != "S9" + ${OrIf} $R0 != "SR0" + ${OrIf} $R1 != "SR1" + ${OrIf} $R2 != "SR2" + ${OrIf} $R3 != "SR3" + ${OrIf} $R4 != "SR4" + ${OrIf} $R5 != "SR5" + ${OrIf} $R6 != "SR6" + ${OrIf} $R7 != "SR7" + ${OrIf} $R8 != "SR8" + ${OrIf} $R9 != "SR9" + SetErrors + ${EndIf} +!macroend + Section # Test case conversion + !insertmacro StackVerificationStart ${StrCase} $0 "This is just an example. A very simple one." "" StrCmp $0 "This is just an example. A very simple one." 0 strcaseerror - ${StrCase} $0 "THIS IS JUST AN EXAMPLE. A VERY SIMPLE ONE." "S" StrCmp $0 "This is just an example. A very simple one." 0 strcaseerror ${StrCase} $0 "This is just an example. A very simple one." "L" @@ -47,15 +95,14 @@ Section StrCmp $0 "This Is Just An Example. A Very Simple One." 0 strcaseerror ${StrCase} $0 "This is just an example. A very simple one." "<>" StrCmp $0 "tHIS IS JUST AN EXAMPLE. a VERY SIMPLE ONE." 0 strcaseerror - ${StrCase} $0 "123456789!@#%^&*()-_=+[]{};:,./<>?" "S" StrCmp $0 "123456789!@#%^&*()-_=+[]{};:,./<>?" 0 strcaseerror - ${StrCase} $0 "123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#%^&*()abcdefghijklmnopqrstuvwxyz-_=+[]{};:,./<>?" "<>" StrCmp $0 "123456789abcdefghijklmnopqrstuvwxyz!@#%^&*()ABCDEFGHIJKLMNOPQRSTUVWXYZ-_=+[]{};:,./<>?" 0 strcaseerror - ${StrCase} $0 "what about taking a shower tomorrow? it's late to do so now! try to sleep now. Good Night!" "S" StrCmp $0 "What about taking a shower tomorrow? It's late to do so now! Try to sleep now. Good night!" 0 strcaseerror + !insertmacro StackVerificationEnd + IfErrors strcaseerror DetailPrint "PASSED StrCase test" Goto +2 @@ -63,16 +110,25 @@ strcaseerror: DetailPrint "FAILED StrCase test" # Test clipboard function + !insertmacro StackVerificationStart ${StrClb} $0 "StrFunc clipboard test" ">" - ${StrClb} $0 "" "<" + StrCmp $0 "" 0 strclberror + ${StrClb} $0 "StrFunc clipboard test #2" "<>" StrCmp $0 "StrFunc clipboard test" 0 strclberror - + ${StrClb} $0 "" "<" + StrCmp $0 "StrFunc clipboard test #2" 0 strclberror + ${StrClb} $0 "" "" + StrCmp $0 "" 0 strclberror + !insertmacro StackVerificationEnd + IfErrors strclberror + DetailPrint "PASSED StrClb test" Goto +2 strclberror: DetailPrint "FAILED StrClb test" # Test IO functions + !insertmacro StackVerificationStart !macro testio str ${StrNSISToIO} $0 "${str}" ${StrIOToNSIS} $0 $0 @@ -86,12 +142,16 @@ strclberror: !insertmacro testio "$\r \ $\t $\n $$" !insertmacro testio "" !insertmacro testio " " + !insertmacro StackVerificationEnd + IfErrors ioerror + DetailPrint "PASSED StrNSISToIO/StrIOToNSIS test" Goto +2 ioerror: DetailPrint "FAILED StrNSISToIO/StrIOToNSIS test" # Test string search functions + !insertmacro StackVerificationStart ${StrLoc} $0 "This is just an example" "just" "<" StrCmp $0 "11" 0 strlocerror ${StrLoc} $0 a abc < @@ -112,12 +172,16 @@ ioerror: StrCmp $0 "0" 0 strlocerror ${StrLoc} $0 abc d < StrCmp $0 "" 0 strlocerror + !insertmacro StackVerificationEnd + IfErrors strlocerror + DetailPrint "PASSED StrLoc test" Goto +2 strlocerror: DetailPrint "FAILED StrLoc test" # Test string replacement + !insertmacro StackVerificationStart ${StrRep} $0 "This is just an example" "an" "one" StrCmp $0 "This is just one example" 0 strreperror ${StrRep} $0 "test... test... 1 2 3..." "test" "testing" @@ -132,12 +196,16 @@ strlocerror: StrCmp $0 "test" 0 strreperror ${StrRep} $0 "test" "" "" StrCmp $0 "test" 0 strreperror + !insertmacro StackVerificationEnd + IfErrors strreperror + DetailPrint "PASSED StrRep test" Goto +2 strreperror: DetailPrint "FAILED StrRep test" # Test sorting + !insertmacro StackVerificationStart ${StrSort} $0 "This is just an example" "" " just" "ple" "0" "0" "0" StrCmp $0 "This is an exam" 0 strsorterror ${StrSort} $0 "This is just an example" " " "j" " " "0" "" "0" @@ -176,11 +244,15 @@ strreperror: StrCmp $0 " rror " 0 strsorterror ${StrSort} $0 "" " " "something" " " "1" "0" "1" StrCmp $0 "" 0 strsorterror + !insertmacro StackVerificationEnd + IfErrors strsorterror + DetailPrint "PASSED StrSort test" Goto +2 strsorterror: DetailPrint "FAILED StrSort test" + !insertmacro StackVerificationStart ${StrStr} $0 "abcefghijklmnopqrstuvwxyz" "g" StrCmp $0 "ghijklmnopqrstuvwxyz" 0 strstrerror ${StrStr} $0 "abcefghijklmnopqrstuvwxyz" "ga" @@ -189,11 +261,15 @@ strsorterror: StrCmp $0 "abcefghijklmnopqrstuvwxyz" 0 strstrerror ${StrStr} $0 "a" "abcefghijklmnopqrstuvwxyz" StrCmp $0 "" 0 strstrerror + !insertmacro StackVerificationEnd + IfErrors strstrerror + DetailPrint "PASSED StrStr test" Goto +2 strstrerror: DetailPrint "FAILED StrStr test" + !insertmacro StackVerificationStart ${StrStrAdv} $0 "abcabcabc" "a" ">" ">" "1" "0" "0" StrCmp $0 "abcabcabc" 0 strstradverror ${StrStrAdv} $0 "abcabcabc" "a" ">" ">" "1" "1" "0" @@ -214,7 +290,6 @@ strstrerror: StrCmp $0 "" 0 strstradverror ${StrStrAdv} $0 "abcabcabc" "abc" "<" ">" "0" "1" "0" StrCmp $0 "abc" 0 strstradverror - ${StrStrAdv} $0 "ABCabcabc" "a" ">" ">" "1" "0" "1" StrCmp $0 "abcabc" 0 strstradverror ${StrStrAdv} $0 "ABCabcabc" "a" ">" ">" "1" "1" "1" @@ -235,12 +310,16 @@ strstrerror: StrCmp $0 "" 0 strstradverror ${StrStrAdv} $0 "ABCabcabc" "abc" "<" ">" "0" "1" "1" StrCmp $0 "abc" 0 strstradverror + !insertmacro StackVerificationEnd + IfErrors strstradverror + DetailPrint "PASSED StrStrAdv test" Goto +2 strstradverror: DetailPrint "FAILED StrStrAdv test" # Test tokenizer + !insertmacro StackVerificationStart ${StrTok} $0 "This is, or is not, just an example" " ," "4" "1" StrCmp $0 "not" 0 strtokerror ${StrTok} $0 "This is, or is not, just an example" " ," "4" "0" @@ -253,17 +332,25 @@ strstradverror: StrCmp $0 "example" 0 strtokerror ${StrTok} $0 "This is, or is not, just an example" " ," "0" "0" StrCmp $0 "This" 0 strtokerror + !insertmacro StackVerificationEnd + IfErrors strtokerror + DetailPrint "PASSED StrTok test" Goto +2 strtokerror: DetailPrint "FAILED StrTok test" # Test trim new lines + !insertmacro StackVerificationStart ${StrTrimNewLines} $0 "$\r$\ntest$\r$\ntest$\r$\n" - StrCmp $0 "$\r$\ntest$\r$\ntest" +3 - DetailPrint "FAILED StrTrimNewLines test" - Goto +2 - DetailPrint "PASSED StrTrimNewLines test" + StrCmp $0 "$\r$\ntest$\r$\ntest" 0 strtrimnewlineserror + !insertmacro StackVerificationEnd + IfErrors strtrimnewlineserror + + DetailPrint "PASSED StrTrimNewLines test" + Goto +2 +strtrimnewlineserror: + DetailPrint "FAILED StrTrimNewLines test" WriteUninstaller $EXEDIR\UnStrFunc.exe @@ -274,9 +361,9 @@ SectionEnd Section Uninstall # Test case conversion + !insertmacro StackVerificationStart ${UnStrCase} $0 "This is just an example. A very simple one." "" StrCmp $0 "This is just an example. A very simple one." 0 strcaseerror - ${UnStrCase} $0 "THIS IS JUST AN EXAMPLE. A VERY SIMPLE ONE." "S" StrCmp $0 "This is just an example. A very simple one." 0 strcaseerror ${UnStrCase} $0 "This is just an example. A very simple one." "L" @@ -287,15 +374,14 @@ Section Uninstall StrCmp $0 "This Is Just An Example. A Very Simple One." 0 strcaseerror ${UnStrCase} $0 "This is just an example. A very simple one." "<>" StrCmp $0 "tHIS IS JUST AN EXAMPLE. a VERY SIMPLE ONE." 0 strcaseerror - ${UnStrCase} $0 "123456789!@#%^&*()-_=+[]{};:,./<>?" "S" StrCmp $0 "123456789!@#%^&*()-_=+[]{};:,./<>?" 0 strcaseerror - ${UnStrCase} $0 "123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#%^&*()abcdefghijklmnopqrstuvwxyz-_=+[]{};:,./<>?" "<>" StrCmp $0 "123456789abcdefghijklmnopqrstuvwxyz!@#%^&*()ABCDEFGHIJKLMNOPQRSTUVWXYZ-_=+[]{};:,./<>?" 0 strcaseerror - ${UnStrCase} $0 "what about taking a shower tomorrow? it's late to do so now! try to sleep now. Good Night!" "S" StrCmp $0 "What about taking a shower tomorrow? It's late to do so now! Try to sleep now. Good night!" 0 strcaseerror + !insertmacro StackVerificationEnd + IfErrors strcaseerror DetailPrint "PASSED StrCase test" Goto +2 @@ -303,9 +389,17 @@ strcaseerror: DetailPrint "FAILED StrCase test" # Test clipboard function + !insertmacro StackVerificationStart ${UnStrClb} $0 "StrFunc clipboard test" ">" - ${UnStrClb} $0 "" "<" + StrCmp $0 "" 0 strclberror + ${UnStrClb} $0 "StrFunc clipboard test #2" "<>" StrCmp $0 "StrFunc clipboard test" 0 strclberror + ${UnStrClb} $0 "" "<" + StrCmp $0 "StrFunc clipboard test #2" 0 strclberror + ${UnStrClb} $0 "" "" + StrCmp $0 "" 0 strclberror + !insertmacro StackVerificationEnd + IfErrors strclberror DetailPrint "PASSED StrClb test" Goto +2 @@ -313,6 +407,7 @@ strclberror: DetailPrint "FAILED StrClb test" # Test IO functions + !insertmacro StackVerificationStart !macro untestio str ${UnStrNSISToIO} $0 "${str}" ${UnStrIOToNSIS} $0 $0 @@ -326,12 +421,16 @@ strclberror: !insertmacro untestio "$\r \ $\t $\n $$" !insertmacro untestio "" !insertmacro untestio " " + !insertmacro StackVerificationEnd + IfErrors ioerror + DetailPrint "PASSED StrNSISToIO/StrIOToNSIS test" Goto +2 ioerror: DetailPrint "FAILED StrNSISToIO/StrIOToNSIS test" # Test string search functions + !insertmacro StackVerificationStart ${UnStrLoc} $0 "This is just an example" "just" "<" StrCmp $0 "11" 0 strlocerror ${UnStrLoc} $0 a abc < @@ -352,12 +451,16 @@ ioerror: StrCmp $0 "0" 0 strlocerror ${UnStrLoc} $0 abc d < StrCmp $0 "" 0 strlocerror + !insertmacro StackVerificationEnd + IfErrors strlocerror + DetailPrint "PASSED StrLoc test" Goto +2 strlocerror: DetailPrint "FAILED StrLoc test" # Test string replacement + !insertmacro StackVerificationStart ${UnStrRep} $0 "This is just an example" "an" "one" StrCmp $0 "This is just one example" 0 strreperror ${UnStrRep} $0 "test... test... 1 2 3..." "test" "testing" @@ -372,12 +475,16 @@ strlocerror: StrCmp $0 "test" 0 strreperror ${UnStrRep} $0 "test" "" "" StrCmp $0 "test" 0 strreperror + !insertmacro StackVerificationEnd + IfErrors strreperror + DetailPrint "PASSED StrRep test" Goto +2 strreperror: DetailPrint "FAILED StrRep test" # Test sorting + !insertmacro StackVerificationStart ${UnStrSort} $0 "This is just an example" "" " just" "ple" "0" "0" "0" StrCmp $0 "This is an exam" 0 strsorterror ${UnStrSort} $0 "This is just an example" " " "j" " " "0" "" "0" @@ -416,11 +523,15 @@ strreperror: StrCmp $0 " rror " 0 strsorterror ${UnStrSort} $0 "" " " "something" " " "1" "0" "1" StrCmp $0 "" 0 strsorterror + !insertmacro StackVerificationEnd + IfErrors strsorterror + DetailPrint "PASSED StrSort test" Goto +2 strsorterror: DetailPrint "FAILED StrSort test" + !insertmacro StackVerificationStart ${UnStrStr} $0 "abcefghijklmnopqrstuvwxyz" "g" StrCmp $0 "ghijklmnopqrstuvwxyz" 0 strstrerror ${UnStrStr} $0 "abcefghijklmnopqrstuvwxyz" "ga" @@ -429,11 +540,15 @@ strsorterror: StrCmp $0 "abcefghijklmnopqrstuvwxyz" 0 strstrerror ${UnStrStr} $0 "a" "abcefghijklmnopqrstuvwxyz" StrCmp $0 "" 0 strstrerror + !insertmacro StackVerificationEnd + IfErrors strstrerror + DetailPrint "PASSED StrStr test" Goto +2 strstrerror: DetailPrint "FAILED StrStr test" + !insertmacro StackVerificationStart ${UnStrStrAdv} $0 "abcabcabc" "a" ">" ">" "1" "0" "0" StrCmp $0 "abcabcabc" 0 strstradverror ${UnStrStrAdv} $0 "abcabcabc" "a" ">" ">" "1" "1" "0" @@ -454,7 +569,6 @@ strstrerror: StrCmp $0 "" 0 strstradverror ${UnStrStrAdv} $0 "abcabcabc" "abc" "<" ">" "0" "1" "0" StrCmp $0 "abc" 0 strstradverror - ${UnStrStrAdv} $0 "ABCabcabc" "a" ">" ">" "1" "0" "1" StrCmp $0 "abcabc" 0 strstradverror ${UnStrStrAdv} $0 "ABCabcabc" "a" ">" ">" "1" "1" "1" @@ -475,12 +589,16 @@ strstrerror: StrCmp $0 "" 0 strstradverror ${UnStrStrAdv} $0 "ABCabcabc" "abc" "<" ">" "0" "1" "1" StrCmp $0 "abc" 0 strstradverror + !insertmacro StackVerificationEnd + IfErrors strstradverror + DetailPrint "PASSED StrStrAdv test" Goto +2 strstradverror: DetailPrint "FAILED StrStrAdv test" # Test tokenizer + !insertmacro StackVerificationStart ${UnStrTok} $0 "This is, or is not, just an example" " ," "4" "1" StrCmp $0 "not" 0 strtokerror ${UnStrTok} $0 "This is, or is not, just an example" " ," "4" "0" @@ -493,16 +611,24 @@ strstradverror: StrCmp $0 "example" 0 strtokerror ${UnStrTok} $0 "This is, or is not, just an example" " ," "0" "0" StrCmp $0 "This" 0 strtokerror + !insertmacro StackVerificationEnd + IfErrors strtokerror + DetailPrint "PASSED StrTok test" Goto +2 strtokerror: DetailPrint "FAILED StrTok test" # Test trim new lines + !insertmacro StackVerificationStart ${UnStrTrimNewLines} $0 "$\r$\ntest$\r$\ntest$\r$\n" - StrCmp $0 "$\r$\ntest$\r$\ntest" +3 - DetailPrint "FAILED StrTrimNewLines test" - Goto +2 - DetailPrint "PASSED StrTrimNewLines test" + StrCmp $0 "$\r$\ntest$\r$\ntest" 0 strtrimnewlineserror + !insertmacro StackVerificationEnd + IfErrors strtrimnewlineserror + + DetailPrint "PASSED StrTrimNewLines test" + Goto +2 +strtrimnewlineserror: + DetailPrint "FAILED StrTrimNewLines test" SectionEnd diff --git a/Include/StrFunc.nsh b/Include/StrFunc.nsh index d7bfa1a6..2dc46e77 100644 --- a/Include/StrFunc.nsh +++ b/Include/StrFunc.nsh @@ -1,6 +1,6 @@ /* o-----------------------------------------------------------------------------o -|String Functions Header File 1.08 | +|String Functions Header File 1.09 | (-----------------------------------------------------------------------------) | By deguix / A Header file for NSIS 2.01 | | -------------------------------| @@ -34,7 +34,7 @@ o-----------------------------------------------------------------------------o ;Header File Version !define STRFUNC_VERMAJ 1 - !define STRFUNC_VERMED 08 + !define STRFUNC_VERMED 09 ;!define STRFUNC_VERMIN 0 ;!define STRFUNC_VERBLD 0 @@ -191,7 +191,7 @@ o-----------------------------------------------------------------------------o ################ !macro FUNCTION_STRING_StrCase - !insertmacro STRFUNC_FUNC `StrCase` `2004 Diego Pedroso` + !insertmacro STRFUNC_FUNC `StrCase` `2004 Diego Pedroso - Based on functions by Dave Laundon` /*After this point: ------------------------------------------ @@ -209,6 +209,7 @@ o-----------------------------------------------------------------------------o Exch $1 Exch Exch $0 + Exch Push $2 Push $3 Push $4 @@ -367,12 +368,12 @@ o-----------------------------------------------------------------------------o !macroend !macro FUNCTION_STRING_StrClb - !insertmacro STRFUNC_FUNC `StrClb` `2004 Diego Pedroso - Based on CopyToClipboard and CopyFromClipboard by Nik Medved` + !insertmacro STRFUNC_FUNC `StrClb` `2004 Diego Pedroso - Based on functions by Nik Medved` /*After this point: ------------------------------------------ - $0 = Action (input) - $1 = String (input) + $0 = String (input) + $1 = Action (input) $2 = Lock/Unlock (temp) $3 = Temp (temp) $4 = Temp2 (temp)*/ @@ -386,6 +387,10 @@ o-----------------------------------------------------------------------------o 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)' @@ -428,7 +433,7 @@ o-----------------------------------------------------------------------------o ${ElseIf} $1 == "<>" ;Swap ;Step 1: Get clipboard data - System::Call 'user32::GetClipboardData(i 1) t .r2' + System::Call 'user32::GetClipboardData(i 1) i .r2' ;Step 2: Lock and copy data (kichik's fix) System::Call 'kernel32::GlobalLock(i r2) t .r4' @@ -455,7 +460,7 @@ o-----------------------------------------------------------------------------o ;Step 9: Set the information to the clipboard System::Call 'user32::SetClipboardData(i 1, i r2)' - + StrCpy $0 $4 ${Else} ;Clear @@ -486,78 +491,68 @@ o-----------------------------------------------------------------------------o #################### !macro FUNCTION_STRING_StrIOToNSIS - !insertmacro STRFUNC_FUNC `StrIOToNSIS` `2003-2004 Amir Szekely, Joost Verburg and Dave Laundon` + !insertmacro STRFUNC_FUNC `StrIOToNSIS` `2004 "bluenet" - Based on functions by Amir Szekely, Joost Verburg, Dave Laundon and Diego Pedroso` /*After this point: ------------------------------------------ - $0 = String (input) - $1 = OutVar (output) - $2 = Temp (temp)*/ + $R0 = String (input/output) + $R1 = StartCharPos (temp) + $R2 = StrLen (temp) + $R3 = TempStr (temp) + $R4 = TempRepStr (temp)*/ ;Get input from user - Exch $0 - Push $1 - Push $2 - - ;Initialize output - StrCpy $1 `` - - ;Loop until an escape character is found or "String" reaches its end - ${Do} - ;Get the next "String" character - StrCpy $2 $0 1 - - ;Abort when none left - ${If} $2 == `` - ${ExitDo} - ${Else} - ;Remove current character from "String" - StrCpy $0 $0 `` 1 - - ;Detect if current character is an escape character - ${If} $2 != `\` - ;If not just output - StrCpy $1 `$1$2` - ${Else} - ;Get the next "String" character - StrCpy $2 $0 1 - ;Remove current character from "String" - StrCpy $0 $0 `` 1 - - ;Detect if current character is: - ${If} $2 == `\` ;Back-slash - StrCpy $1 `$1\` - ${ElseIf} $2 == `r` ;Carriage return - StrCpy $1 `$1$\r` - ${ElseIf} $2 == `n` ;Line feed - StrCpy $1 `$1$\n` - ${ElseIf} $2 == `t` ;Tab - StrCpy $1 `$1$\t` - ${Else} ;Anything else - StrCpy $1 "$1$2" - ${EndIf} - ${EndIf} - ${EndIf} - ${Loop} + Exch $R0 + Push $R1 + Push $R2 + Push $R3 + Push $R4 - /*After this point: - ------------------------------------------ - $0 = OutVar (output)*/ + ;Get "String" length + StrLen $R2 $R0 - ;Return output to user - StrCpy $0 $1 - Pop $2 - Pop $1 - Exch $0 + ;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` + !insertmacro STRFUNC_FUNC `StrLoc` `2004 Diego Pedroso - Based on functions by Ximon Eighteen` /*After this point: ------------------------------------------ @@ -627,67 +622,69 @@ o-----------------------------------------------------------------------------o #################### !macro FUNCTION_STRING_StrNSISToIO - !insertmacro STRFUNC_FUNC `StrNSISToIO` `2003-2004 Amir Szekely, Joost Verburg and Dave Laundon` + !insertmacro STRFUNC_FUNC `StrNSISToIO` `2004 "bluenet" - Based on functions by Amir Szekely, Joost Verburg, Dave Laundon and Diego Pedroso` /*After this point: ------------------------------------------ - $0 = String (input) - $1 = OutVar (output) - $2 = Temp (temp)*/ + $R0 = String (input/output) + $R1 = StartCharPos (temp) + $R2 = StrLen (temp) + $R3 = TempStr (temp) + $R4 = TempRepStr (temp)*/ ;Get input from user - Exch $0 ;String (input) - Push $1 ;OutVar (output) - Push $2 ;Temp (temp) - - ;Initialize output - StrCpy $1 `` - - ;Loop until an escape character is found or "String" reaches its end - ${Do} - ;Get the next "String" character - StrCpy $2 $0 1 - - ;Abort when none left - ${If} $2 == `` - ${ExitDo} - ${Else} - ;Remove current character from "String" - StrCpy $0 $0 `` 1 - - ;Detect if current character is: - ${If} $2 == `\` ;Back-slash - StrCpy $1 `$1\\` - ${ElseIf} $2 == `$\r` ;Carriage return - StrCpy $1 `$1\r` - ${ElseIf} $2 == `$\n` ;Line feed - StrCpy $1 `$1\n` - ${ElseIf} $2 == `$\t` ;Tab - StrCpy $1 `$1\t` - ${Else} ;Anything else - StrCpy $1 "$1$2" - ${EndIf} - ${EndIf} - ${Loop} + Exch $R0 + Push $R1 + Push $R2 + Push $R3 + Push $R4 - /*After this point: - ------------------------------------------ - $0 = OutVar (output)*/ + ;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 - StrCpy $0 $1 - Pop $2 - Pop $1 - Exch $0 + Pop $R4 + Pop $R3 + Pop $R2 + Pop $R1 + Exch $R0 FunctionEnd - !macroend # Function StrRep ############### !macro FUNCTION_STRING_StrRep - !insertmacro STRFUNC_FUNC `StrRep` `2002-2004 Hendri Adriaens` + !insertmacro STRFUNC_FUNC `StrRep` `2004 Diego Pedroso - Based on functions by Hendri Adriaens` /*After this point: ------------------------------------------ @@ -767,6 +764,7 @@ o-----------------------------------------------------------------------------o Pop $R6 Pop $R5 Pop $R4 + Pop $R3 Pop $R2 Pop $R1 Exch $R0 @@ -778,7 +776,7 @@ o-----------------------------------------------------------------------------o ################ !macro FUNCTION_STRING_StrSort - !insertmacro STRFUNC_FUNC `StrSort` `2004 Diego Pedroso - based on SortString by "Afrow UK"` + !insertmacro STRFUNC_FUNC `StrSort` `2004 Diego Pedroso - Based on functions by Stuart Welch` /*After this point: ------------------------------------------ @@ -985,7 +983,7 @@ o-----------------------------------------------------------------------------o ############### !macro FUNCTION_STRING_StrStr - !insertmacro STRFUNC_FUNC `StrStr` `2002-2004 Ximon Eighteen` + !insertmacro STRFUNC_FUNC `StrStr` `2004 Diego Pedroso - Based on functions by Ximon Eighteen` /*After this point: ------------------------------------------ @@ -1309,7 +1307,7 @@ o-----------------------------------------------------------------------------o ############### !macro FUNCTION_STRING_StrTok - !insertmacro STRFUNC_FUNC `StrTok` `2004 Diego Pedroso - based on StrTok by "bigmac666"` + !insertmacro STRFUNC_FUNC `StrTok` `2004 Diego Pedroso - Based on functions by "bigmac666"` /*After this point: ------------------------------------------ $0 = SkipEmptyParts (input) @@ -1341,6 +1339,8 @@ o-----------------------------------------------------------------------------o Push $6 Push $7 Push $8 + Push $9 + Push $R0 ;Parameter defaults ${IfThen} $2 == `` ${|} StrCpy $2 `|` ${|} @@ -1434,6 +1434,8 @@ o-----------------------------------------------------------------------------o ;Return output to user + Pop $R0 + Pop $9 Pop $8 Pop $7 Pop $6 @@ -1451,7 +1453,7 @@ o-----------------------------------------------------------------------------o ######################## !macro FUNCTION_STRING_StrTrimNewLines - !insertmacro STRFUNC_FUNC `StrTrimNewLines` `2003-2004 Ximon Eighteen` + !insertmacro STRFUNC_FUNC `StrTrimNewLines` `2004 Diego Pedroso - Based on functions by Ximon Eighteen` /*After this point: ------------------------------------------ diff --git a/Include/StrFunc.txt b/Include/StrFunc.txt index c757ac97..3d113f31 100644 --- a/Include/StrFunc.txt +++ b/Include/StrFunc.txt @@ -378,7 +378,7 @@ How to use Example: - ${StrSort} $0 "This is just an example" " just" "" "ple" "0" "0" + ${StrSort} $0 "This is just an example" " just" "" "ple" "0" "0" "0" [_______(___)_______]( ) C R @@ -474,7 +474,7 @@ How to use Example: - ${StrStrAdv} $0 "This IS really just an example" "IS " ">" ">" "1" "0" "1" + ${StrStrAdv} $0 "This IS really just an example" "IS " ">" ">" "0" "0" "1" >>>>>( )[____________________] @@ -584,11 +584,22 @@ Functions included and not included Version History --------------- +1.09 - 10/22/2004 + +- Fixed stack problems involving: StrCase, StrRep, StrSort, StrTok. +- Fixed StrClb: When "Action" = "<>", handle was wrongly outputed as + text. +- Fixed StrSort, StrStrAdv documentation examples. +- Fixed StrIOToNSIS, StrLoc, StrNSISToIO, StrRep, StrStr: sometimes + didn't find "StrToSearch" at all. + 1.08 - 10/12/2004 - Converted all the functions to LogicLib. - StrSort: Totally remade and it can break old scripts. See documentation for details. +- StrTok: "ResultPart" has to start from 0 and it can break old scripts. + See documentation for details. - Added defines: StrFunc_List, *_List and *_TypeList. - Fixed StrStrAdv: Variables $R0-$R3 couldn't be used on scripts before calling. @@ -598,8 +609,8 @@ Version History 1.07 - 09/21/2004 - Removed ${UnStrFunc} command. Now you can just include uninstall -functions commands like ${UnStrStr} to be supported by uninstall functions -and sections. + functions commands like ${UnStrStr} to be supported by uninstall functions + and sections. - Added case-sensitive comparation option for StrStrAdv. - StrCase now uses System.dll which makes case convertions effective with all latin letters (i.e. ê). @@ -607,8 +618,6 @@ all latin letters (i.e. - StrClbSet and StrClbGet removed, added StrClb. - Made compact the most usual operations inside the header file. File size reduced. -- Added "!verbose" to header file -> faster compilation and header file -output organized (code borrowed from LogicLib.nsh). 1.06 - 03/26/2004 @@ -658,27 +667,25 @@ output organized (code borrowed from LogicLib.nsh). 0.02 - 01/24/2004 - - Completed StrFunc.nsh file. Need some tests and the readme. +- Completed StrFunc.nsh file. Need some tests and the readme. 0.01 - 01/22/2004 - - First version to test ideas... +- First version to test ideas... Credits ------- -Made by Diego Pedroso (aka deguix). + Made by Diego Pedroso (aka deguix). Functions Credits ----------------- -- StrCase, StrClb, StrLoc, StrSort, StrStrAdv and StrTok made - by Diego Pedroso, some based on functions made by Dave Laundon, - "Afrow UK" and "bigmac666". -- StrRep made by Hendri Adriaens. -- StrStr, StrTrimNewLines made by Ximon Eighteen. -- StrNSISToIO and StrIOToNSIS made by Amir Szekely, Joost Verburg and - Dave Laundon. +- All functions are made by Diego Pedroso on LogicLib format. They + are based on functions by Amir Szekely, Dave Laundon, Hendri + Adriaens, Nik Medved, Joost Verburg, Stuart Welch, Ximon Eighteen, + "bigmac666" and "bluenet". "bluenet"'s version of StrIOToNSIS and + StrNSISToIO on LogicLib format were included. License -------