; --------------------- ; Util.nsh ; --------------------- ; ; Voodoo macros to make end-user usage easier. This may be documented someday. !verbose push 3 !ifndef ___UTIL__NSH___ !define ___UTIL__NSH___ # 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}: !insertmacro ${NAME} Return ${NAME}${TYPE}_DONE: !endif !verbose push 2 !macroend !macro CallArtificialFunction NAME !verbose push 2 !ifdef __UNINSTALL__ !insertmacro CallArtificialFunctionHelper uninst ${NAME} !else !insertmacro CallArtificialFunctionHelper inst ${NAME} !endif !verbose pop !macroend !define CallArtificialFunction `!insertmacro CallArtificialFunction` !macro CallArtificialFunction2 NAME ; Retained for v2.4x..v3.0b0 compatibility ${CallArtificialFunction} ${NAME} !macroend !define CallArtificialFunction2 `!insertmacro CallArtificialFunction` !define Int32Op '!insertmacro Int32Op ' !define Int64Op '!insertmacro Int64Op ' !define IntPtrOp '!insertmacro IntPtrOp ' !macro Int32Op r a o b !if ${NSIS_PTR_SIZE} <= 4 IntOp `${r}` `${a}` `${o}` ${b} !else !error "Int32Op not implemented" !endif !macroend !macro Int64Op r a o b !echo "Int64Op ${r}=${a}${o}${b}" !verbose push 2 System::Int64Op `${a}` `${o}` ${b} Pop ${r} !verbose pop !macroend !macro IntPtrOp r a o b !if ${NSIS_PTR_SIZE} <= 4 ${Int32Op} `${r}` `${a}` `${o}` `${b}` !else ${Int64Op} `${r}` `${a}` `${o}` `${b}` !endif !macroend !define Int32Cmp '!insertmacro Int32Cmp ' !define Int64Cmp '!insertmacro Int64Cmp ' !define IntPtrCmp '!insertmacro IntPtrCmp ' !macro Int32Cmp a b jeek jles jgtr !if ${NSIS_PTR_SIZE} <= 4 IntCmp `${a}` `${b}` `${jeek}` `${jles}` `${jgtr}` !else !error "Int32Cmp not implemented" !endif !macroend !macro Int64Cmp a b jeek jles jgtr !ifmacrondef _LOGICLIB_TEMP !include LogicLib.nsh !endif !echo "Int64Cmp ${a}:${b} =${jeek}, <${jles}, >${jgtr}" !verbose push 2 ${IfThen} ${a} L= ${b} ${|} Goto ${jeek} ${|} !insertmacro _L< ${a} ${b} `${jles}` `${jgtr}` !verbose pop !macroend !macro IntPtrCmp a b jeek jles jgtr !if ${NSIS_PTR_SIZE} <= 4 ${Int32Cmp} `${a}` `${b}` `${jeek}` `${jles}` `${jgtr}` !else ${Int64Cmp} `${a}` `${b}` `${jeek}` `${jles}` `${jgtr}` !endif !macroend !define Int32CmpU '!insertmacro Int32CmpU ' !define Int64CmpU '!insertmacro Int64CmpU ' !define IntPtrCmpU '!insertmacro IntPtrCmpU ' !macro Int32CmpU a b jeek jles jgtr !if ${NSIS_PTR_SIZE} <= 4 IntCmpU `${a}` `${b}` `${jeek}` `${jles}` `${jgtr}` !else !error "Int32CmpU not implemented" !endif !macroend !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 !ifmacrondef _LOGICLIB_TEMP !include LogicLib.nsh !endif !insertmacro _LOGICLIB_TEMP 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 !echo "Int64CmpU ${a}:${b} =${jeek}, <${jles}, >${jgtr}" !verbose push 2 Push `${a}` Push `${b}` !insertmacro CallArtificialFunction Int64CmpUHelper IntCmp $_LOGICLIB_TEMP 0 `${jeek}` `${jles}` `${jgtr}` !verbose pop !macroend !macro IntPtrCmpU a b jeek jles jgtr !if ${NSIS_PTR_SIZE} <= 4 ${Int32CmpU} `${a}` `${b}` `${jeek}` `${jles}` `${jgtr}` !else ${Int64CmpU} `${a}` `${b}` `${jeek}` `${jles}` `${jgtr}` !endif !macroend !endif # !___UTIL__NSH___ !verbose pop