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
This commit is contained in:
parent
fc15c72cdd
commit
5887d6c60d
7 changed files with 69 additions and 81 deletions
|
@ -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]
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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},
|
||||
|
|
|
@ -301,7 +301,9 @@ enum
|
|||
TOK_GETCURINSTTYPE,
|
||||
TOK_SETCURINSTTYPE,
|
||||
TOK_SETREGVIEW,
|
||||
TOK_GETSHELLVARCONTEXT,
|
||||
TOK_SETSHELLVARCONTEXT,
|
||||
TOK_IFSHELLVARCONTEXTALL,
|
||||
TOK_PLUGINDIR,
|
||||
TOK_INITPLUGINSDIR,
|
||||
TOK_CREATEFONT,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue