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
This commit is contained in:
parent
a453e3281e
commit
2c892dde45
2 changed files with 324 additions and 69 deletions
|
@ -1,16 +1,22 @@
|
||||||
name "Test"
|
Name "test"
|
||||||
outfile "test.exe"
|
OutFile "test.exe"
|
||||||
silentinstall silent
|
SilentInstall silent
|
||||||
|
|
||||||
!include "selectlib.nsh"
|
!include "logiclib.nsh"
|
||||||
|
|
||||||
Section
|
Section
|
||||||
${SELECT} "test1"
|
${IF} "test" = "test2"
|
||||||
${CASE} "test1"
|
MessageBox MB_OK "test"
|
||||||
MessageBox MB_OK "case test1"
|
${ELSE}
|
||||||
${CASE} "test 2;test3"
|
${IF} "test" = "test"
|
||||||
MessageBox MB_OK "case test2 or test3"
|
${SELECT} 5
|
||||||
${CASE_ELSE}
|
${CASE} 4
|
||||||
MessageBox MB_OK "case else"
|
MessageBox MB_OK "case 4"
|
||||||
${SELECTEND}
|
${CASE} 5;6
|
||||||
|
MessageBox MB_OK "case 5 or 6"
|
||||||
|
${CASE_ELSE}
|
||||||
|
MessageBox MB_OK "case else"
|
||||||
|
${ENDSELECT}
|
||||||
|
${ENDIF}
|
||||||
|
${ENDIF}
|
||||||
SectionEnd
|
SectionEnd
|
|
@ -1,80 +1,328 @@
|
||||||
; NSIS SELECT LIBRARY - selectlib.nsh
|
; NSIS LOGIC LIBRARY - logiclib.nsh
|
||||||
; Version 1.0 - 09/15/2003
|
; Version 1.3 - 09/22/2003
|
||||||
; Questions/Comments - dselkirk@hotmail.com
|
; Questions/Comments - dselkirk@hotmail.com
|
||||||
;
|
;
|
||||||
; Description:
|
; Description:
|
||||||
; Provides the use of select statements
|
; 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:
|
; Usage:
|
||||||
; Section
|
; Select Statements -
|
||||||
; !insertmacro SELECT "TESTCASE" "test1"
|
; ${SELECT} "test1"
|
||||||
; !insertmacro CASE "test1"
|
; ${CASE} "test1"
|
||||||
; MessageBox MB_OK "case test1"
|
; MessageBox MB_OK "case: test1"
|
||||||
; !insertmacro CASE "test 2;test3"
|
; ${CASE} "test 2;test3"
|
||||||
; MessageBox MB_OK "case test2 or test3"
|
; MessageBox MB_OK "case: test2 or test3"
|
||||||
; !insertmacro CASE_ELSE
|
; ${CASE_ELSE}
|
||||||
; MessageBox MB_OK "case else"
|
; MessageBox MB_OK "case else"
|
||||||
; !insertmacro SELECTEND
|
; ${ENDSELECT}
|
||||||
; SectionEnd
|
;
|
||||||
|
; 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:
|
; History:
|
||||||
; 1.0 - 09/19/2003 - Initial release
|
; 1.0 - 09/19/2003 - Initial release.
|
||||||
; 1.1 - 09/20/2003 - Added simplified macros and removed NAME requirement
|
; 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 SELECTLIB
|
!ifndef LOGICLIB
|
||||||
!define SELECTLIB
|
!define LOGICLIB
|
||||||
|
|
||||||
!define SELECT "!insertmacro SELECT"
|
; check if defines are already in use
|
||||||
!define CASE "!insertmacro CASE"
|
!ifdef LOGIC_COUNTER \
|
||||||
!define CASE_ELSE "!insertmacro CASE_ELSE"
|
| LOGIC_DELIMITER \
|
||||||
!define SELECTEND "!insertmacro SELECTEND"
|
| 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
|
||||||
|
|
||||||
!macro SELECT VALUE
|
; change if requried
|
||||||
!define SELECT_NAME "${__LINE__}"
|
!define LOGIC_DELIMITER ";"
|
||||||
!define SELECT_VALUE "${VALUE}"
|
|
||||||
!define SELECT_COUNT "${__LINE__}"
|
|
||||||
Goto "lbl_${SELECT_NAME}_${SELECT_COUNT}"
|
|
||||||
!macroend
|
|
||||||
|
|
||||||
!macro CASE VALUES
|
; create quick macros
|
||||||
Goto "lbl_${SELECT_NAME}"
|
!define SELECT "!insertmacro SELECT"
|
||||||
"lbl_${SELECT_NAME}_${SELECT_COUNT}:"
|
!define CASE "!insertmacro CASE"
|
||||||
|
!define CASE_ELSE "!insertmacro CASE_ELSE"
|
||||||
|
!define ENDSELECT "!insertmacro ENDSELECT"
|
||||||
|
|
||||||
!undef SELECT_COUNT
|
!define IF "!insertmacro IF"
|
||||||
!define SELECT_COUNT "${__LINE__}"
|
!define ELSEIF "!insertmacro ELSEIF"
|
||||||
|
!define ELSE "!insertmacro ELSE"
|
||||||
|
!define ENDIF "!insertmacro ENDIF"
|
||||||
|
|
||||||
Push $R1 ;counter
|
; set local parameters based on counter and step
|
||||||
Push $R2 ;value
|
!macro LOGIC_DEFINES
|
||||||
Push $R3 ;return
|
!ifdef LOGIC_NEXT
|
||||||
StrCpy $R1 "${VALUES};"
|
!undef LOGIC_NEXT
|
||||||
"lbl_${SELECT_NAME}_${SELECT_COUNT}_loop:"
|
!endif
|
||||||
StrCmp $R1 "" "lbl_${SELECT_NAME}_${SELECT_COUNT}"
|
!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 "$R1"
|
||||||
Push ";"
|
Push ";"
|
||||||
Call StrTok
|
Call StrTok
|
||||||
Pop $R2
|
Pop $R2
|
||||||
Pop $R1
|
Pop $R1
|
||||||
StrCmp $R2 "${SELECT_VALUE}" "lbl_${SELECT_NAME}_${SELECT_COUNT}_done" "lbl_${SELECT_NAME}_${SELECT_COUNT}_loop"
|
StrCmp $R2 "${LOGIC_${LOGIC_COUNTER}_${LOGIC_STEP}_VALUE}" "${LOGIC_NEXT}_done" "${LOGIC_NEXT}_loop"
|
||||||
|
"${LOGIC_NEXT}_done:"
|
||||||
|
Pop $R3
|
||||||
|
Pop $R2
|
||||||
|
Pop $R1
|
||||||
|
!macroend
|
||||||
|
|
||||||
"lbl_${SELECT_NAME}_${SELECT_COUNT}_done:"
|
!macro CASE_ELSE
|
||||||
Pop $R3
|
!insertmacro LOGIC_NEXT
|
||||||
Pop $R2
|
!macroend
|
||||||
Pop $R1
|
|
||||||
|
|
||||||
;StrCmp ${VALUES} "${SELECT_VALUE}" 0 "lbl_${SELECT_NAME}_${SELECT_COUNT}"
|
!macro ENDSELECT
|
||||||
!macroend
|
!undef "LOGIC_${LOGIC_COUNTER}_${LOGIC_STEP}_VALUE"
|
||||||
|
!insertmacro LOGIC_END
|
||||||
!macro CASE_ELSE
|
!macroend
|
||||||
Goto "lbl_${SELECT_NAME}"
|
|
||||||
"lbl_${SELECT_NAME}_${SELECT_COUNT}:"
|
|
||||||
!macroend
|
|
||||||
|
|
||||||
!macro SELECTEND
|
|
||||||
lbl_${SELECT_NAME}:
|
|
||||||
!undef SELECT_NAME
|
|
||||||
!undef SELECT_VALUE
|
|
||||||
!undef SELECT_COUNT
|
|
||||||
!macroend
|
|
||||||
|
|
||||||
Function StrTok
|
Function StrTok
|
||||||
Exch $R1
|
Exch $R1
|
||||||
|
@ -118,6 +366,7 @@ Function StrTok
|
||||||
Exch $R0
|
Exch $R0
|
||||||
Exch 1
|
Exch 1
|
||||||
Exch $R1
|
Exch $R1
|
||||||
|
Return
|
||||||
FunctionEnd
|
FunctionEnd
|
||||||
|
|
||||||
!endif ;SELECTLIB
|
!endif ; LOGICLIB
|
Loading…
Add table
Add a link
Reference in a new issue