2008-11-21 00:04:05 +00:00
; ---------------------
; Util.nsh
; ---------------------
;
; Voodoo macros to make end-user usage easier. This may be documented someday.
2014-02-03 20:19:35 +00:00
!verbose push 3
2008-11-21 00:04:05 +00:00
!ifndef ___UTIL__NSH___
!define ___UTIL__NSH___
2014-07-04 23:27:04 +00:00
# CallArtificialFunction, see WinVer.nsh and *Func.nsh for usage examples
!macro CallArtificialFunctionHelper TYPE NAME
!verbose pop
Call : .${NAME} ${TYPE}
!ifndef ${NAME} ${TYPE} _DEFINED
!verbose push 2
Goto ${NAME} ${TYPE} _DONE
!define ${NAME} ${TYPE} _DEFINED
!verbose pop
.${NAME} ${TYPE} :
2008-11-21 00:04:05 +00:00
!insertmacro ${NAME}
2014-07-04 23:27:04 +00:00
Return
${NAME} ${TYPE} _DONE :
2008-11-21 00:04:05 +00:00
!endif
2014-07-04 23:27:04 +00:00
!verbose push 2
2008-11-21 00:04:05 +00:00
!macroend
2014-07-04 23:27:04 +00:00
!macro CallArtificialFunction NAME
!verbose push 2
!ifdef __UNINSTALL__
!insertmacro CallArtificialFunctionHelper uninst ${NAME}
2008-11-21 01:12:22 +00:00
!else
2014-07-04 23:27:04 +00:00
!insertmacro CallArtificialFunctionHelper inst ${NAME}
2008-11-21 01:12:22 +00:00
!endif
2014-07-04 23:27:04 +00:00
!verbose pop
!macroend
!define CallArtificialFunction ` !insertmacro CallArtificialFunction `
!macro CallArtificialFunction2 NAME ; Retained for v2.4x..v3.0b0 compatibility
${CallArtificialFunction} ${NAME}
2008-11-21 01:12:22 +00:00
!macroend
2014-07-04 23:27:04 +00:00
!define CallArtificialFunction2 ` !insertmacro CallArtificialFunction `
2008-11-21 01:12:22 +00:00
2008-11-21 00:04:05 +00:00
2014-02-03 20:19:35 +00:00
!define Int32Op '!insertmacro Int32Op '
!define Int64Op '!insertmacro Int64Op '
!define IntPtrOp '!insertmacro IntPtrOp '
!macro Int32Op r a o b
2017-10-14 16:49:40 +00:00
IntOp ` ${r} ` ` ${a} ` ` ${o} ` ${b}
2014-02-03 20:19:35 +00:00
!macroend
!macro Int64Op r a o b
2016-03-09 19:26:48 +00:00
!echo " Int64Op ${r}=${a}${o}${b} "
!verbose push 2
System :: Int64Op ` ${a} ` ` ${o} ` ${b}
2014-02-03 20:19:35 +00:00
Pop ${r}
2016-03-09 19:26:48 +00:00
!verbose pop
2014-02-03 20:19:35 +00:00
!macroend
!macro IntPtrOp r a o b
2017-10-13 21:23:33 +00:00
IntPtrOp ` ${r} ` ` ${a} ` ` ${o} ` ` ${b} `
2014-02-03 20:19:35 +00:00
!macroend
!define Int32Cmp '!insertmacro Int32Cmp '
!define Int64Cmp '!insertmacro Int64Cmp '
!define IntPtrCmp '!insertmacro IntPtrCmp '
!macro Int32Cmp a b jeek jles jgtr
2017-10-14 16:49:40 +00:00
IntCmp ` ${a} ` ` ${b} ` ` ${jeek} ` ` ${jles} ` ` ${jgtr} `
2014-02-03 20:19:35 +00:00
!macroend
!macro Int64Cmp a b jeek jles jgtr
2017-10-14 16:49:40 +00:00
!if ${NSIS_PTR_SIZE} <= 4
2014-02-03 20:19:35 +00:00
!ifmacrondef _LOGICLIB_TEMP
!include LogicLib.nsh
!endif
2016-03-09 19:26:48 +00:00
!echo " Int64Cmp ${a}:${b} =${jeek}, <${jles}, >${jgtr} "
2014-02-03 20:19:35 +00:00
!verbose push 2
${IfThen} ${a} L= ${b} ${|} Goto ${jeek} ${|}
2016-03-09 19:26:48 +00:00
!insertmacro _L< ${a} ${b} ` ${jles} ` ` ${jgtr} `
2014-02-03 20:19:35 +00:00
!verbose pop
!else
2017-10-14 16:49:40 +00:00
Int64Cmp ` ${a} ` ` ${b} ` ` ${jeek} ` ` ${jles} ` ` ${jgtr} `
2014-02-03 20:19:35 +00:00
!endif
!macroend
2017-10-14 16:49:40 +00:00
!macro IntPtrCmp a b jeek jles jgtr
IntPtrCmp ` ${a} ` ` ${b} ` ` ${jeek} ` ` ${jles} ` ` ${jgtr} `
!macroend
2014-02-03 20:19:35 +00:00
!define Int32CmpU '!insertmacro Int32CmpU '
!define Int64CmpU '!insertmacro Int64CmpU '
!define IntPtrCmpU '!insertmacro IntPtrCmpU '
!macro Int32CmpU a b jeek jles jgtr
2017-10-14 16:49:40 +00:00
IntCmpU ` ${a} ` ` ${b} ` ` ${jeek} ` ` ${jles} ` ` ${jgtr} `
2014-02-03 20:19:35 +00:00
!macroend
2016-03-09 19:26:48 +00:00
!macro Int64CmpUHelper
; This macro performs "$_LOGICLIB_TEMP = a < b ? -1 : a > b ? 1 : 0" but System::Int64Op does not support unsigned operations so we have to perform multiple steps
2014-02-03 20:19:35 +00:00
!ifmacrondef _LOGICLIB_TEMP
!include LogicLib.nsh
!endif
!insertmacro _LOGICLIB_TEMP
2016-03-09 19:26:48 +00:00
Exch $2 ; b
Exch
Exch $1 ; a
; if (a == b) return 0;
; if (a < 0)
; {
; if (b >= 0) return 1
; }
; else
; {
; if (b < 0) return -1
; }
; return a < b ? -1 : 1
System :: Int64Op $1 ^ $2 ; Using xor so $_LOGICLIB_TEMP ends up as 0 when they are equal
Pop $_LOGICLIB_TEMP
StrCmp $_LOGICLIB_TEMP 0 ret ; NOTE: Must use StrCmp, IntCmp fails on "0x8000000000000001 Z> 1"
System :: Int64Op $1 < 0
Pop $_LOGICLIB_TEMP
StrCmp $_LOGICLIB_TEMP 0 checkNegOther
System :: Int64Op $2 < 0 ; System::Int64Op does not support the >= operator so we invert the operation
Pop $_LOGICLIB_TEMP
StrCmp $_LOGICLIB_TEMP 0 retPos finalCmp
retPos :
StrCpy $_LOGICLIB_TEMP " 1 "
Goto ret
checkNegOther :
System :: Int64Op $2 < 0
Pop $_LOGICLIB_TEMP
StrCmp $_LOGICLIB_TEMP 0 finalCmp retNeg
retNeg :
StrCpy $_LOGICLIB_TEMP " -1 "
Goto ret
finalCmp :
System :: Int64Op $1 < $2
Pop $_LOGICLIB_TEMP
StrCmp $_LOGICLIB_TEMP 0 retPos retNeg
ret :
Pop $1
Pop $2
!macroend
!macro Int64CmpU a b jeek jles jgtr
2017-10-14 16:49:40 +00:00
!if ${NSIS_PTR_SIZE} <= 4
2016-03-09 19:26:48 +00:00
!echo " Int64CmpU ${a}:${b} =${jeek}, <${jles}, >${jgtr} "
!verbose push 2
Push ` ${a} `
Push ` ${b} `
!insertmacro CallArtificialFunction Int64CmpUHelper
IntCmp $_LOGICLIB_TEMP 0 ` ${jeek} ` ` ${jles} ` ` ${jgtr} `
2014-02-03 20:19:35 +00:00
!verbose pop
!else
2017-10-14 16:49:40 +00:00
Int64CmpU ` ${a} ` ` ${b} ` ` ${jeek} ` ` ${jles} ` ` ${jgtr} `
2014-02-03 20:19:35 +00:00
!endif
!macroend
2017-10-14 16:49:40 +00:00
!macro IntPtrCmpU a b jeek jles jgtr
IntPtrCmpU ` ${a} ` ` ${b} ` ` ${jeek} ` ` ${jles} ` ` ${jgtr} `
!macroend
2014-02-03 20:19:35 +00:00
2018-05-30 21:31:23 +00:00
!define MakeARPInstallDate " !insertmacro MakeARPInstallDate "
!macro MakeARPInstallDate _outvar
System :: Call 'KERNEL32::GetDateFormat(i0x409,i0,p0,t"yyyyMMdd",t.s,i${NSIS_MAX_STRLEN})'
Pop ${_outvar}
!macroend
2018-09-13 13:35:25 +00:00
!define /IfNDef SPI_GETHIGHCONTRAST 0x42
!define /IfNDef HCF_HIGHCONTRASTON 0x01
!define /IfNDef /math SYSSIZEOF_HIGHCONTRAST 8 + ${NSIS_PTR_SIZE}
!define IsHighContrastModeActive '"" IsHighContrastModeActive ""'
!macro _IsHighContrastModeActive _lhs _rhs _t _f
!ifmacrondef _LOGICLIB_TEMP
!include LogicLib.nsh
!endif
!insertmacro _LOGICLIB_TEMP
Push $1
System :: Call '*(i${SYSSIZEOF_HIGHCONTRAST},i0,p)p.r1'
System :: Call 'USER32::SystemParametersInfo(i${SPI_GETHIGHCONTRAST},i${SYSSIZEOF_HIGHCONTRAST},pr1,i0)'
System :: Call '*$1(i,i.s)'
Pop $_LOGICLIB_TEMP
System :: Free $1
Pop $1
!insertmacro _& $_LOGICLIB_TEMP ${HCF_HIGHCONTRASTON} ` ${_t} ` ` ${_f} `
!macroend
2014-02-03 20:19:35 +00:00
!endif # !___UTIL__NSH___
2008-11-21 00:04:05 +00:00
!verbose pop