Subversion Repositories DevTools

Rev

Blame | Last modification | View Log | RSS feed

;------------------------------------------------------------------------------
; Code originally from http://nsis.sourceforge.net/StrRep
;
; Description
;       This function searches and replaces all occurrences of a substring in a string.
;
; Usage/Syntax
;       !include StrRep.nsh
;       ; instantiate the function for either the installer/uninstaller or both
;       !insertmacro Func_StrRep ""
;       !insertmacro Func_StrRep "un."
;       [...]
;       ; and now use the macro to call the function
;       ${StrRep} '$0' 'C:\Documents and Settings\Dan\Desktop\PSCP Frontend.exe' '\' '\\'
;       MessageBox MB_OK $0 ; will be C:\\Documents and Settings\\Dan\\Desktop\\PSCP Frontend.exe
;
;Parameters
;       ${StrRep} "$result_var" "String" "SubString" "RepString"
;
;       $result_var
;               Variable where resulting operation of the replacement is returned.
;               If SubString is not found, the value is the same as String.
;
;       String
;               String where to search for SubString.
;
;       SubString
;               String to search in String and to be replaced by RepString.
;
;       RepString
;               String to replace all occurrences of SubString inside String.
;
;------------------------------------------------------------------------------

!define StrRep "!insertmacro StrRep"

!macro StrRep output string old new
    Push "${string}"
    Push "${old}"
    Push "${new}"
    !ifdef __UNINSTALL__
        Call un.StrRep
    !else
        Call StrRep
    !endif
    Pop ${output}
!macroend

!macro Func_StrRep un
    Function ${un}StrRep
        Exch $R2 ;new
        Exch 1
        Exch $R1 ;old
        Exch 2
        Exch $R0 ;string
        Push $R3
        Push $R4
        Push $R5
        Push $R6
        Push $R7
        Push $R8
        Push $R9

        StrCpy $R3 0
        StrLen $R4 $R1
        StrLen $R6 $R0
        StrLen $R9 $R2
        loop:
            StrCpy $R5 $R0 $R4 $R3
            StrCmp $R5 $R1 found
            StrCmp $R3 $R6 done
            IntOp $R3 $R3 + 1 ;move offset by 1 to check the next character
            Goto loop
        found:
            StrCpy $R5 $R0 $R3
            IntOp $R8 $R3 + $R4
            StrCpy $R7 $R0 "" $R8
            StrCpy $R0 $R5$R2$R7
            StrLen $R6 $R0
            IntOp $R3 $R3 + $R9 ;move offset by length of the replacement string
            Goto loop
        done:

        Pop $R9
        Pop $R8
        Pop $R7
        Pop $R6
        Pop $R5
        Pop $R4
        Pop $R3
        Push $R0
        Push $R1
        Pop $R0
        Pop $R1
        Pop $R0
        Pop $R2
        Exch $R1
    FunctionEnd
!macroend