From 5887d6c60dc6801bff6c925c3cb1adeaf18508a6 Mon Sep 17 00:00:00 2001 From: anders_k Date: Tue, 10 Mar 2020 01:44:23 +0000 Subject: [PATCH] Added IfShellVarContextAll and refactored flag instructions generation git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@7152 212acab6-be3b-0410-9dea-997c60f758d6 --- Docs/src/flowcontrol.but | 6 ++ Docs/src/history.but | 4 ++ Include/LogicLib.nsh | 5 ++ Source/build.h | 1 + Source/script.cpp | 130 +++++++++++++++------------------------ Source/tokens.cpp | 2 + Source/tokens.h | 2 + 7 files changed, 69 insertions(+), 81 deletions(-) diff --git a/Docs/src/flowcontrol.but b/Docs/src/flowcontrol.but index 07a6b039..58aec31a 100644 --- a/Docs/src/flowcontrol.but +++ b/Docs/src/flowcontrol.but @@ -161,6 +161,12 @@ Checks the silent flag, and jumps to jump_if_silent if the installer is silent, \c IfSilent +2 \c ExecWait '"$INSTDIR\nonsilentprogram.exe"' +\S2{ifshellvarcontextall} IfShellVarContextAll + +\c jump_if_true [jump_if_false] + +Checks if \R{setshellvarcontext}{SetShellVarContext} is set to \e{all}. + \S2{intcmp} IntCmp \c val1 val2 jump_if_equal [jump_if_val1_less] [jump_if_val1_more] diff --git a/Docs/src/history.but b/Docs/src/history.but index e1b1efa7..180f7d45 100644 --- a/Docs/src/history.but +++ b/Docs/src/history.but @@ -14,6 +14,10 @@ Released on ? ?th, 2020 \S2{} Minor Changes +\b Added \R{ifshellvarcontextall} IfShellVarContextAll} + +\# Undocumented: \b Added GetShellVarContext | Documenting this would require documenting the all/current to number mapping + \H{v3.05} 3.05 Released on December 15th, 2019 diff --git a/Include/LogicLib.nsh b/Include/LogicLib.nsh index a94e5017..86f1003f 100644 --- a/Include/LogicLib.nsh +++ b/Include/LogicLib.nsh @@ -335,6 +335,11 @@ !macroend !define Silent `"" Silent ""` + !macro _ShellVarContextAll _a _b _t _f + IfShellVarContextAll `${_t}` `${_f}` + !macroend + !define ShellVarContextAll `"" ShellVarContextAll ""` + ; "Any instruction" test !macro _Cmd _a _b _t _f !define _t=${_t} diff --git a/Source/build.h b/Source/build.h index 034f6b07..87cf64c1 100644 --- a/Source/build.h +++ b/Source/build.h @@ -327,6 +327,7 @@ class CEXEBuild { int doParse(const TCHAR *str); int doCommand(int which_token, LineParser &line); TCHAR m_templinebuf[MAX_LINELENGTH]; // Buffer used by parseScript() & doCommand(), not recursion safe! + int add_flag_instruction_entry(int which_token, int opcode, LineParser &line, int offset, int data = 0); int do_add_file(const TCHAR *lgss, int attrib, int recurse, int *total_files, const TCHAR *name_override=0, int generatecode=1, int *data_handle=0, diff --git a/Source/script.cpp b/Source/script.cpp index af4c4a21..9497047e 100644 --- a/Source/script.cpp +++ b/Source/script.cpp @@ -912,6 +912,31 @@ static HKEY ParseRegRootKey(LineParser &line, int tok) return k == -1 ? INVALIDREGROOT : rootkey_tab[k]; } +int CEXEBuild::add_flag_instruction_entry(int which_token, int opcode, LineParser &line, int offset, int data) +{ + entry ent = { opcode, }; + switch(opcode) + { + case EW_SETFLAG: + ent.offsets[0] = offset; + ent.offsets[1] = data; + SCRIPT_MSG(_T("%") NPRIs _T(": %") NPRIs _T("\n"), get_commandtoken_name(which_token), line.gettoken_str(1)); + return add_entry(&ent); + case EW_IFFLAG: + if (process_jump(line, 1, &ent.offsets[0]) || process_jump(line, 2, &ent.offsets[1])) PRINTHELP() + ent.offsets[2]=offset; + ent.offsets[3]=data; + SCRIPT_MSG(_T("%") NPRIs _T(" ?%") NPRIs _T(":%") NPRIs _T("\n"), get_commandtoken_name(which_token), line.gettoken_str(1), line.gettoken_str(2)); + return add_entry(&ent); + case EW_GETFLAG: + if ((ent.offsets[0] = GetUserVarIndex(line, 1)) < 0) PRINTHELP(); + ent.offsets[1] = offset; + SCRIPT_MSG(_T("%") NPRIs _T(": %") NPRIs _T("\n"), get_commandtoken_name(which_token), line.gettoken_str(1)); + return add_entry(&ent); + } + return PS_ERROR; +} + int CEXEBuild::doCommand(int which_token, LineParser &line) { #ifdef NSIS_CONFIG_PLUGIN_SUPPORT @@ -1408,10 +1433,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) } return PS_OK; case TOK_GETINSTDIRERROR: - ent.which = EW_GETFLAG; - ent.offsets[0] = GetUserVarIndex(line, 1); - ent.offsets[1] = FLAG_OFFSET(instdir_error); - return add_entry(&ent); + return add_flag_instruction_entry(which_token, EW_GETFLAG, line, FLAG_OFFSET(instdir_error)); #ifdef NSIS_CONFIG_COMPONENTPAGE case TOK_COMPTEXT: { @@ -1682,23 +1704,11 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) return PS_ERROR; #endif case TOK_IFSILENT: - ent.which=EW_IFFLAG; - if (process_jump(line,1,&ent.offsets[0]) || - process_jump(line,2,&ent.offsets[1])) PRINTHELP() - ent.offsets[2]=FLAG_OFFSET(silent); - ent.offsets[3]=~0;//new value mask - keep flag - SCRIPT_MSG(_T("IfSilent ?%") NPRIs _T(":%") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(2)); - return add_entry(&ent); + return add_flag_instruction_entry(which_token, EW_IFFLAG, line, FLAG_OFFSET(silent), ~0); //new value mask - keep flag case TOK_SETSILENT: - { - ent.which=EW_SETFLAG; - ent.offsets[0]=FLAG_OFFSET(silent); - int k=line.gettoken_enum(1,_T("normal\0silent\0")); - if (k<0) PRINTHELP() - ent.offsets[1]=add_intstring(k); - SCRIPT_MSG(_T("SetSilent: %") NPRIs _T("\n"),line.gettoken_str(1)); - } - return add_entry(&ent); + ent.offsets[1] = line.gettoken_enum(1,_T("normal\0silent\0")); + if (ent.offsets[1] < 0 ) PRINTHELP() + return add_flag_instruction_entry(which_token, EW_SETFLAG, line, FLAG_OFFSET(silent), add_intstring(ent.offsets[1])); #else case TOK_SILENTINST: case TOK_SILENTUNINST: @@ -3015,16 +3025,14 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) SCRIPT_MSG(_T("SetRegView: %") NPRIs _T("\n"),line.gettoken_str(1)); } return add_entry(&ent); - case TOK_SETSHELLVARCONTEXT: - { - ent.which=EW_SETFLAG; - ent.offsets[0]=FLAG_OFFSET(all_user_var); - int k=line.gettoken_enum(1,_T("current\0all\0")); - if (k<0) PRINTHELP() - ent.offsets[1]=add_intstring(k); - SCRIPT_MSG(_T("SetShellVarContext: %") NPRIs _T("\n"),line.gettoken_str(1)); - } - return add_entry(&ent); + case TOK_GETSHELLVARCONTEXT: + return add_flag_instruction_entry(which_token, EW_GETFLAG, line, FLAG_OFFSET(all_user_var)); + case TOK_SETSHELLVARCONTEXT: + ent.offsets[1] = line.gettoken_enum(1,_T("current\0all\0")); + if (ent.offsets[1] < 0 ) PRINTHELP() + return add_flag_instruction_entry(which_token, EW_SETFLAG, line, FLAG_OFFSET(all_user_var), add_intstring(ent.offsets[1])); + case TOK_IFSHELLVARCONTEXTALL: + return add_flag_instruction_entry(which_token, EW_IFFLAG, line, FLAG_OFFSET(all_user_var), ~0); //new value mask - keep flag case TOK_RET: SCRIPT_MSG(_T("Return\n")); ent.which=EW_RET; @@ -3939,46 +3947,17 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) } return add_entry(&ent); case TOK_IFERRORS: - ent.which=EW_IFFLAG; - if (process_jump(line,1,&ent.offsets[0]) || - process_jump(line,2,&ent.offsets[1])) PRINTHELP() - ent.offsets[2]=FLAG_OFFSET(exec_error); - ent.offsets[3]=0;//new value mask - clean error - SCRIPT_MSG(_T("IfErrors ?%") NPRIs _T(":%") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(2)); - return add_entry(&ent); + return add_flag_instruction_entry(which_token, EW_IFFLAG, line, FLAG_OFFSET(exec_error), 0); //new value mask - clean error case TOK_IFABORT: - ent.which=EW_IFFLAG; - if (process_jump(line,1,&ent.offsets[0]) || - process_jump(line,2,&ent.offsets[1])) PRINTHELP() - ent.offsets[2]=FLAG_OFFSET(abort); - ent.offsets[3]=~0;//new value mask - keep flag - SCRIPT_MSG(_T("IfAbort ?%") NPRIs _T(":%") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(2)); - return add_entry(&ent); + return add_flag_instruction_entry(which_token, EW_IFFLAG, line, FLAG_OFFSET(abort), ~0); //new value mask - keep flag case TOK_CLEARERRORS: - ent.which=EW_SETFLAG; - ent.offsets[0]=FLAG_OFFSET(exec_error); - ent.offsets[1]=add_intstring(0); - SCRIPT_MSG(_T("ClearErrors\n")); - return add_entry(&ent); + return add_flag_instruction_entry(which_token, EW_SETFLAG, line, FLAG_OFFSET(exec_error), add_intstring(0)); case TOK_SETERRORS: - ent.which=EW_SETFLAG; - ent.offsets[0]=FLAG_OFFSET(exec_error); - ent.offsets[1]=add_intstring(1); - SCRIPT_MSG(_T("SetErrors\n")); - return add_entry(&ent); + return add_flag_instruction_entry(which_token, EW_SETFLAG, line, FLAG_OFFSET(exec_error), add_intstring(1)); case TOK_SETERRORLEVEL: - ent.which=EW_SETFLAG; - ent.offsets[0]=FLAG_OFFSET(errlvl); - ent.offsets[1]=add_string(line.gettoken_str(1)); - SCRIPT_MSG(_T("SetErrorLevel: %") NPRIs _T("\n"),line.gettoken_str(1)); - return add_entry(&ent); + return add_flag_instruction_entry(which_token, EW_SETFLAG, line, FLAG_OFFSET(errlvl), add_string(line.gettoken_str(1))); case TOK_GETERRORLEVEL: - ent.which=EW_GETFLAG; - ent.offsets[0]=GetUserVarIndex(line, 1); - ent.offsets[1]=FLAG_OFFSET(errlvl); - if (line.gettoken_str(1)[0] && ent.offsets[0]<0) PRINTHELP() - SCRIPT_MSG(_T("GetErrorLevel: %") NPRIs _T("\n"),line.gettoken_str(1)); - return add_entry(&ent); + return add_flag_instruction_entry(which_token, EW_GETFLAG, line, FLAG_OFFSET(errlvl)); #ifdef NSIS_SUPPORT_STROPTS case TOK_STRLEN: ent.which=EW_STRLEN; @@ -4733,28 +4712,17 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ret = add_entry_direct(EW_QUIT); if (ret != PS_OK) return ret; - SCRIPT_MSG(_T("Reboot! (WOW)\n")); + SCRIPT_MSG(_T("Reboot!\n")); DefineInnerLangString(NLF_INST_CORRUPTED); } return PS_OK; case TOK_IFREBOOTFLAG: - ent.which=EW_IFFLAG; - if (process_jump(line,1,&ent.offsets[0]) || - process_jump(line,2,&ent.offsets[1])) PRINTHELP() - ent.offsets[2]=FLAG_OFFSET(exec_reboot); - ent.offsets[3]=~0;//new value mask - keep flag - SCRIPT_MSG(_T("IfRebootFlag ?%") NPRIs _T(":%") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(2)); - return add_entry(&ent); + return add_flag_instruction_entry(which_token, EW_IFFLAG, line, FLAG_OFFSET(exec_reboot), ~0); //new value mask - keep flag case TOK_SETREBOOTFLAG: - { - ent.which=EW_SETFLAG; - ent.offsets[0]=FLAG_OFFSET(exec_reboot); - int k=line.gettoken_enum(1,_T("false\0true\0")); - if (k < 0) PRINTHELP() - ent.offsets[1]=add_intstring(k); - } - return add_entry(&ent); + ent.offsets[1] = line.gettoken_enum(1,_T("false\0true\0")); + if (ent.offsets[1] < 0) PRINTHELP() + return add_flag_instruction_entry(which_token, EW_SETFLAG, line, FLAG_OFFSET(exec_reboot), add_intstring(ent.offsets[1])); #else case TOK_REBOOT: case TOK_IFREBOOTFLAG: diff --git a/Source/tokens.cpp b/Source/tokens.cpp index c386f64f..3006553c 100644 --- a/Source/tokens.cpp +++ b/Source/tokens.cpp @@ -212,7 +212,9 @@ static tokenType tokenlist[TOK__LAST] = {TOK_SETPLUGINUNLOAD,_T("SetPluginUnload"),1,0,_T("deprecated - plug-ins should handle this on their own"),TP_ALL}, {TOK_SETREBOOTFLAG,_T("SetRebootFlag"),1,0,_T("true|false"),TP_CODE}, {TOK_SETREGVIEW,_T("SetRegView"),1,0,_T("32|64|default|lastused"),TP_CODE}, +{TOK_GETSHELLVARCONTEXT,_T("GetShellVarContext"),1,0,_T("$(user_var: output)"),TP_CODE}, {TOK_SETSHELLVARCONTEXT,_T("SetShellVarContext"),1,0,_T("all|current"),TP_CODE}, +{TOK_IFSHELLVARCONTEXTALL,_T("IfShellVarContextAll"),1,1,_T("goto_true [goto_false]"),TP_CODE}, {TOK_SETSILENT,_T("SetSilent"),1,0,_T("silent|normal"),TP_CODE}, {TOK_SHOWDETAILS,_T("ShowInstDetails"),1,0,_T("(hide|show|nevershow)"),TP_GLOBAL}, {TOK_SHOWDETAILSUNINST,_T("ShowUninstDetails"),1,0,_T("(hide|show|nevershow)"),TP_GLOBAL}, diff --git a/Source/tokens.h b/Source/tokens.h index 6e22acac..4abefa7f 100644 --- a/Source/tokens.h +++ b/Source/tokens.h @@ -301,7 +301,9 @@ enum TOK_GETCURINSTTYPE, TOK_SETCURINSTTYPE, TOK_SETREGVIEW, + TOK_GETSHELLVARCONTEXT, TOK_SETSHELLVARCONTEXT, + TOK_IFSHELLVARCONTEXTALL, TOK_PLUGINDIR, TOK_INITPLUGINSDIR, TOK_CREATEFONT,