From 2c892dde4590890fbbb6168c4b84ec4447bdceb4 Mon Sep 17 00:00:00 2001 From: eccles Date: Sun, 14 Dec 2003 00:22:02 +0000 Subject: [PATCH] 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 --- Examples/LogicLib.nsi | 30 ++-- Include/LogicLib.nsh | 363 +++++++++++++++++++++++++++++++++++------- 2 files changed, 324 insertions(+), 69 deletions(-) diff --git a/Examples/LogicLib.nsi b/Examples/LogicLib.nsi index 95e8bcc0..ced43ca3 100644 --- a/Examples/LogicLib.nsi +++ b/Examples/LogicLib.nsi @@ -1,16 +1,22 @@ -name "Test" -outfile "test.exe" -silentinstall silent +Name "test" +OutFile "test.exe" +SilentInstall silent -!include "selectlib.nsh" +!include "logiclib.nsh" Section - ${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" - ${SELECTEND} + ${IF} "test" = "test2" + MessageBox MB_OK "test" + ${ELSE} + ${IF} "test" = "test" + ${SELECT} 5 + ${CASE} 4 + MessageBox MB_OK "case 4" + ${CASE} 5;6 + MessageBox MB_OK "case 5 or 6" + ${CASE_ELSE} + MessageBox MB_OK "case else" + ${ENDSELECT} + ${ENDIF} + ${ENDIF} SectionEnd \ No newline at end of file diff --git a/Include/LogicLib.nsh b/Include/LogicLib.nsh index c33262e3..e92d025d 100644 --- a/Include/LogicLib.nsh +++ b/Include/LogicLib.nsh @@ -1,80 +1,328 @@ -; NSIS SELECT LIBRARY - selectlib.nsh -; Version 1.0 - 09/15/2003 +; NSIS LOGIC LIBRARY - logiclib.nsh +; Version 1.3 - 09/22/2003 ; Questions/Comments - dselkirk@hotmail.com ; ; 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: -; Section -; !insertmacro SELECT "TESTCASE" "test1" -; !insertmacro CASE "test1" -; MessageBox MB_OK "case test1" -; !insertmacro CASE "test 2;test3" -; MessageBox MB_OK "case test2 or test3" -; !insertmacro CASE_ELSE +; 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" -; !insertmacro SELECTEND -; SectionEnd +; ${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.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 SELECTLIB - !define SELECTLIB +!ifndef LOGICLIB + !define LOGICLIB -!define SELECT "!insertmacro SELECT" -!define CASE "!insertmacro CASE" -!define CASE_ELSE "!insertmacro CASE_ELSE" -!define SELECTEND "!insertmacro SELECTEND" + ; 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 -!macro SELECT VALUE - !define SELECT_NAME "${__LINE__}" - !define SELECT_VALUE "${VALUE}" - !define SELECT_COUNT "${__LINE__}" - Goto "lbl_${SELECT_NAME}_${SELECT_COUNT}" -!macroend + ; change if requried + !define LOGIC_DELIMITER ";" -!macro CASE VALUES - Goto "lbl_${SELECT_NAME}" - "lbl_${SELECT_NAME}_${SELECT_COUNT}:" + ; create quick macros + !define SELECT "!insertmacro SELECT" + !define CASE "!insertmacro CASE" + !define CASE_ELSE "!insertmacro CASE_ELSE" + !define ENDSELECT "!insertmacro ENDSELECT" - !undef SELECT_COUNT - !define SELECT_COUNT "${__LINE__}" + !define IF "!insertmacro IF" + !define ELSEIF "!insertmacro ELSEIF" + !define ELSE "!insertmacro ELSE" + !define ENDIF "!insertmacro ENDIF" - Push $R1 ;counter - Push $R2 ;value - Push $R3 ;return - StrCpy $R1 "${VALUES};" - "lbl_${SELECT_NAME}_${SELECT_COUNT}_loop:" - StrCmp $R1 "" "lbl_${SELECT_NAME}_${SELECT_COUNT}" + ; 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 "${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:" - Pop $R3 - Pop $R2 - Pop $R1 + !macro CASE_ELSE + !insertmacro LOGIC_NEXT + !macroend - ;StrCmp ${VALUES} "${SELECT_VALUE}" 0 "lbl_${SELECT_NAME}_${SELECT_COUNT}" -!macroend - -!macro CASE_ELSE - 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 + !macro ENDSELECT +!undef "LOGIC_${LOGIC_COUNTER}_${LOGIC_STEP}_VALUE" + !insertmacro LOGIC_END + !macroend Function StrTok Exch $R1 @@ -118,6 +366,7 @@ Function StrTok Exch $R0 Exch 1 Exch $R1 + Return FunctionEnd -!endif ;SELECTLIB \ No newline at end of file +!endif ; LOGICLIB \ No newline at end of file