Another String Replace (and Slash/BackSlash Converter): Difference between revisions

From NSIS Wiki
Jump to navigationJump to search
m (Added category links.)
(→‎StrSlash: call StrReplace -> call StrRep)
 
(4 intermediate revisions by 3 users not shown)
Line 1: Line 1:
{|align=right
{{PageAuthor|dirtydingus}}
|<small>Author: [[{{ns:2}}:dirtydingus|dirtydingus]] ([[{{ns:3}}:dirtydingus|talk]], [[{{ns:-1}}:Contributions/dirtydingus|contrib]])</small>
 
|}
== Links ==
<br style="clear:both;">
[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 96: Line 97:
</highlight-nsis>
</highlight-nsis>


[[{{ns:14}}:String Functions]]
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>


[[{{ns:14}}:String Functions]]
[[Category:String Functions]]

Latest revision as of 14:16, 29 July 2011

Author: dirtydingus (talk, contrib)


Links

Original forum thread

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