NSIS/Include/WordFunc.nsh

1789 lines
30 KiB
NSIS
Raw Normal View History

/*
_____________________________________________________________________________
Word Functions Header v3.1
_____________________________________________________________________________
2005 Shengalts Aleksander aka Instructor (Shengalts@mail.ru)
See documentation for more information about the following functions.
Usage in script:
1. !include "WordFunc.nsh"
2. !insertmacro WordFunction
3. [Section|Function]
${WordFunction} "Param1" "Param2" "..." $var
[SectionEnd|FunctionEnd]
WordFunction=[WordFind|WordFind2X|WordFind3X|WordReplace|WordAdd|WordInsert|
StrFilter|VersionCompare|VersionConvert]
un.WordFunction=[un.WordFind|un.WordFind2X|un.WordFind3X|un.WordReplace|
un.WordAdd|un.WordInsert|un.StrFilter|un.VersionCompare|
un.VersionConvert]
_____________________________________________________________________________
Thanks to:
_____________________________________________________________________________
WordFind3X
Afrow UK (Based on his idea of Function "StrSortLR")
StrFilter
sunjammer (Function "StrUpper")
VersionCompare
Afrow UK (Based on his Function "VersionCheckNew2")
VersionConvert
Afrow UK (Based on his idea of Function "CharIndexReplace")
*/
;_____________________________________________________________________________
;
; Macros
;_____________________________________________________________________________
;
; Change log window verbosity (default: 3=no script)
;
; Example:
; !include "WordFunc.nsh"
; !insertmacro WordFind
; ${WORDFUNC_VERBOSE} 4 # all verbosity
; !insertmacro WordReplace
; ${WORDFUNC_VERBOSE} 3 # no script
!verbose push
!verbose 3
!ifndef _WORDFUNC_VERBOSE
!define _WORDFUNC_VERBOSE 3
!endif
!verbose ${_WORDFUNC_VERBOSE}
!define WORDFUNC_VERBOSE `!insertmacro WORDFUNC_VERBOSE`
!define _WORDFUNC_UN1
!define _WORDFUNC_UN2
!verbose pop
!macro WORDFUNC_VERBOSE _VERBOSE
!verbose push
!verbose 3
!undef _WORDFUNC_VERBOSE
!define _WORDFUNC_VERBOSE ${_VERBOSE}
!verbose 4
!echo `"verbosity=${_VERBOSE}"`
!verbose pop
!macroend
!macro WordFindCall _STRING _DELIMITER _OPTION _RESULT
!verbose push
!verbose ${_WORDFUNC_VERBOSE}
Push `${_STRING}`
Push `${_DELIMITER}`
Push `${_OPTION}`
Call WordFind
Pop ${_RESULT}
!verbose pop
!macroend
!macro WordFind2XCall _STRING _DELIMITER1 _DELIMITER2 _NUMBER _RESULT
!verbose push
!verbose ${_WORDFUNC_VERBOSE}
Push `${_STRING}`
Push `${_DELIMITER1}`
Push `${_DELIMITER2}`
Push `${_NUMBER}`
Call WordFind2X
Pop ${_RESULT}
!verbose pop
!macroend
!macro WordFind3XCall _STRING _DELIMITER1 _CENTER _DELIMITER2 _NUMBER _RESULT
!verbose push
!verbose ${_WORDFUNC_VERBOSE}
Push `${_STRING}`
Push `${_DELIMITER1}`
Push `${_CENTER}`
Push `${_DELIMITER2}`
Push `${_NUMBER}`
Call WordFind3X
Pop ${_RESULT}
!verbose pop
!macroend
!macro WordReplaceCall _STRING _WORD1 _WORD2 _NUMBER _RESULT
!verbose push
!verbose ${_WORDFUNC_VERBOSE}
Push `${_STRING}`
Push `${_WORD1}`
Push `${_WORD2}`
Push `${_NUMBER}`
Call WordReplace
Pop ${_RESULT}
!verbose pop
!macroend
!macro WordAddCall _STRING1 _DELIMITER _STRING2 _RESULT
!verbose push
!verbose ${_WORDFUNC_VERBOSE}
Push `${_STRING1}`
Push `${_DELIMITER}`
Push `${_STRING2}`
Call WordAdd
Pop ${_RESULT}
!verbose pop
!macroend
!macro WordInsertCall _STRING _DELIMITER _WORD _NUMBER _RESULT
!verbose push
!verbose ${_WORDFUNC_VERBOSE}
Push `${_STRING}`
Push `${_DELIMITER}`
Push `${_WORD}`
Push `${_NUMBER}`
Call WordInsert
Pop ${_RESULT}
!verbose pop
!macroend
!macro StrFilterCall _STRING _FILTER _INCLUDE _EXCLUDE _RESULT
!verbose push
!verbose ${_WORDFUNC_VERBOSE}
Push `${_STRING}`
Push `${_FILTER}`
Push `${_INCLUDE}`
Push `${_EXCLUDE}`
Call StrFilter
Pop ${_RESULT}
!verbose pop
!macroend
!macro VersionCompareCall _VER1 _VER2 _RESULT
!verbose push
!verbose ${_WORDFUNC_VERBOSE}
Push `${_VER1}`
Push `${_VER2}`
Call VersionCompare
Pop ${_RESULT}
!verbose pop
!macroend
!macro VersionConvertCall _VERSION _CHARLIST _RESULT
!verbose push
!verbose ${_WORDFUNC_VERBOSE}
Push `${_VERSION}`
Push `${_CHARLIST}`
Call VersionConvert
Pop ${_RESULT}
!verbose pop
!macroend
!macro WordFind
!ifndef ${_WORDFUNC_UN1}WordFind
!verbose push
!verbose ${_WORDFUNC_VERBOSE}
!define ${_WORDFUNC_UN1}WordFind `!insertmacro ${_WORDFUNC_UN1}WordFindCall`
Function ${_WORDFUNC_UN1}WordFind
Exch $1
Exch
Exch $0
Exch
Exch 2
Exch $R0
Exch 2
Push $2
Push $3
Push $4
Push $5
Push $6
Push $7
Push $8
Push $9
Push $R1
ClearErrors
StrCpy $9 ''
StrCpy $2 $1 1
StrCpy $1 $1 '' 1
StrCmp $2 'E' 0 +3
StrCpy $9 E
goto -4
StrCpy $3 ''
StrCmp $2 '+' +6
StrCmp $2 '-' +5
StrCmp $2 '/' restart
StrCmp $2 '#' restart
StrCmp $2 '*' restart
goto error3
StrCpy $4 $1 1 -1
StrCmp $4 '*' +4
StrCmp $4 '}' +3
StrCmp $4 '{' +2
goto +4
StrCpy $1 $1 -1
StrCpy $3 '$4$3'
goto -7
StrCmp $3 '*' error3
StrCmp $3 '**' error3
StrCmp $3 '}{' error3
IntOp $1 $1 + 0
StrCmp $1 0 error2
restart:
StrCmp $R0 '' error1
StrCpy $4 0
StrCpy $5 0
StrCpy $6 0
StrLen $7 $0
goto loop
preloop:
IntOp $6 $6 + 1
loop:
StrCpy $8 $R0 $7 $6
StrCmp $8$5 0 error1
StrCmp $8 '' +2
StrCmp $8 $0 +5 preloop
StrCmp $3 '{' minus
StrCmp $3 '}' minus
StrCmp $2 '*' minus
StrCmp $5 $6 minus +5
StrCmp $3 '{' +4
StrCmp $3 '}' +3
StrCmp $2 '*' +2
StrCmp $5 $6 nextword
IntOp $4 $4 + 1
StrCmp $2$4 +$1 plus
StrCmp $2 '/' 0 nextword
IntOp $8 $6 - $5
StrCpy $8 $R0 $8 $5
StrCmp $1 $8 0 nextword
StrCpy $R1 $4
goto end
nextword:
IntOp $6 $6 + $7
StrCpy $5 $6
goto loop
minus:
StrCmp $2 '-' 0 sum
StrCpy $2 '+'
IntOp $1 $4 - $1
IntOp $1 $1 + 1
IntCmp $1 0 error2 error2 restart
sum:
StrCmp $2 '#' 0 sumdelim
StrCpy $R1 $4
goto end
sumdelim:
StrCmp $2 '*' 0 error2
StrCpy $R1 $4
goto end
plus:
StrCmp $3 '' 0 +4
IntOp $6 $6 - $5
StrCpy $R1 $R0 $6 $5
goto end
StrCmp $3 '{' 0 +3
StrCpy $R1 $R0 $6
goto end
StrCmp $3 '}' 0 +4
IntOp $6 $6 + $7
StrCpy $R1 $R0 '' $6
goto end
StrCmp $3 '{*' +2
StrCmp $3 '*{' 0 +3
StrCpy $R1 $R0 $6
goto end
StrCmp $3 '*}' +2
StrCmp $3 '}*' 0 +3
StrCpy $R1 $R0 '' $5
goto end
StrCmp $3 '}}' 0 +3
StrCpy $R1 $R0 '' $6
goto end
StrCmp $3 '{{' 0 +3
StrCpy $R1 $R0 $5
goto end
StrCmp $3 '{}' 0 error3
StrLen $3 $R0
StrCmp $3 $6 0 +3
StrCpy $0 ''
goto +2
IntOp $6 $6 + $7
StrCpy $8 $R0 '' $6
StrCmp $4$8 1 +6
StrCmp $4 1 +2 +7
IntOp $6 $6 + $7
StrCpy $3 $R0 $7 $6
StrCmp $3 '' +2
StrCmp $3 $0 -3 +3
StrCpy $R1 ''
goto end
StrCmp $5 0 0 +3
StrCpy $0 ''
goto +2
IntOp $5 $5 - $7
StrCpy $3 $R0 $5
StrCpy $R1 '$3$0$8'
goto end
error3:
StrCpy $R1 3
goto error
error2:
StrCpy $R1 2
goto error
error1:
StrCpy $R1 1
error:
StrCmp $9 'E' 0 +3
SetErrors
end:
StrCpy $R0 $R1
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
!ifndef _WORDFUNC_UN2
!undef _WORDFUNC_UN1
!define _WORDFUNC_UN1
!endif
!verbose pop
!endif
!macroend
!macro WordFind2X
!ifndef ${_WORDFUNC_UN1}WordFind2X
!verbose push
!verbose ${_WORDFUNC_VERBOSE}
!define ${_WORDFUNC_UN1}WordFind2X `!insertmacro ${_WORDFUNC_UN1}WordFind2XCall`
Function ${_WORDFUNC_UN1}WordFind2X
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
Push $R2
ClearErrors
StrCpy $R2 ''
StrCpy $3 $2 1
StrCpy $2 $2 '' 1
StrCmp $3 'E' 0 +3
StrCpy $R2 E
goto -4
StrCmp $3 '+' +5
StrCmp $3 '-' +4
StrCmp $3 '#' restart
StrCmp $3 '/' restart
goto error3
StrCpy $4 $2 2 -2
StrCmp $4 '{{' +9
StrCmp $4 '}}' +8
StrCmp $4 '{*' +7
StrCmp $4 '*{' +6
StrCmp $4 '*}' +5
StrCmp $4 '}*' +4
StrCmp $4 '{}' +3
StrCpy $4 ''
goto +2
StrCpy $2 $2 -2
IntOp $2 $2 + 0
StrCmp $2 0 error2
restart:
StrCmp $R0 '' error1
StrCpy $5 -1
StrCpy $6 0
StrCpy $7 ''
StrLen $8 $0
StrLen $9 $1
loop:
IntOp $5 $5 + 1
delim1:
StrCpy $R1 $R0 $8 $5
StrCmp $R1$6 0 error1
StrCmp $R1 '' minus
StrCmp $R1 $0 +2
StrCmp $7 '' loop delim2
StrCmp $0 $1 0 +2
StrCmp $7 '' 0 delim2
IntOp $7 $5 + $8
StrCpy $5 $7
goto delim1
delim2:
StrCpy $R1 $R0 $9 $5
StrCmp $R1 $1 0 loop
IntOp $6 $6 + 1
StrCmp $3$6 '+$2' plus
StrCmp $3 '/' 0 nextword
IntOp $R1 $5 - $7
StrCpy $R1 $R0 $R1 $7
StrCmp $R1 $2 0 +3
StrCpy $R1 $6
goto end
nextword:
IntOp $5 $5 + $9
StrCpy $7 ''
goto delim1
minus:
StrCmp $3 '-' 0 sum
StrCpy $3 +
IntOp $2 $6 - $2
IntOp $2 $2 + 1
IntCmp $2 0 error2 error2 restart
sum:
StrCmp $3 '#' 0 error2
StrCpy $R1 $6
goto end
plus:
StrCmp $4 '' 0 +4
IntOp $R1 $5 - $7
StrCpy $R1 $R0 $R1 $7
goto end
IntOp $5 $5 + $9
IntOp $7 $7 - $8
StrCmp $4 '{*' +2
StrCmp $4 '*{' 0 +3
StrCpy $R1 $R0 $5
goto end
StrCmp $4 '*}' +2
StrCmp $4 '}*' 0 +3
StrCpy $R1 $R0 '' $7
goto end
StrCmp $4 '}}' 0 +3
StrCpy $R1 $R0 '' $5
goto end
StrCmp $4 '{{' 0 +3
StrCpy $R1 $R0 $7
goto end
StrCmp $4 '{}' 0 error3
StrCpy $5 $R0 '' $5
StrCpy $7 $R0 $7
StrCpy $R1 '$7$5'
goto end
error3:
StrCpy $R1 3
goto error
error2:
StrCpy $R1 2
goto error
error1:
StrCpy $R1 1
error:
StrCmp $R2 'E' 0 +3
SetErrors
end:
StrCpy $R0 $R1
Pop $R2
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
!undef _WORDFUNC_UN1
!define _WORDFUNC_UN1
!verbose pop
!endif
!macroend
!macro WordFind3X
!ifndef ${_WORDFUNC_UN1}WordFind3X
!verbose push
!verbose ${_WORDFUNC_VERBOSE}
!define ${_WORDFUNC_UN1}WordFind3X `!insertmacro ${_WORDFUNC_UN1}WordFind3XCall`
Function ${_WORDFUNC_UN1}WordFind3X
Exch $3
Exch
Exch $2
Exch
Exch 2
Exch $1
Exch 2
Exch 3
Exch $0
Exch 3
Exch 4
Exch $R0
Exch 4
Push $4
Push $5
Push $6
Push $7
Push $8
Push $9
Push $R1
Push $R2
Push $R3
Push $R4
Push $R5
ClearErrors
StrCpy $R5 ''
StrCpy $4 $3 1
StrCpy $3 $3 '' 1
StrCmp $4 'E' 0 +3
StrCpy $R5 E
goto -4
StrCmp $4 '+' +5
StrCmp $4 '-' +4
StrCmp $4 '#' restart
StrCmp $4 '/' restart
goto error3
StrCpy $5 $3 2 -2
StrCmp $5 '{{' +9
StrCmp $5 '}}' +8
StrCmp $5 '{*' +7
StrCmp $5 '*{' +6
StrCmp $5 '*}' +5
StrCmp $5 '}*' +4
StrCmp $5 '{}' +3
StrCpy $5 ''
goto +2
StrCpy $3 $3 -2
IntOp $3 $3 + 0
StrCmp $3 0 error2
restart:
StrCmp $R0 '' error1
StrCpy $6 -1
StrCpy $7 0
StrCpy $8 ''
StrCpy $9 ''
StrLen $R1 $0
StrLen $R2 $1
StrLen $R3 $2
loop:
IntOp $6 $6 + 1
delim1:
StrCpy $R4 $R0 $R1 $6
StrCmp $R4$7 0 error1
StrCmp $R4 '' minus
StrCmp $R4 $0 +2
StrCmp $8 '' loop center
StrCmp $0 $1 +2
StrCmp $0 $2 0 +2
StrCmp $8 '' 0 center
IntOp $8 $6 + $R1
StrCpy $6 $8
goto delim1
center:
StrCmp $9 '' 0 delim2
StrCpy $R4 $R0 $R2 $6
StrCmp $R4 $1 0 loop
IntOp $9 $6 + $R2
StrCpy $6 $9
goto delim1
delim2:
StrCpy $R4 $R0 $R3 $6
StrCmp $R4 $2 0 loop
IntOp $7 $7 + 1
StrCmp $4$7 '+$3' plus
StrCmp $4 '/' 0 nextword
IntOp $R4 $6 - $8
StrCpy $R4 $R0 $R4 $8
StrCmp $R4 $3 0 +3
StrCpy $R4 $7
goto end
nextword:
IntOp $6 $6 + $R3
StrCpy $8 ''
StrCpy $9 ''
goto delim1
minus:
StrCmp $4 '-' 0 sum
StrCpy $4 +
IntOp $3 $7 - $3
IntOp $3 $3 + 1
IntCmp $3 0 error2 error2 restart
sum:
StrCmp $4 '#' 0 error2
StrCpy $R4 $7
goto end
plus:
StrCmp $5 '' 0 +4
IntOp $R4 $6 - $8
StrCpy $R4 $R0 $R4 $8
goto end
IntOp $6 $6 + $R3
IntOp $8 $8 - $R1
StrCmp $5 '{*' +2
StrCmp $5 '*{' 0 +3
StrCpy $R4 $R0 $6
goto end
StrCmp $5 '*}' +2
StrCmp $5 '}*' 0 +3
StrCpy $R4 $R0 '' $8
goto end
StrCmp $5 '}}' 0 +3
StrCpy $R4 $R0 '' $6
goto end
StrCmp $5 '{{' 0 +3
StrCpy $R4 $R0 $8
goto end
StrCmp $5 '{}' 0 error3
StrCpy $6 $R0 '' $6
StrCpy $8 $R0 $8
StrCpy $R4 '$8$6'
goto end
error3:
StrCpy $R4 3
goto error
error2:
StrCpy $R4 2
goto error
error1:
StrCpy $R4 1
error:
StrCmp $R5 'E' 0 +3
SetErrors
end:
StrCpy $R0 $R4
Pop $R5
Pop $R4
Pop $R3
Pop $R2
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
!undef _WORDFUNC_UN1
!define _WORDFUNC_UN1
!verbose pop
!endif
!macroend
!macro WordReplace
!ifndef ${_WORDFUNC_UN1}WordReplace
!verbose push
!verbose ${_WORDFUNC_VERBOSE}
!define ${_WORDFUNC_UN1}WordReplace `!insertmacro ${_WORDFUNC_UN1}WordReplaceCall`
Function ${_WORDFUNC_UN1}WordReplace
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
StrCmp $3 'E' 0 +4
StrCpy $9 E
StrCpy $2 $2 '' 1
goto -4
StrLen $7 $0
StrCpy $4 $2 3
StrCpy $5 $2 2
StrCmp $4 '{}*' +3
StrCmp $5 '{}' +2
goto errorchk
StrCmp $7 0 end
StrCpy $5 ''
StrCpy $6 ''
StrCpy $3 $R0 $7
StrCmp $3 $0 0 +4
StrCpy $R0 $R0 '' $7
StrCpy $5 '$1$5'
goto -4
StrCpy $3 $R0 '' -$7
StrCmp $3 $0 0 +4
StrCpy $R0 $R0 -$7
StrCpy $6 '$6$1'
goto -4
StrCmp $4 '{}*' 0 +5
StrCmp $5 '' +2
StrCpy $5 $1
StrCmp $6 '' +2
StrCpy $6 $1
StrCpy $R0 '$5$R0$6'
goto end
errorchk:
StrCpy $3 $2 1
StrCpy $2 $2 '' 1
StrCmp $3 '+' +2
StrCmp $3 '-' 0 error3
StrCmp $R0 '' error1
StrCmp $7 0 error1
StrCpy $4 $2 1 -1
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
!undef _WORDFUNC_UN1
!define _WORDFUNC_UN1
!verbose pop
!endif
!macroend
!macro WordAdd
!ifndef ${_WORDFUNC_UN1}WordAdd
!verbose push
!verbose ${_WORDFUNC_VERBOSE}
!insertmacro WordFind
!define ${_WORDFUNC_UN1}WordAdd `!insertmacro ${_WORDFUNC_UN1}WordAddCall`
Function ${_WORDFUNC_UN1}WordAdd
Exch $1
Exch
Exch $0
Exch
Exch 2
Exch $R0
Exch 2
Push $2
Push $3
Push $4
Push $5
Push $6
Push $7
Push $R1
ClearErrors
StrCpy $7 ''
StrCpy $2 $1 1
StrCmp $2 'E' 0 +4
StrCpy $7 E
StrCpy $1 $1 '' 1
goto -4
StrCpy $5 0
StrCpy $R1 $R0
StrCpy $2 $1 '' 1
StrCpy $1 $1 1
StrCmp $1 '+' +2
StrCmp $1 '-' 0 error3
StrCmp $0 '' error1
StrCmp $2 '' end
StrCmp $R0 '' 0 +5
StrCmp $1 '-' end
StrCmp $1 '+' 0 +3
StrCpy $R0 $2
goto end
loop:
IntOp $5 $5 + 1
Push `$2`
Push `$0`
Push `E+$5`
Call ${_WORDFUNC_UN1}WordFind
Pop $3
IfErrors 0 /word
StrCmp $3 2 +4
StrCmp $3$5 11 0 +3
StrCpy $3 $2
goto /word
StrCmp $1 '-' end preend
/word:
Push `$R0`
Push `$0`
Push `E/$3`
Call ${_WORDFUNC_UN1}WordFind
Pop $4
IfErrors +2
StrCmp $1 '-' delete loop
StrCmp $1$4 '-1' +2
StrCmp $1 '-' loop +4
StrCmp $R0 $3 0 loop
StrCpy $R0 ''
goto end
StrCmp $1$4 '+1' 0 +2
StrCmp $R0 $3 loop
StrCmp $R0 $R1 +3
StrCpy $R1 '$R1$0$3'
goto loop
StrLen $6 $0
StrCpy $6 $R0 '' -$6
StrCmp $6 $0 0 -4
StrCpy $R1 '$R1$3'
goto loop
delete:
Push `$R0`
Push `$0`
Push `E+$4{}`
Call ${_WORDFUNC_UN1}WordFind
Pop $R0
goto /word
error3:
StrCpy $R1 3
goto error
error1:
StrCpy $R1 1
error:
StrCmp $7 'E' 0 end
SetErrors
preend:
StrCpy $R0 $R1
end:
Pop $R1
Pop $7
Pop $6
Pop $5
Pop $4
Pop $3
Pop $2
Pop $1
Pop $0
Exch $R0
FunctionEnd
!undef _WORDFUNC_UN1
!define _WORDFUNC_UN1
!verbose pop
!endif
!macroend
!macro WordInsert
!ifndef ${_WORDFUNC_UN1}WordInsert
!verbose push
!verbose ${_WORDFUNC_VERBOSE}
!insertmacro WordFind
!define ${_WORDFUNC_UN1}WordInsert `!insertmacro ${_WORDFUNC_UN1}WordInsertCall`
Function ${_WORDFUNC_UN1}WordInsert
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 $5 ''
StrCpy $6 $0
StrCpy $7 }
StrCpy $9 ''
StrCpy $R1 $R0
StrCpy $3 $2 1
StrCpy $2 $2 '' 1
StrCmp $3 'E' 0 +3
StrCpy $9 'E'
goto -4
StrCmp $3 '+' +2
StrCmp $3 '-' 0 error3
IntOp $2 $2 + 0
StrCmp $2 0 error2
StrCmp $0 '' error1
StrCmp $2 1 0 two
GetLabelAddress $8 oneback
StrCmp $3 '+' call
StrCpy $7 {
goto call
oneback:
IfErrors 0 +2
StrCpy $4 $R0
StrCmp $3 '+' 0 +3
StrCpy $R0 '$1$0$4'
goto end
StrCpy $R0 '$4$0$1'
goto end
two:
IntOp $2 $2 - 1
GetLabelAddress $8 twoback
StrCmp $3 '+' 0 call
StrCpy $7 {
goto call
twoback:
IfErrors 0 tree
StrCmp $2$4 11 0 error2
StrCmp $3 '+' 0 +3
StrCpy $R0 '$R0$0$1'
goto end
StrCpy $R0 '$1$0$R0'
goto end
tree:
StrCpy $7 }
StrCpy $5 $4
IntOp $2 $2 + 1
GetLabelAddress $8 treeback
StrCmp $3 '+' call
StrCpy $7 {
goto call
treeback:
IfErrors 0 +3
StrCpy $4 ''
StrCpy $6 ''
StrCmp $3 '+' 0 +3
StrCpy $R0 '$5$0$1$6$4'
goto end
StrCpy $R0 '$4$6$1$0$5'
goto end
call:
Push '$R0'
Push '$0'
Push 'E$3$2*$7'
Call ${_WORDFUNC_UN1}WordFind
Pop $4
goto $8
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
!undef _WORDFUNC_UN1
!define _WORDFUNC_UN1
!verbose pop
!endif
!macroend
!macro StrFilter
!ifndef ${_WORDFUNC_UN1}StrFilter
!verbose push
!verbose ${_WORDFUNC_VERBOSE}
!define ${_WORDFUNC_UN1}StrFilter `!insertmacro ${_WORDFUNC_UN1}StrFilterCall`
Function ${_WORDFUNC_UN1}StrFilter
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 $R1
Push $R2
Push $R3
Push $R4
Push $R5
Push $R6
Push $R7
Push $R8
ClearErrors
StrCpy $R2 $0 '' -3
StrCmp $R2 eng eng
StrCmp $R2 rus rus
eng:
StrCpy $4 65
StrCpy $5 90
StrCpy $6 97
StrCpy $7 122
goto langend
rus:
StrCpy $4 192
StrCpy $5 223
StrCpy $6 224
StrCpy $7 255
goto langend
;...
langend:
StrCpy $R7 ''
StrCpy $R8 ''
StrCmp $2 '' 0 begin
restart1:
StrCpy $2 ''
StrCpy $3 $0 1
StrCmp $3 '+' +2
StrCmp $3 '-' 0 +3
StrCpy $0 $0 '' 1
goto +2
StrCpy $3 ''
IntOp $0 $0 + 0
StrCmp $0 0 +5
StrCpy $R7 $0 1 0
StrCpy $R8 $0 1 1
StrCpy $R2 $0 1 2
StrCmp $R2 '' filter error
restart2:
StrCmp $3 '' end
StrCpy $R7 ''
StrCpy $R8 '+-'
goto begin
filter:
StrCmp $R7 '1' +3
StrCmp $R7 '2' +2
StrCmp $R7 '3' 0 error
StrCmp $R8 '' begin
StrCmp $R7$R8 '23' +2
StrCmp $R7$R8 '32' 0 +3
StrCpy $R7 -1
goto begin
StrCmp $R7$R8 '13' +2
StrCmp $R7$R8 '31' 0 +3
StrCpy $R7 -2
goto begin
StrCmp $R7$R8 '12' +2
StrCmp $R7$R8 '21' 0 error
StrCpy $R7 -3
begin:
StrCpy $R6 0
StrCpy $R1 ''
loop:
StrCpy $R2 $R0 1 $R6
StrCmp $R2 '' restartchk
StrCmp $2 '' +7
StrCpy $R4 0
StrCpy $R5 $2 1 $R4
StrCmp $R5 '' addsymbol
StrCmp $R5 $R2 skipsymbol
IntOp $R4 $R4 + 1
goto -4
StrCmp $1 '' +7
StrCpy $R4 0
StrCpy $R5 $1 1 $R4
StrCmp $R5 '' +4
StrCmp $R5 $R2 addsymbol
IntOp $R4 $R4 + 1
goto -4
StrCmp $R7 '1' +2
StrCmp $R7 '-1' 0 +4
StrCpy $R4 48
StrCpy $R5 57
goto loop2
StrCmp $R8 '+-' 0 +2
StrCmp $3 '+' 0 +4
StrCpy $R4 $4
StrCpy $R5 $5
goto loop2
StrCpy $R4 $6
StrCpy $R5 $7
loop2:
IntFmt $R3 '%c' $R4
StrCmp $R2 $R3 found
StrCmp $R4 $R5 notfound
IntOp $R4 $R4 + 1
goto loop2
found:
StrCmp $R8 '+-' setcase
StrCmp $R7 '3' skipsymbol
StrCmp $R7 '-3' addsymbol
StrCmp $R8 '' addsymbol skipsymbol
notfound:
StrCmp $R8 '+-' addsymbol
StrCmp $R7 '3' 0 +2
StrCmp $R5 57 addsymbol +3
StrCmp $R7 '-3' 0 +5
StrCmp $R5 57 skipsymbol
StrCpy $R4 48
StrCpy $R5 57
goto loop2
StrCmp $R8 '' skipsymbol addsymbol
setcase:
StrCpy $R2 $R3
addsymbol:
StrCpy $R1 $R1$R2
skipsymbol:
IntOp $R6 $R6 + 1
goto loop
error:
SetErrors
StrCpy $R0 ''
goto end
restartchk:
StrCpy $R0 $R1
StrCmp $2 '' 0 restart1
StrCmp $R8 '+-' 0 restart2
end:
Pop $R8
Pop $R7
Pop $R6
Pop $R5
Pop $R4
Pop $R3
Pop $R2
Pop $R1
Pop $7
Pop $6
Pop $5
Pop $4
Pop $3
Pop $2
Pop $1
Pop $0
Exch $R0
FunctionEnd
!undef _WORDFUNC_UN1
!define _WORDFUNC_UN1
!verbose pop
!endif
!macroend
!macro VersionCompare
!ifndef ${_WORDFUNC_UN1}VersionCompare
!verbose push
!verbose ${_WORDFUNC_VERBOSE}
!define ${_WORDFUNC_UN1}VersionCompare `!insertmacro ${_WORDFUNC_UN1}VersionCompareCall`
Function ${_WORDFUNC_UN1}VersionCompare
Exch $1
Exch
Exch $0
Exch
Push $2
Push $3
Push $4
Push $5
Push $6
Push $7
begin:
StrCpy $2 -1
IntOp $2 $2 + 1
StrCpy $3 $0 1 $2
StrCmp $3 '' +2
StrCmp $3 '.' 0 -3
StrCpy $4 $0 $2
IntOp $2 $2 + 1
StrCpy $0 $0 '' $2
StrCpy $2 -1
IntOp $2 $2 + 1
StrCpy $3 $1 1 $2
StrCmp $3 '' +2
StrCmp $3 '.' 0 -3
StrCpy $5 $1 $2
IntOp $2 $2 + 1
StrCpy $1 $1 '' $2
StrCmp $4$5 '' equal
StrCpy $6 -1
IntOp $6 $6 + 1
StrCpy $3 $4 1 $6
StrCmp $3 '0' -2
StrCmp $3 '' 0 +2
StrCpy $4 0
StrCpy $7 -1
IntOp $7 $7 + 1
StrCpy $3 $5 1 $7
StrCmp $3 '0' -2
StrCmp $3 '' 0 +2
StrCpy $5 0
StrCmp $4 0 0 +2
StrCmp $5 0 begin newer2
StrCmp $5 0 newer1
IntCmp $6 $7 0 newer1 newer2
StrCpy $4 '1$4'
StrCpy $5 '1$5'
IntCmp $4 $5 begin newer2 newer1
equal:
StrCpy $0 0
goto end
newer1:
StrCpy $0 1
goto end
newer2:
StrCpy $0 2
end:
Pop $7
Pop $6
Pop $5
Pop $4
Pop $3
Pop $2
Pop $1
Exch $0
FunctionEnd
!undef _WORDFUNC_UN1
!define _WORDFUNC_UN1
!verbose pop
!endif
!macroend
!macro VersionConvert
!ifndef ${_WORDFUNC_UN1}VersionConvert
!verbose push
!verbose ${_WORDFUNC_VERBOSE}
!define ${_WORDFUNC_UN1}VersionConvert `!insertmacro ${_WORDFUNC_UN1}VersionConvertCall`
Function ${_WORDFUNC_UN1}VersionConvert
Exch $1
Exch
Exch $0
Exch
Push $2
Push $3
Push $4
Push $5
Push $6
Push $7
StrCmp $1 '' 0 +2
StrCpy $1 'abcdefghijklmnopqrstuvwxyz'
StrCpy $1 $1 99
StrCpy $2 0
StrCpy $7 'dot'
goto loop
preloop:
IntOp $2 $2 + 1
loop:
StrCpy $3 $0 1 $2
StrCmp $3 '' endcheck
StrCmp $3 '.' dot
StrCmp $3 '0' digit
IntCmp $3 '0' letter letter digit
dot:
StrCmp $7 'dot' replacespecial
StrCpy $7 'dot'
goto preloop
digit:
StrCmp $7 'letter' insertdot
StrCpy $7 'digit'
goto preloop
letter:
StrCpy $5 0
StrCpy $4 $1 1 $5
IntOp $5 $5 + 1
StrCmp $4 '' replacespecial
StrCmp $4 $3 0 -3
IntCmp $5 9 0 0 +2
StrCpy $5 '0$5'
StrCmp $7 'letter' +2
StrCmp $7 'dot' 0 +3
StrCpy $6 ''
goto +2
StrCpy $6 '.'
StrCpy $4 $0 $2
IntOp $2 $2 + 1
StrCpy $0 $0 '' $2
StrCpy $0 '$4$6$5$0'
StrLen $4 '$6$5'
IntOp $2 $2 + $4
IntOp $2 $2 - 1
StrCpy $7 'letter'
goto loop
replacespecial:
StrCmp $7 'dot' 0 +3
StrCpy $6 ''
goto +2
StrCpy $6 '.'
StrCpy $4 $0 $2
IntOp $2 $2 + 1
StrCpy $0 $0 '' $2
StrCpy $0 '$4$6$0'
StrLen $4 $6
IntOp $2 $2 + $4
IntOp $2 $2 - 1
StrCpy $7 'dot'
goto loop
insertdot:
StrCpy $4 $0 $2
StrCpy $0 $0 '' $2
StrCpy $0 '$4.$0'
StrCpy $7 'dot'
goto preloop
endcheck:
StrCpy $4 $0 1 -1
StrCmp $4 '.' 0 end
StrCpy $0 $0 -1
goto -3
end:
Pop $7
Pop $6
Pop $5
Pop $4
Pop $3
Pop $2
Pop $1
Exch $0
FunctionEnd
!undef _WORDFUNC_UN1
!define _WORDFUNC_UN1
!verbose pop
!endif
!macroend
!macro un.WordFindCall _STRING _DELIMITER _OPTION _RESULT
!verbose push
!verbose ${_WORDFUNC_VERBOSE}
Push `${_STRING}`
Push `${_DELIMITER}`
Push `${_OPTION}`
Call un.WordFind
Pop ${_RESULT}
!verbose pop
!macroend
!macro un.WordFind2XCall _STRING _DELIMITER1 _DELIMITER2 _NUMBER _RESULT
!verbose push
!verbose ${_WORDFUNC_VERBOSE}
Push `${_STRING}`
Push `${_DELIMITER1}`
Push `${_DELIMITER2}`
Push `${_NUMBER}`
Call un.WordFind2X
Pop ${_RESULT}
!verbose pop
!macroend
!macro un.WordFind3XCall _STRING _DELIMITER1 _CENTER _DELIMITER2 _NUMBER _RESULT
!verbose push
!verbose ${_WORDFUNC_VERBOSE}
Push `${_STRING}`
Push `${_DELIMITER1}`
Push `${_CENTER}`
Push `${_DELIMITER2}`
Push `${_NUMBER}`
Call un.WordFind3X
Pop ${_RESULT}
!verbose pop
!macroend
!macro un.WordReplaceCall _STRING _WORD1 _WORD2 _NUMBER _RESULT
!verbose push
!verbose ${_WORDFUNC_VERBOSE}
Push `${_STRING}`
Push `${_WORD1}`
Push `${_WORD2}`
Push `${_NUMBER}`
Call un.WordReplace
Pop ${_RESULT}
!verbose pop
!macroend
!macro un.WordAddCall _STRING1 _DELIMITER _STRING2 _RESULT
!verbose push
!verbose ${_WORDFUNC_VERBOSE}
Push `${_STRING1}`
Push `${_DELIMITER}`
Push `${_STRING2}`
Call un.WordAdd
Pop ${_RESULT}
!verbose pop
!macroend
!macro un.WordInsertCall _STRING _DELIMITER _WORD _NUMBER _RESULT
!verbose push
!verbose ${_WORDFUNC_VERBOSE}
Push `${_STRING}`
Push `${_DELIMITER}`
Push `${_WORD}`
Push `${_NUMBER}`
Call un.WordInsert
Pop ${_RESULT}
!verbose pop
!macroend
!macro un.StrFilterCall _STRING _FILTER _INCLUDE _EXCLUDE _RESULT
!verbose push
!verbose ${_WORDFUNC_VERBOSE}
Push `${_STRING}`
Push `${_FILTER}`
Push `${_INCLUDE}`
Push `${_EXCLUDE}`
Call un.StrFilter
Pop ${_RESULT}
!verbose pop
!macroend
!macro un.VersionCompareCall _VER1 _VER2 _RESULT
!verbose push
!verbose ${_WORDFUNC_VERBOSE}
Push `${_VER1}`
Push `${_VER2}`
Call un.VersionCompare
Pop ${_RESULT}
!verbose pop
!macroend
!macro un.VersionConvertCall _VERSION _CHARLIST _RESULT
!verbose push
!verbose ${_WORDFUNC_VERBOSE}
Push `${_VERSION}`
Push `${_CHARLIST}`
Call un.VersionConvert
Pop ${_RESULT}
!verbose pop
!macroend
!macro un.WordFind
!ifndef un.WordFind
!verbose push
!verbose ${_WORDFUNC_VERBOSE}
!undef _WORDFUNC_UN1
!define _WORDFUNC_UN1 `un.`
!undef _WORDFUNC_UN2
!insertmacro WordFind
!define _WORDFUNC_UN2
!verbose pop
!endif
!macroend
!macro un.WordFind2X
!ifndef un.WordFind2X
!verbose push
!verbose ${_WORDFUNC_VERBOSE}
!undef _WORDFUNC_UN1
!define _WORDFUNC_UN1 `un.`
!insertmacro WordFind2X
!verbose pop
!endif
!macroend
!macro un.WordFind3X
!ifndef un.WordFind3X
!verbose push
!verbose ${_WORDFUNC_VERBOSE}
!undef _WORDFUNC_UN1
!define _WORDFUNC_UN1 `un.`
!insertmacro WordFind3X
!verbose pop
!endif
!macroend
!macro un.WordReplace
!ifndef un.WordReplace
!verbose push
!verbose ${_WORDFUNC_VERBOSE}
!undef _WORDFUNC_UN1
!define _WORDFUNC_UN1 `un.`
!insertmacro WordReplace
!verbose pop
!endif
!macroend
!macro un.WordAdd
!ifndef un.WordAdd
!verbose push
!verbose ${_WORDFUNC_VERBOSE}
!undef _WORDFUNC_UN1
!define _WORDFUNC_UN1 `un.`
!insertmacro WordAdd
!verbose pop
!endif
!macroend
!macro un.WordInsert
!ifndef un.WordInsert
!verbose push
!verbose ${_WORDFUNC_VERBOSE}
!undef _WORDFUNC_UN1
!define _WORDFUNC_UN1 `un.`
!insertmacro WordInsert
!verbose pop
!endif
!macroend
!macro un.StrFilter
!ifndef un.StrFilter
!verbose push
!verbose ${_WORDFUNC_VERBOSE}
!undef _WORDFUNC_UN1
!define _WORDFUNC_UN1 `un.`
!insertmacro StrFilter
!verbose pop
!endif
!macroend
!macro un.VersionCompare
!ifndef un.VersionCompare
!verbose push
!verbose ${_WORDFUNC_VERBOSE}
!undef _WORDFUNC_UN1
!define _WORDFUNC_UN1 `un.`
!insertmacro VersionCompare
!verbose pop
!endif
!macroend
!macro un.VersionConvert
!ifndef un.VersionConvert
!verbose push
!verbose ${_WORDFUNC_VERBOSE}
!undef _WORDFUNC_UN1
!define _WORDFUNC_UN1 `un.`
!insertmacro VersionConvert
!verbose pop
!endif
!macroend