StrRep: Difference between revisions
From NSIS Wiki
Jump to navigationJump to search
m ("occurances" -> "occurrences".) |
Idangozlan (talk | contribs) m (changed push calls to add support for usage with " sign) |
||
(12 intermediate revisions by 9 users not shown) | |||
Line 1: | Line 1: | ||
{{PageAuthor| | {{PageAuthor|dandaman32}} | ||
== Description == | == Description == | ||
This function searches and replaces all occurrences of a substring in a string. | This function searches and replaces all occurrences of a substring in a string. | ||
== How To Use == | == How To Use == | ||
=== Syntax === | === Usage / Syntax === | ||
<highlight-nsis> | <highlight-nsis> | ||
${StrRep} | ${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 | |||
</highlight-nsis> | </highlight-nsis> | ||
=== Parameters === | === 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''. | : Variable where resulting operation of the replacement is returned. If ''SubString'' is not found, the value is the same as ''String''. | ||
Line 37: | Line 26: | ||
; RepString | ; RepString | ||
: String to replace all | : String to replace all occurrences of ''SubString'' inside ''String''. | ||
=== Example === | === Example === | ||
<highlight-nsis> | <highlight-nsis> | ||
${StrRep} $0 "This is just an example" "just" "" | ${StrRep} $0 "This is just an example" "just " "" | ||
;$0 = "This is an example" | ;$0 = "This is an example" | ||
</highlight-nsis> | </highlight-nsis> | ||
Line 50: | Line 39: | ||
<highlight-nsis> | <highlight-nsis> | ||
!define StrRep "!insertmacro StrRep" | !define StrRep "!insertmacro StrRep" | ||
!macro StrRep output string old new | |||
!macro StrRep | Push `${string}` | ||
Push `${old}` | |||
Push `${new}` | |||
!ifdef __UNINSTALL__ | |||
Call un.StrRep | |||
!else | |||
Call StrRep | |||
!endif | |||
Pop ${output} | |||
!macroend | !macroend | ||
Function StrRep | !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 | |||
!insertmacro Func_StrRep "" | |||
!insertmacro Func_StrRep "un." | |||
</highlight-nsis> | |||
== Versions History == | |||
; 4.0 - updated by Marshall | |||
: Replaced superfluos extra variables with standard registers | |||
: Fixed infinite loop bug where replacement string contained the string-to-replace | |||
: Structured for installer/uninstaller versions | |||
: Changed macro parameter order to be more intuitive | |||
; 3.0.1 - updated by Dan Fuhry | |||
: Fixed bug where macro pushed strings in the wrong order | |||
; 3.0 - updated by Dan Fuhry | |||
: Uses less code and doesn't depend on LogicLib | |||
: Changed macro syntax to work like the PHP eqivalent | |||
;2.0.1 | ; 2.0.1 - updated by Diego Pedroso | ||
:Fixed stack problems | : Fixed stack problems | ||
== Credits == | == Credits == | ||
Version 4.0 - Marshall ([[User:Marshall|Marshall]]).<br> | |||
Version 3.x - Dan Fuhry ([[User:dandaman32|dandaman32]]).<br> | |||
Version 2.x - Diego Pedroso ([[User:deguix|deguix]]).<br> | Version 2.x - Diego Pedroso ([[User:deguix|deguix]]).<br> | ||
Version 1.x - | Version 1.x - [[User:Afrow UK|Afrow UK]] / Diego Pedroso ([[User:deguix|deguix]]).<br> | ||
Version [http://forums.winamp.com/showthread.php?threadid=83283 1.0] - Hendri Adriaens ([[User:Smile2Me|Smile2Me]]) | |||
[[Category:String Functions]] | [[Category:String Functions]] |
Latest revision as of 17:26, 29 August 2013
Author: dandaman32 (talk, contrib) |
Description
This function searches and replaces all occurrences of a substring in a string.
How To Use
Usage / Syntax
${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.
Example
${StrRep} $0 "This is just an example" "just " "" ;$0 = "This is an example"
Function Code
!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 !insertmacro Func_StrRep "" !insertmacro Func_StrRep "un."
Versions History
- 4.0 - updated by Marshall
- Replaced superfluos extra variables with standard registers
- Fixed infinite loop bug where replacement string contained the string-to-replace
- Structured for installer/uninstaller versions
- Changed macro parameter order to be more intuitive
- 3.0.1 - updated by Dan Fuhry
- Fixed bug where macro pushed strings in the wrong order
- 3.0 - updated by Dan Fuhry
- Uses less code and doesn't depend on LogicLib
- Changed macro syntax to work like the PHP eqivalent
- 2.0.1 - updated by Diego Pedroso
- Fixed stack problems
Credits
Version 4.0 - Marshall (Marshall).
Version 3.x - Dan Fuhry (dandaman32).
Version 2.x - Diego Pedroso (deguix).
Version 1.x - Afrow UK / Diego Pedroso (deguix).
Version 1.0 - Hendri Adriaens (Smile2Me)