Subversion Repositories DevTools

Rev

Blame | Last modification | View Log | RSS feed

;------------------------------------------------------------------------------
; Code originally from http://nsis.sourceforge.net/ReplaceInFile
;
; Description
;       This is a simple way to replace the occurrences of a certain string
;       throughout the lines of a file. Typically this is used to turn templates
;       for  configuration files into 'real' ones.
;
; Usage/Syntax
;       !include StrRep.nsh
;       !include ReplaceInFile.nsh
;       ; instantiate the function for either the installer/uninstaller or both
;       !insertmacro Func_RIF ""
;       !insertmacro Func_RIF "un."
;       [...]
;       ; and now use the macro to call the function
;       !insertmacro _ReplaceInFile SOURCE_FILE SEARCH_TEXT REPLACEMENT
;
;------------------------------------------------------------------------------

!macro _ReplaceInFile SOURCE_FILE SEARCH_TEXT REPLACEMENT
    Push "${SOURCE_FILE}"
    Push "${SEARCH_TEXT}"
    Push "${REPLACEMENT}"
    !ifdef __UNINSTALL__
        Call un.RIF
    !else
        Call RIF
    !endif
!macroend


!macro Func_RIF un
    Function ${un}RIF
        ClearErrors  ; want to be a newborn

        Exch $0      ; REPLACEMENT
        Exch
        Exch $1      ; SEARCH_TEXT
        Exch 2
        Exch $2      ; SOURCE_FILE

        Push $R0     ; SOURCE_FILE file handle
        Push $R1     ; temporary file handle
        Push $R2     ; unique temporary file name
        Push $R3     ; a line to sar/save
        Push $R4     ; shift puffer

        IfFileExists $2 +1 RIF_error    ; knock-knock
        FileOpen $R0 $2 "r"             ; open the door

        GetTempFileName $R2             ; who's new?
        FileOpen $R1 $R2 "w"            ; the escape, please!

        RIF_loop:                           ; round'n'round we go
            FileRead $R0 $R3                ; read one line
            IfErrors RIF_leaveloop          ; enough is enough
        RIF_sar:                            ; sar - search and replace
            Push "$R3"                      ; (hair)stack
            Push "$1"                       ; needle
            Push "$0"                       ; blood
            Call ${un}StrRep                ; do the bartwalk
            StrCpy $R4 "$R3"                ; remember previous state
            Pop $R3                         ; gimme s.th. back in return!
            StrCmp "$R3" "$R4" +1 RIF_sar   ; loop, might change again!
            FileWrite $R1 "$R3"             ; save the newbie
            Goto RIF_loop                   ; gimme more

        RIF_leaveloop:                      ; over'n'out, Sir!
            FileClose $R1                   ; S'rry, Ma'am - clos'n now
            FileClose $R0                   ; me 2

            Delete "$2.rif.old"             ; go away, Sire
            Rename "$2" "$2.rif.old"        ; step aside, Ma'am
            Rename "$R2" "$2"               ; hi, baby!

            ClearErrors                     ; now i AM a newborn
            Goto RIF_out                    ; out'n'away

        RIF_error:                          ; ups - s.th. went wrong...
            SetErrors                       ; ...so cry, boy!

        RIF_out:                            ; your wardrobe?
            Delete "$2.rif.old"
            Pop $R4
            Pop $R3
            Pop $R2
            Pop $R1
            Pop $R0
            Pop $2
            Pop $0
            Pop $1
    FunctionEnd
!macroend