Fix problem on Script.cpp that allowed VAR declarations inside Functions and Sections, no more differences between installer uservars and unistaller user vars (even if name start with un. ), changed example too

git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@2720 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
ramon18 2003-07-15 23:40:34 +00:00
parent cd2eacc81e
commit 1883dc3a19
4 changed files with 15 additions and 54 deletions

View file

@ -15,8 +15,7 @@
Var "Name" Var "Name"
Var "Serial" Var "Serial"
Var "Info"
Var "un.Info" ; this one can only be used in the uninstaller
;-------------------------------- ;--------------------------------
; Installer ; Installer
@ -38,7 +37,7 @@ SectionEnd
Section "Uninstall" Section "Uninstall"
StrCpy $un.Info "User variables test uninstalled successfully." StrCpy $Info "User variables test uninstalled successfully."
Delete "$INSTDIR\Uninst.exe" Delete "$INSTDIR\Uninst.exe"
RmDir $INSTDIR RmDir $INSTDIR
@ -47,6 +46,6 @@ SectionEnd
Function un.OnUninstSuccess Function un.OnUninstSuccess
HideWindow HideWindow
MessageBox MB_OK "$un.Info" MessageBox MB_OK "$Info"
FunctionEnd FunctionEnd

View file

@ -355,46 +355,28 @@ CEXEBuild::CEXEBuild()
{ {
sprintf(Aux, "%d", i); sprintf(Aux, "%d", i);
m_UserVarNames.add(Aux,1); m_UserVarNames.add(Aux,1);
m_UnUserVarNames.add(Aux,1);
} }
for ( i = 0; i < 10; i++ ) // 10 - 19 for ( i = 0; i < 10; i++ ) // 10 - 19
{ {
sprintf(Aux, "R%d", i); sprintf(Aux, "R%d", i);
m_UserVarNames.add(Aux,1); m_UserVarNames.add(Aux,1);
m_UnUserVarNames.add(Aux,1);
} }
m_UserVarNames.add("CMDLINE",1); // 20 everything before here doesn't have trailing slash removal m_UserVarNames.add("CMDLINE",1); // 20 everything before here doesn't have trailing slash removal
m_UnUserVarNames.add("CMDLINE",1);
m_UserVarNames.add("INSTDIR",1); // 21 m_UserVarNames.add("INSTDIR",1); // 21
m_UnUserVarNames.add("INSTDIR",1);
m_UserVarNames.add("OUTDIR",1); // 22 m_UserVarNames.add("OUTDIR",1); // 22
m_UnUserVarNames.add("OUTDIR",1);
m_UserVarNames.add("EXEDIR",1); // 23 m_UserVarNames.add("EXEDIR",1); // 23
m_UnUserVarNames.add("EXEDIR",1);
m_UserVarNames.add("LANGUAGE",1); // 24 m_UserVarNames.add("LANGUAGE",1); // 24
m_UnUserVarNames.add("LANGUAGE",1);
m_UserVarNames.add("PLUGINSDIR",1); // 25 m_UserVarNames.add("PLUGINSDIR",1); // 25
m_UnUserVarNames.add("PLUGINSDIR",1);
m_UserVarNames.add("PROGRAMFILES",1); // 26 m_UserVarNames.add("PROGRAMFILES",1); // 26
m_UnUserVarNames.add("PROGRAMFILES",1);
m_UserVarNames.add("SMPROGRAMS",1); // 27 m_UserVarNames.add("SMPROGRAMS",1); // 27
m_UnUserVarNames.add("SMPROGRAMS",1);
m_UserVarNames.add("SMSTARTUP",1); // 28 m_UserVarNames.add("SMSTARTUP",1); // 28
m_UnUserVarNames.add("SMSTARTUP",1);
m_UserVarNames.add("DESKTOP",1); // 29 m_UserVarNames.add("DESKTOP",1); // 29
m_UnUserVarNames.add("DESKTOP",1);
m_UserVarNames.add("STARTMENU",1); // 30 m_UserVarNames.add("STARTMENU",1); // 30
m_UnUserVarNames.add("STARTMENU",1);
m_UserVarNames.add("QUICKLAUNCH",1); // 31 m_UserVarNames.add("QUICKLAUNCH",1); // 31
m_UnUserVarNames.add("QUICKLAUNCH",1);
m_UserVarNames.add("TEMP",1); // 32 m_UserVarNames.add("TEMP",1); // 32
m_UnUserVarNames.add("TEMP",1);
m_UserVarNames.add("WINDIR",1); // 33 m_UserVarNames.add("WINDIR",1); // 33
m_UnUserVarNames.add("WINDIR",1);
m_UserVarNames.add("SYSDIR",1); // 34 everything after here doesn't have trailing slash removal m_UserVarNames.add("SYSDIR",1); // 34 everything after here doesn't have trailing slash removal
m_UnUserVarNames.add("SYSDIR",1);
m_UserVarNames.add("HWNDPARENT",1); // 35 m_UserVarNames.add("HWNDPARENT",1); // 35
m_UnUserVarNames.add("HWNDPARENT",1);
#endif #endif
} }
@ -542,14 +524,14 @@ int CEXEBuild::preprocess_string(char *out, const char *in)
while ( pUserVarName > p ) while ( pUserVarName > p )
{ {
int idxUserVar = uninstall_mode ? m_UnUserVarNames.get((char*)p, pUserVarName-p) : m_UserVarNames.get((char*)p, pUserVarName-p); int idxUserVar = m_UserVarNames.get((char*)p, pUserVarName-p);
if ( idxUserVar >= 0 ) if ( idxUserVar >= 0 )
{ {
// Well, using variables inside string formating doens't mean // Well, using variables inside string formating doens't mean
// using the variable, beacuse it will be always an empty string // using the variable, beacuse it will be always an empty string
// which is also memory wasting // which is also memory wasting
// So the line below must be commented !?? // So the line below must be commented !??
//uninstall_mode ? m_UnUserVarNames.inc_reference(idxUserVar): m_UserVarNames.inc_reference(idxUserVar); //m_UserVarNames.inc_reference(idxUserVar);
*out++=(unsigned int)VAR_CODES_START; // Named user variable; *out++=(unsigned int)VAR_CODES_START; // Named user variable;
*(WORD*)out=((WORD)idxUserVar+1) | 0xF000; *(WORD*)out=((WORD)idxUserVar+1) | 0xF000;
out += sizeof(WORD); out += sizeof(WORD);
@ -1871,8 +1853,7 @@ int CEXEBuild::write_output(void)
#ifdef NSIS_SUPPORT_NAMED_USERVARS #ifdef NSIS_SUPPORT_NAMED_USERVARS
VerifyDeclaredUserVarRefs(&m_UserVarNames); VerifyDeclaredUserVarRefs(&m_UserVarNames);
VerifyDeclaredUserVarRefs(&m_UnUserVarNames); int MaxUserVars = m_UserVarNames.getnum();
int MaxUserVars = max(m_UserVarNames.getnum(), m_UnUserVarNames.getnum());
if (!res_editor->AddExtraVirtualSize2PESection(VARS_SECTION_NAME, (MaxUserVars-TOTAL_COMPATIBLE_STATIC_VARS_COUNT) * sizeof(NSIS_STRING))) if (!res_editor->AddExtraVirtualSize2PESection(VARS_SECTION_NAME, (MaxUserVars-TOTAL_COMPATIBLE_STATIC_VARS_COUNT) * sizeof(NSIS_STRING)))
{ {
ERROR_MSG("Internal compiler error #12346: invalid exehead cannot find section \"%s\"!\n", VARS_SECTION_NAME); ERROR_MSG("Internal compiler error #12346: invalid exehead cannot find section \"%s\"!\n", VARS_SECTION_NAME);
@ -2726,11 +2707,8 @@ int CEXEBuild::DeclaredUserVar(const char *szVarName)
} }
} }
if ( !strnicmp(szVarName,"un.",3) ) m_UserVarNames.add(szVarName);
m_UnUserVarNames.add(szVarName); if ( m_UserVarNames.getnum() > MAX_NAMED_USER_VARS )
else
m_UserVarNames.add(szVarName);
if ( m_UserVarNames.getnum() > MAX_NAMED_USER_VARS || m_UnUserVarNames.getnum() > MAX_NAMED_USER_VARS )
{ {
ERROR_MSG("Error: too many user variables declared!\n"); ERROR_MSG("Error: too many user variables declared!\n");
return PS_ERROR; return PS_ERROR;
@ -2744,31 +2722,14 @@ int CEXEBuild::GetUserVarIndex(LineParser &line, int token)
#ifdef NSIS_SUPPORT_NAMED_USERVARS #ifdef NSIS_SUPPORT_NAMED_USERVARS
char *p = line.gettoken_str(token); char *p = line.gettoken_str(token);
UserVarsStringList *pUserVarList = uninstall_mode ? &m_UnUserVarNames : &m_UserVarNames;
if ( *p == '$' && *(p+1) ) if ( *p == '$' && *(p+1) )
{ {
int idxUserVar = pUserVarList->get((char *)p+1); int idxUserVar = m_UserVarNames.get((char *)p+1);
if ( idxUserVar >= 0 ) if ( idxUserVar >= 0 )
{ {
pUserVarList->inc_reference(idxUserVar); m_UserVarNames.inc_reference(idxUserVar);
return idxUserVar; return idxUserVar;
} }
else
{
// Show error info to help developer
idxUserVar = uninstall_mode ? m_UserVarNames.get((char *)p+1) : m_UnUserVarNames.get((char *)p+1);
if ( idxUserVar >= 0 )
{
if (!strnicmp(p+1,"un.",3) && !uninstall_mode ) {
b_abort_compile=true;
ERROR_MSG("Installer variables names can't start with un. (%s)! (%s:%d)\n", p+1, curfilename, linecnt);
}
if (strnicmp(p+1,"un.",3) && uninstall_mode ) {
b_abort_compile=true;
ERROR_MSG("Uninstaller variables names must start with un. (%s)! (%s:%d)\n", p+1, curfilename, linecnt);
}
}
}
} }
return -1; return -1;

View file

@ -200,7 +200,6 @@ class CEXEBuild {
#ifdef NSIS_SUPPORT_NAMED_USERVARS #ifdef NSIS_SUPPORT_NAMED_USERVARS
bool b_abort_compile; bool b_abort_compile;
UserVarsStringList m_UserVarNames; UserVarsStringList m_UserVarNames;
UserVarsStringList m_UnUserVarNames;
int DeclaredUserVar(const char *VarName); int DeclaredUserVar(const char *VarName);
void VerifyDeclaredUserVarRefs(UserVarsStringList *pVarsStringList); void VerifyDeclaredUserVarRefs(UserVarsStringList *pVarsStringList);
#endif #endif

View file

@ -4603,8 +4603,10 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
#ifdef NSIS_SUPPORT_NAMED_USERVARS #ifdef NSIS_SUPPORT_NAMED_USERVARS
case TOK_DEFVAR: case TOK_DEFVAR:
{ {
return DeclaredUserVar(line.gettoken_str(1)); SCRIPT_MSG("VAR \"%s\"\n",line.gettoken_str(1));
SCRIPT_MSG("dim \"%s\"\n",line.gettoken_str(1)); int res = DeclaredUserVar(line.gettoken_str(1));
if ( res != PS_OK )
return res;
} }
return make_sure_not_in_secorfunc(line.gettoken_str(0)); return make_sure_not_in_secorfunc(line.gettoken_str(0));