WordReplace: Difference between revisions

From NSIS Wiki
Jump to navigationJump to search
No edit summary
No edit summary
 
(2 intermediate revisions by the same user not shown)
Line 1: Line 1:
{{PageAuthor|Instructor}}
{{PageAuthor|Instructor}}


== Links ==
{{User:Instructor/Headers/Template}}


; Latest version of headers "nsh.zip":
== Function Description ==
: http://forums.winamp.com/showthread.php?s=&threadid=203228&goto=lastpost
 
If a function is used without header, put the function code in your script before calling it.
 
== The Function Description==


<highlight-nsis>
<highlight-nsis>
____________________________________________________________________________
____________________________________________________________________________


                         WordReplace v2.0 (replace or delete)
                         WordReplace v2.2
____________________________________________________________________________
____________________________________________________________________________


Line 34: Line 29:
                   ;  +number* : word number from start multiple-replace
                   ;  +number* : word number from start multiple-replace
                   ;  -number* : word number from end multiple-replace
                   ;  -number* : word number from end multiple-replace
                   ;  +        : replace or delete all founded
                   ;  +        : replace all founded
                   ;  +*      : multiple-replace all founded
                   ;  +*      : multiple-replace all founded
                   ;  {}      : if exists replace or delete all delimiters
                  ;  {        : if exists replace all delimiters
                   ;              from edges (no errorlevel output)
                  ;              from left edge
                   ;  {}*      : if exists multiple-replace all delimiters
                  ;  }        : if exists replace all delimiters
                   ;              from edges (no errorlevel output)
                  ;              from right edge
                   ;  {}      : if exists replace all delimiters
                   ;              from edges
                  ;  {*      : if exists multiple-replace all
                  ;              delimiters from left edge
                  ;  }*      : if exists multiple-replace all
                  ;              delimiters from right edge
                   ;  {}*      : if exists multiple-replace all
                   ;              delimiters from edges
                   ;
                   ;
                   ;[E]
                   ;[E]
                   ;  with errorlevel output
                   ;  with errorlevel output
                   ;  IfErrors:
                   ;  IfErrors:
                   ;    $var=1  word to replace or delete not found
                   ;    $var=1  word to replace not found
                   ;    $var=2  no such word number
                   ;    $var=2  no such word number
                   ;    $var=3  syntax error (Use: +1,-1,+1*,-1*,+,+*,{},{}*)
                   ;    $var=3  syntax error (Use: +1,-1,+1*,-1*,+,+*,{},{}*)
Line 106: Line 109:
</highlight-nsis>
</highlight-nsis>


== The Function Code==
== Function Code ==


<highlight-nsis>
<highlight-nsis>
Line 144: Line 147:
StrCpy $9 ''
StrCpy $9 ''
StrCpy $3 $2 1
StrCpy $3 $2 1
StrCmp $3 'E' 0 +4
StrCpy $2 $2 '' 1
StrCmp $3 'E' 0 +3
StrCpy $9 E
StrCpy $9 E
StrCpy $2 $2 '' 1
goto -4
goto -4


StrCpy $4 $2 1 -1
StrCpy $5 ''
StrCpy $6 ''
StrLen $7 $0
StrLen $7 $0


StrCpy $4 $2 3
StrCmp $7 0 error1
StrCpy $5 $2 2
StrCmp $R0 '' error1
StrCmp $4 '{}*' +3
StrCmp $3 '{' beginning
StrCmp $5 '{}' +2
StrCmp $3 '}' ending errorchk
goto errorchk
 
StrCmp $7 0 end
beginning:
StrCpy $5 ''
StrCpy $8 $R0 $7
StrCpy $6 ''
StrCmp $8 $0 0 +4
StrCpy $3 $R0 $7
StrCmp $3 $0 0 +4
StrCpy $R0 $R0 '' $7
StrCpy $R0 $R0 '' $7
StrCpy $5 '$1$5'
StrCpy $5 '$5$1'
goto -4
goto -4
StrCpy $3 $R0 '' -$7
StrCpy $3 $2 1
StrCmp $3 $0 0 +4
StrCmp $3 '}' 0 merge
 
ending:
StrCpy $8 $R0 '' -$7
StrCmp $8 $0 0 +4
StrCpy $R0 $R0 -$7
StrCpy $R0 $R0 -$7
StrCpy $6 '$6$1'
StrCpy $6 '$6$1'
goto -4
goto -4
StrCmp $4 '{}*' 0 +5
 
merge:
StrCmp $4 '*' 0 +5
StrCmp $5 '' +2
StrCmp $5 '' +2
StrCpy $5 $1
StrCpy $5 $1
Line 178: Line 188:


errorchk:
errorchk:
StrCpy $3 $2 1
StrCpy $2 $2 '' 1
StrCmp $3 '+' +2
StrCmp $3 '+' +2
StrCmp $3 '-' 0 error3
StrCmp $3 '-' 0 error3
StrCmp $R0 '' error1
StrCmp $7 0 error1


StrCpy $4 $2 1 -1
StrCpy $5 $2 1
StrCpy $5 $2 1
IntOp $2 $2 + 0
IntOp $2 $2 + 0
Line 195: Line 200:
StrCpy $5 0
StrCpy $5 0
StrCpy $2 $R0 $7 $5
StrCpy $2 $R0 $7 $5
StrCmp $2$3 '' error1
StrCmp $2 '' +4
StrCmp $2 '' +4
StrCmp $2 $0 +5
StrCmp $2 $0 +6
IntOp $5 $5 + 1
IntOp $5 $5 + 1
goto -5
goto -4
StrCmp $R0 $R1 error1
StrCpy $R0 '$3$R0'
StrCpy $R0 '$3$R0'
goto end
goto end

Latest revision as of 07:34, 7 February 2006

Author: Instructor (talk, contrib)


Page for NSIS 2.07 and below users

You can use the latest version of headers (recommended) or the following function code (put the function code in your script before calling it)

Function Description

____________________________________________________________________________
 
                         WordReplace v2.2
____________________________________________________________________________
 
 
Replace or delete word from string.
 
 
Syntax:
${WordReplace} "[string]" "[word1]" "[word2]" "[E][options]" $var
 
"[string]"         ;[string]
                   ;  input string
"[word1]"          ;[word1]
                   ;  word to replace or delete
"[word2]"          ;[word2]
                   ;  replace with (if empty delete)
"[E][options]"     ;[options]
                   ;  +number  : word number from start
                   ;  -number  : word number from end
                   ;  +number* : word number from start multiple-replace
                   ;  -number* : word number from end multiple-replace
                   ;  +        : replace all founded
                   ;  +*       : multiple-replace all founded
                   ;  {        : if exists replace all delimiters
                   ;               from left edge
                   ;  }        : if exists replace all delimiters
                   ;               from right edge
                   ;  {}       : if exists replace all delimiters
                   ;               from edges
                   ;  {*       : if exists multiple-replace all
                   ;               delimiters from left edge
                   ;  }*       : if exists multiple-replace all
                   ;               delimiters from right edge
                   ;  {}*      : if exists multiple-replace all
                   ;               delimiters from edges
                   ;
                   ;[E]
                   ;  with errorlevel output
                   ;  IfErrors:
                   ;     $var=1  word to replace not found
                   ;     $var=2  no such word number
                   ;     $var=3  syntax error (Use: +1,-1,+1*,-1*,+,+*,{},{}*)
                   ;[]
                   ;  no errorlevel output (default)
                   ;  If some errors found then (result=input string)
                   ;
$var               ;output (result)


Example (replace):

Section
	${WordReplace} "C:\io.sys C:\logo.sys C:\WINDOWS" "SYS" "bmp" "+2" $R0
	; $R0="C:\io.sys C:\logo.bmp C:\WINDOWS"
SectionEnd

Example (delete):

Section
	${WordReplace} "C:\io.sys C:\logo.sys C:\WINDOWS" "SYS" "" "+" $R0
	; $R0="C:\io. C:\logo. C:\WINDOWS"
SectionEnd

Example (multiple-replace 1):

Section
	${WordReplace} "C:\io.sys      C:\logo.sys   C:\WINDOWS" " " " " "+1*" $R0
	; +1* or +2* or +3* or +4* or +5* or +6*
	; $R0="C:\io.sys C:\logo.sys   C:\WINDOWS"
SectionEnd

Example (multiple-replace 2):

Section
	${WordReplace} "C:\io.sys C:\logo.sysSYSsys C:\WINDOWS" "sys" "bmp" "+*" $R0
	; $R0="C:\io.bmp C:\logo.bmp C:\WINDOWS"
SectionEnd

Example (multiple-replace 3):

Section
	${WordReplace} "sysSYSsysC:\io.sys C:\logo.sys C:\WINDOWSsysSYSsys" "sys" "|" "{}*" $R0
	; $R0="|C:\io.sys C:\logo.sys C:\WINDOWS|"
SectionEnd

Example (With errorlevel output):

Section
	${WordReplace} "C:\io.sys C:\logo.sys" "sys" "bmp" "E+3" $R0
	; $R0="2" (no such word number "+3")
 
	IfErrors 0 noerrors
	MessageBox MB_OK 'Errorlevel=$R0' IDOK end
 
	noerrors:
	MessageBox MB_OK 'No errors'
 
	end:
SectionEnd

Function Code

Function WordReplace
	!define WordReplace `!insertmacro WordReplaceCall`
 
	!macro WordReplaceCall _STRING _WORD1 _WORD2 _NUMBER _RESULT
		Push `${_STRING}`
		Push `${_WORD1}`
		Push `${_WORD2}`
		Push `${_NUMBER}`
		Call WordReplace
		Pop ${_RESULT}
	!macroend
 
	Exch $2
	Exch
	Exch $1
	Exch
	Exch 2
	Exch $0
	Exch 2
	Exch 3
	Exch $R0
	Exch 3
	Push $3
	Push $4
	Push $5
	Push $6
	Push $7
	Push $8
	Push $9
	Push $R1
	ClearErrors
 
	StrCpy $R1 $R0
	StrCpy $9 ''
	StrCpy $3 $2 1
	StrCpy $2 $2 '' 1
	StrCmp $3 'E' 0 +3
	StrCpy $9 E
	goto -4
 
	StrCpy $4 $2 1 -1
	StrCpy $5 ''
	StrCpy $6 ''
	StrLen $7 $0
 
	StrCmp $7 0 error1
	StrCmp $R0 '' error1
	StrCmp $3 '{' beginning
	StrCmp $3 '}' ending errorchk
 
	beginning:
	StrCpy $8 $R0 $7
	StrCmp $8 $0 0 +4
	StrCpy $R0 $R0 '' $7
	StrCpy $5 '$5$1'
	goto -4
	StrCpy $3 $2 1
	StrCmp $3 '}' 0 merge
 
	ending:
	StrCpy $8 $R0 '' -$7
	StrCmp $8 $0 0 +4
	StrCpy $R0 $R0 -$7
	StrCpy $6 '$6$1'
	goto -4
 
	merge:
	StrCmp $4 '*' 0 +5
	StrCmp $5 '' +2
	StrCpy $5 $1
	StrCmp $6 '' +2
	StrCpy $6 $1
	StrCpy $R0 '$5$R0$6'
	goto end
 
	errorchk:
	StrCmp $3 '+' +2
	StrCmp $3 '-' 0 error3
 
	StrCpy $5 $2 1
	IntOp $2 $2 + 0
	StrCmp $2 0 0 one
	StrCmp $5 0 error2
	StrCpy $3 ''
 
	all:
	StrCpy $5 0
	StrCpy $2 $R0 $7 $5
	StrCmp $2 '' +4
	StrCmp $2 $0 +6
	IntOp $5 $5 + 1
	goto -4
	StrCmp $R0 $R1 error1
	StrCpy $R0 '$3$R0'
	goto end
	StrCpy $2 $R0 $5
	IntOp $5 $5 + $7
	StrCmp $4 '*' 0 +3
	StrCpy $6 $R0 $7 $5
	StrCmp $6 $0 -3
	StrCpy $R0 $R0 '' $5
	StrCpy $3 '$3$2$1'
	goto all
 
	one:
	StrCpy $5 0
	StrCpy $8 0
	goto loop
 
	preloop:
	IntOp $5 $5 + 1
 
	loop:
	StrCpy $6 $R0 $7 $5
	StrCmp $6$8 0 error1
	StrCmp $6 '' minus
	StrCmp $6 $0 0 preloop
	IntOp $8 $8 + 1
	StrCmp $3$8 +$2 found
	IntOp $5 $5 + $7
	goto loop
 
	minus:
	StrCmp $3 '-' 0 error2
	StrCpy $3 +
	IntOp $2 $8 - $2
	IntOp $2 $2 + 1
	IntCmp $2 0 error2 error2 one
 
	found:
	StrCpy $3 $R0 $5
	StrCmp $4 '*' 0 +5
	StrCpy $6 $3 '' -$7
	StrCmp $6 $0 0 +3
	StrCpy $3 $3 -$7
	goto -3
	IntOp $5 $5 + $7
	StrCmp $4 '*' 0 +3
	StrCpy $6 $R0 $7 $5
	StrCmp $6 $0 -3
	StrCpy $R0 $R0 '' $5
	StrCpy $R0 '$3$1$R0'
	goto end
 
	error3:
	StrCpy $R0 3
	goto error
	error2:
	StrCpy $R0 2
	goto error
	error1:
	StrCpy $R0 1
	error:
	StrCmp $9 'E' +3
	StrCpy $R0 $R1
	goto +2
	SetErrors
 
	end:
	Pop $R1
	Pop $9
	Pop $8
	Pop $7
	Pop $6
	Pop $5
	Pop $4
	Pop $3
	Pop $2
	Pop $1
	Pop $0
	Exch $R0
FunctionEnd