NSIS/Include/LogicLib.nsh
eccles 2c892dde45 NSIS Logic Library - dselkirk's logiclib 1.3 (1.2 seems to have gone walkabout):
- Changed library name to Lib.
- Allow for 5 statements deep without use of name variable.
- Added If..ElseIf..Else..Endif statements.
- Fixed maximum allow statements.
- Now allows 10 statement depth.
- Condensed code.


git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@3274 212acab6-be3b-0410-9dea-997c60f758d6
2003-12-14 00:22:02 +00:00

372 lines
No EOL
9.2 KiB
NSIS

; NSIS LOGIC LIBRARY - logiclib.nsh
; Version 1.3 - 09/22/2003
; Questions/Comments - dselkirk@hotmail.com
;
; Description:
; Provides the use of select and if statements within NSIS.
;
; Notes:
; Only limitation is the statement depth. You can have no more than 10 statements
; within each other.
; ${IF} - 1
; ${IF} - 2
; ${IF} - 3 ... etc.
;
; Usage:
; Select Statements -
; ${SELECT} "test1"
; ${CASE} "test1"
; MessageBox MB_OK "case: test1"
; ${CASE} "test 2;test3"
; MessageBox MB_OK "case: test2 or test3"
; ${CASE_ELSE}
; MessageBox MB_OK "case else"
; ${ENDSELECT}
;
; If Statements -
; ${IF} 5 > 10
; MessageBox MB_OK "if: 5>10"
; ${ELSEIF} 5 = 10
; MessageBox MB_OK "elseif: 5>10"
; ${ELSE}
; MessageBox MB_OK "else"
; ${ENDIF}
;
; History:
; 1.0 - 09/19/2003 - Initial release.
; 1.1 - 09/20/2003 - Added simplified macros and removed NAME requirement.
; 1.2 - 09/21/2003 - Changed library name to Lib.
; - Allow for 5 statements deep without use of name variable.
; - Added If..ElseIf..Else..Endif statements.
; 1.3 - 09/22/2003 - Fixed maximum allow statements.
; - Now allows 10 statement depth.
; - Condensed code.
!ifndef LOGICLIB
!define LOGICLIB
; check if defines are already in use
!ifdef LOGIC_COUNTER \
| LOGIC_DELIMITER \
| LOGIC_NEXT \
| LOGIC_STEP \
| LOGIC_STEP_1 \
| LOGIC_STEP_2 \
| LOGIC_STEP_3 \
| LOGIC_STEP_4 \
| LOGIC_STEP_5 \
| LOGIC_STEP_6 \
| LOGIC_STEP_7 \
| LOGIC_STEP_8 \
| LOGIC_STEP_9 \
| LOGIC_STEP_10 \
| SELECT \
| CASE \
| CASE_ELSE \
| SELECTEND \
| IF \
| ELSEIF \
| ELSE \
| ENDIF
!error "Defines required for this library are already in use."
!endif
; change if requried
!define LOGIC_DELIMITER ";"
; create quick macros
!define SELECT "!insertmacro SELECT"
!define CASE "!insertmacro CASE"
!define CASE_ELSE "!insertmacro CASE_ELSE"
!define ENDSELECT "!insertmacro ENDSELECT"
!define IF "!insertmacro IF"
!define ELSEIF "!insertmacro ELSEIF"
!define ELSE "!insertmacro ELSE"
!define ENDIF "!insertmacro ENDIF"
; set local parameters based on counter and step
!macro LOGIC_DEFINES
!ifdef LOGIC_NEXT
!undef LOGIC_NEXT
!endif
!ifdef LOGIC_CURRENT
!undef LOGIC_CURRENT
!endif
!ifdef LOGIC_END
!undef LOGIC_END
!endif
!define LOGIC_END "LOGIC_${LOGIC_COUNTER}_${LOGIC_STEP}_END"
!define LOGIC_CURRENT "${LOGIC_${LOGIC_COUNTER}_${LOGIC_STEP}_LINE}"
!define LOGIC_NEXT "LOGIC_${LOGIC_COUNTER}_${LOGIC_STEP}_${LOGIC_CURRENT}"
!macroend
; start new statment
!macro LOGIC_START
!ifdef LOGIC_STEP
!undef LOGIC_STEP
!ifdef LOGIC_STEP_2
!ifdef LOGIC_STEP_3
!ifdef LOGIC_STEP_4
!ifdef LOGIC_STEP_5
!ifdef LOGIC_STEP_6
!ifdef LOGIC_STEP_7
!ifdef LOGIC_STEP_8
!ifdef LOGIC_STEP_9
!ifdef LOGIC_STEP_10
!error "Maximum statement depth reached."
!else
!define LOGIC_STEP 10
!define LOGIC_STEP_10
!endif
!else
!define LOGIC_STEP 9
!define LOGIC_STEP_9
!endif
!else
!define LOGIC_STEP 8
!define LOGIC_STEP_8
!endif
!else
!define LOGIC_STEP 7
!define LOGIC_STEP_7
!endif
!else
!define LOGIC_STEP 6
!define LOGIC_STEP_6
!endif
!else
!define LOGIC_STEP 5
!define LOGIC_STEP_5
!endif
!else
!define LOGIC_STEP 4
!define LOGIC_STEP_4
!endif
!else
!define LOGIC_STEP 3
!define LOGIC_STEP_3
!endif
!else
!define LOGIC_STEP 2
!define LOGIC_STEP_2
!endif
!else
!define LOGIC_STEP 1
!define LOGIC_STEP_1
!ifdef LOGIC_COUNTER
!undef LOGIC_COUNTER
!endif
!define LOGIC_COUNTER ${__LINE__}
!endif
!define "LOGIC_${LOGIC_COUNTER}_${LOGIC_STEP}_LINE" "${__LINE__}"
!insertmacro LOGIC_DEFINES
Goto "${LOGIC_NEXT}"
!macroend
; complete last statement and increment line number
!macro LOGIC_NEXT
!insertmacro LOGIC_DEFINES
Goto "${LOGIC_END}"
"${LOGIC_NEXT}:"
!undef "LOGIC_${LOGIC_COUNTER}_${LOGIC_STEP}_LINE"
!define "LOGIC_${LOGIC_COUNTER}_${LOGIC_STEP}_LINE" "${__LINE__}"
!insertmacro LOGIC_DEFINES
!macroend
; complete statement and cleanup defines
!macro LOGIC_END
!insertmacro LOGIC_DEFINES
Goto "${LOGIC_END}"
Goto "${LOGIC_NEXT}"
"${LOGIC_NEXT}:"
"${LOGIC_END}:"
!undef LOGIC_END
!undef LOGIC_NEXT
!undef "LOGIC_${LOGIC_COUNTER}_${LOGIC_STEP}_LINE"
!undef LOGIC_CURRENT
!undef LOGIC_STEP
!ifndef LOGIC_STEP_10
!ifndef LOGIC_STEP_9
!ifndef LOGIC_STEP_8
!ifndef LOGIC_STEP_7
!ifndef LOGIC_STEP_6
!ifndef LOGIC_STEP_5
!ifndef LOGIC_STEP_4
!ifndef LOGIC_STEP_3
!ifndef LOGIC_STEP_2
!ifndef LOGIC_STEP_1
!undef LOGIC_STEP_1
!endif
!else
!undef LOGIC_STEP_2
!define LOGIC_STEP 1
!endif
!else
!undef LOGIC_STEP_3
!define LOGIC_STEP 2
!endif
!else
!undef LOGIC_STEP_4
!define LOGIC_STEP 3
!endif
!else
!undef LOGIC_STEP_5
!define LOGIC_STEP 4
!endif
!else
!undef LOGIC_STEP_5
!define LOGIC_STEP 4
!endif
!else
!undef LOGIC_STEP_6
!define LOGIC_STEP 5
!endif
!else
!undef LOGIC_STEP_8
!define LOGIC_STEP 7
!endif
!else
!undef LOGIC_STEP_9
!define LOGIC_STEP 8
!endif
!else
!undef LOGIC_STEP_10
!define LOGIC_STEP 9
!endif
!macroend
!macro ELSEIF VALUE1 OP VALUE2
!insertmacro LOGIC_NEXT
StrCmp "${OP}" "<>" "${LOGIC_NEXT}_NotEqual"
StrCmp "${OP}" "<" "${LOGIC_NEXT}_Less"
StrCmp "${OP}" ">" "${LOGIC_NEXT}_Greater"
StrCmp "${OP}" "<=" "${LOGIC_NEXT}_LessEqual"
StrCmp "${OP}" ">=" "${LOGIC_NEXT}_GreaterEqual"
StrCmp "${OP}" "=" "${LOGIC_NEXT}_Equal" 0 ;default
"${LOGIC_NEXT}_Equal:"
StrCmp "${VALUE1}" "${VALUE2}" 0 "${LOGIC_NEXT}"
Goto "${LOGIC_NEXT}_done"
"${LOGIC_NEXT}_NotEqual:"
StrCmp "${VALUE1}" "${VALUE2}" "${LOGIC_NEXT}" 0
Goto "${LOGIC_NEXT}_done"
"${LOGIC_NEXT}_Less:"
IntCmp "${VALUE1}" "${VALUE2}" "${LOGIC_NEXT}" 0 "${LOGIC_NEXT}"
Goto "${LOGIC_NEXT}_done"
"${LOGIC_NEXT}_Greater:"
IntCmp "${VALUE1}" "${VALUE2}" "${LOGIC_NEXT}" "${LOGIC_NEXT}" 0
Goto "${LOGIC_NEXT}_done"
"${LOGIC_NEXT}_LessEqual:"
IntCmp "${VALUE1}" "${VALUE2}" 0 0 "${LOGIC_NEXT}"
Goto "${LOGIC_NEXT}_done"
"${LOGIC_NEXT}_GreaterEqual:"
IntCmp "${VALUE1}" "${VALUE2}" 0 "${LOGIC_NEXT}" 0
Goto "${LOGIC_NEXT}_done"
"${LOGIC_NEXT}_done:"
!macroend
!macro IF VALUE1 OP VALUE2
!insertmacro LOGIC_START
!insertmacro ELSEIF "${VALUE1}" "${OP}" "${VALUE2}"
!macroend
!macro ELSE
!insertmacro LOGIC_NEXT
!macroend
!macro ENDIF
!insertmacro LOGIC_END
!macroend
!macro SELECT VALUE
!insertmacro LOGIC_START
!define "LOGIC_${LOGIC_COUNTER}_${LOGIC_STEP}_VALUE" "${VALUE}"
!macroend
!macro CASE VALUES
!insertmacro LOGIC_NEXT
Push $R1 ;counter
Push $R2 ;value
Push $R3 ;return
StrCpy $R1 "${VALUES};"
"${LOGIC_NEXT}_loop:"
StrCmp $R1 "" "${LOGIC_NEXT}"
Push "$R1"
Push ";"
Call StrTok
Pop $R2
Pop $R1
StrCmp $R2 "${LOGIC_${LOGIC_COUNTER}_${LOGIC_STEP}_VALUE}" "${LOGIC_NEXT}_done" "${LOGIC_NEXT}_loop"
"${LOGIC_NEXT}_done:"
Pop $R3
Pop $R2
Pop $R1
!macroend
!macro CASE_ELSE
!insertmacro LOGIC_NEXT
!macroend
!macro ENDSELECT
!undef "LOGIC_${LOGIC_COUNTER}_${LOGIC_STEP}_VALUE"
!insertmacro LOGIC_END
!macroend
Function StrTok
Exch $R1
Exch 1
Exch $R0
Push $R2
Push $R3
Push $R4
Push $R5
StrLen $R2 $R0
IntOp $R2 $R2 + 1
loop1:
IntOp $R2 $R2 - 1
IntCmp $R2 0 exit
StrCpy $R4 $R0 1 -$R2
StrLen $R3 $R1
IntOp $R3 $R3 + 1
loop2:
IntOp $R3 $R3 - 1
IntCmp $R3 0 loop1
StrCpy $R5 $R1 1 -$R3
StrCmp $R4 $R5 Found
Goto loop2
Goto loop1
exit:
StrCpy $R1 ""
StrCpy $R0 ""
Goto Cleanup
Found:
StrLen $R3 $R0
IntOp $R3 $R3 - $R2
StrCpy $R1 $R0 $R3
IntOp $R2 $R2 - 1
IntOp $R3 $R3 + 1
StrCpy $R0 $R0 $R2 $R3
Cleanup:
Pop $R5
Pop $R4
Pop $R3
Pop $R2
Exch $R0
Exch 1
Exch $R1
Return
FunctionEnd
!endif ; LOGICLIB