Another String Replace (and Slash/BackSlash Converter): Difference between revisions
From NSIS Wiki
Jump to navigationJump to search
m (Wikipedia python library) |
(→StrSlash: call StrReplace -> call StrRep) |
||
(8 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
{{PageAuthor|dirtydingus}} | |||
== Links == | |||
[http://forums.winamp.com/showthread.php?s=&threadid=125750 Original forum thread] | |||
== Description == | == Description == | ||
I also wrote a string replace function - this one can be optimized considerably if you know what you are replacing as I originally wrote it to replace /s with \s and vice versa - that version is at the end | I also wrote a string replace function - this one can be optimized considerably if you know what you are replacing as I originally wrote it to replace /s with \s and vice versa - that version is at the end | ||
Line 92: | Line 97: | ||
</highlight-nsis> | </highlight-nsis> | ||
If you add the following macro at the beggining of the script, you can call the function more easily. | |||
<highlight-nsis> | |||
!macro _StrReplaceConstructor ORIGINAL_STRING TO_REPLACE REPLACE_BY | |||
Push "${ORIGINAL_STRING}" | |||
Push "${TO_REPLACE}" | |||
Push "${REPLACE_BY}" | |||
Call StrRep | |||
Pop $0 | |||
!macroend | |||
!define StrReplace '!insertmacro "_StrReplaceConstructor"' | |||
</highlight-nsis> | |||
Now here's how you call the macro : | |||
<highlight-nsis> | |||
${StrReplace} "C:\my documents\" "\" "//" | |||
MessageBox MB_OK $0 | |||
</highlight-nsis> | |||
[[Category:String Functions]] |
Latest revision as of 14:16, 29 July 2011
Author: dirtydingus (talk, contrib) |
Links
Description
I also wrote a string replace function - this one can be optimized considerably if you know what you are replacing as I originally wrote it to replace /s with \s and vice versa - that version is at the end
Usage
Syntax is the same as the other replace function:
Push "String to do replacement in (haystack)" Push "String to replace (needle)" Push "Replacement" Call StrRep Pop "$R0" ;result
The Functions
StrRep
Function StrRep Exch $R4 ; $R4 = Replacement String Exch Exch $R3 ; $R3 = String to replace (needle) Exch 2 Exch $R1 ; $R1 = String to do replacement in (haystack) Push $R2 ; Replaced haystack Push $R5 ; Len (needle) Push $R6 ; len (haystack) Push $R7 ; Scratch reg StrCpy $R2 "" StrLen $R5 $R3 StrLen $R6 $R1 loop: StrCpy $R7 $R1 $R5 StrCmp $R7 $R3 found StrCpy $R7 $R1 1 ; - optimization can be removed if U know len needle=1 StrCpy $R2 "$R2$R7" StrCpy $R1 $R1 $R6 1 StrCmp $R1 "" done loop found: StrCpy $R2 "$R2$R4" StrCpy $R1 $R1 $R6 $R5 StrCmp $R1 "" done loop done: StrCpy $R3 $R2 Pop $R7 Pop $R6 Pop $R5 Pop $R2 Pop $R1 Pop $R4 Exch $R3 FunctionEnd
StrSlash
Here is my Slash to Backslash converter. The version shown uses similar registers to the StrRep function above, which is why it they are not contiguous or in a particularly logical order. Call it with the haystack and the direction on the stack as shown in the comment above it
; Push $filenamestring (e.g. 'c:\this\and\that\filename.htm') ; Push "\" ; Call StrSlash ; Pop $R0 ; ;Now $R0 contains 'c:/this/and/that/filename.htm' Function StrSlash Exch $R3 ; $R3 = needle ("\" or "/") Exch Exch $R1 ; $R1 = String to replacement in (haystack) Push $R2 ; Replaced haystack Push $R4 ; $R4 = not $R3 ("/" or "\") Push $R6 Push $R7 ; Scratch reg StrCpy $R2 "" StrLen $R6 $R1 StrCpy $R4 "\" StrCmp $R3 "/" loop StrCpy $R4 "/" loop: StrCpy $R7 $R1 1 StrCpy $R1 $R1 $R6 1 StrCmp $R7 $R3 found StrCpy $R2 "$R2$R7" StrCmp $R1 "" done loop found: StrCpy $R2 "$R2$R4" StrCmp $R1 "" done loop done: StrCpy $R3 $R2 Pop $R7 Pop $R6 Pop $R4 Pop $R2 Pop $R1 Exch $R3 FunctionEnd
If you add the following macro at the beggining of the script, you can call the function more easily.
!macro _StrReplaceConstructor ORIGINAL_STRING TO_REPLACE REPLACE_BY Push "${ORIGINAL_STRING}" Push "${TO_REPLACE}" Push "${REPLACE_BY}" Call StrRep Pop $0 !macroend !define StrReplace '!insertmacro "_StrReplaceConstructor"'
Now here's how you call the macro :
${StrReplace} "C:\my documents\" "\" "//" MessageBox MB_OK $0