From 1883dc3a191fa1dabfbbcbc6d33f24b49d1dd55c Mon Sep 17 00:00:00 2001 From: ramon18 Date: Tue, 15 Jul 2003 23:40:34 +0000 Subject: [PATCH] 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 --- Examples/UserVars.nsi | 9 ++++---- Source/build.cpp | 53 ++++++------------------------------------- Source/build.h | 1 - Source/script.cpp | 6 +++-- 4 files changed, 15 insertions(+), 54 deletions(-) diff --git a/Examples/UserVars.nsi b/Examples/UserVars.nsi index 74154f18..401b65ad 100644 --- a/Examples/UserVars.nsi +++ b/Examples/UserVars.nsi @@ -15,8 +15,7 @@ Var "Name" Var "Serial" - - Var "un.Info" ; this one can only be used in the uninstaller + Var "Info" ;-------------------------------- ; Installer @@ -38,7 +37,7 @@ SectionEnd Section "Uninstall" - StrCpy $un.Info "User variables test uninstalled successfully." + StrCpy $Info "User variables test uninstalled successfully." Delete "$INSTDIR\Uninst.exe" RmDir $INSTDIR @@ -47,6 +46,6 @@ SectionEnd Function un.OnUninstSuccess HideWindow - MessageBox MB_OK "$un.Info" + MessageBox MB_OK "$Info" -FunctionEnd \ No newline at end of file +FunctionEnd diff --git a/Source/build.cpp b/Source/build.cpp index 85620047..b07ad5ef 100644 --- a/Source/build.cpp +++ b/Source/build.cpp @@ -355,46 +355,28 @@ CEXEBuild::CEXEBuild() { sprintf(Aux, "%d", i); m_UserVarNames.add(Aux,1); - m_UnUserVarNames.add(Aux,1); } for ( i = 0; i < 10; i++ ) // 10 - 19 { sprintf(Aux, "R%d", i); 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_UnUserVarNames.add("CMDLINE",1); m_UserVarNames.add("INSTDIR",1); // 21 - m_UnUserVarNames.add("INSTDIR",1); m_UserVarNames.add("OUTDIR",1); // 22 - m_UnUserVarNames.add("OUTDIR",1); m_UserVarNames.add("EXEDIR",1); // 23 - m_UnUserVarNames.add("EXEDIR",1); m_UserVarNames.add("LANGUAGE",1); // 24 - m_UnUserVarNames.add("LANGUAGE",1); m_UserVarNames.add("PLUGINSDIR",1); // 25 - m_UnUserVarNames.add("PLUGINSDIR",1); m_UserVarNames.add("PROGRAMFILES",1); // 26 - m_UnUserVarNames.add("PROGRAMFILES",1); m_UserVarNames.add("SMPROGRAMS",1); // 27 - m_UnUserVarNames.add("SMPROGRAMS",1); m_UserVarNames.add("SMSTARTUP",1); // 28 - m_UnUserVarNames.add("SMSTARTUP",1); m_UserVarNames.add("DESKTOP",1); // 29 - m_UnUserVarNames.add("DESKTOP",1); m_UserVarNames.add("STARTMENU",1); // 30 - m_UnUserVarNames.add("STARTMENU",1); m_UserVarNames.add("QUICKLAUNCH",1); // 31 - m_UnUserVarNames.add("QUICKLAUNCH",1); m_UserVarNames.add("TEMP",1); // 32 - m_UnUserVarNames.add("TEMP",1); 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_UnUserVarNames.add("SYSDIR",1); m_UserVarNames.add("HWNDPARENT",1); // 35 - m_UnUserVarNames.add("HWNDPARENT",1); #endif } @@ -542,14 +524,14 @@ int CEXEBuild::preprocess_string(char *out, const char *in) 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 ) { // Well, using variables inside string formating doens't mean // using the variable, beacuse it will be always an empty string // which is also memory wasting // 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; *(WORD*)out=((WORD)idxUserVar+1) | 0xF000; out += sizeof(WORD); @@ -1871,8 +1853,7 @@ int CEXEBuild::write_output(void) #ifdef NSIS_SUPPORT_NAMED_USERVARS VerifyDeclaredUserVarRefs(&m_UserVarNames); - VerifyDeclaredUserVarRefs(&m_UnUserVarNames); - int MaxUserVars = max(m_UserVarNames.getnum(), m_UnUserVarNames.getnum()); + int MaxUserVars = m_UserVarNames.getnum(); 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); @@ -2726,11 +2707,8 @@ int CEXEBuild::DeclaredUserVar(const char *szVarName) } } - if ( !strnicmp(szVarName,"un.",3) ) - m_UnUserVarNames.add(szVarName); - else - m_UserVarNames.add(szVarName); - if ( m_UserVarNames.getnum() > MAX_NAMED_USER_VARS || m_UnUserVarNames.getnum() > MAX_NAMED_USER_VARS ) + m_UserVarNames.add(szVarName); + if ( m_UserVarNames.getnum() > MAX_NAMED_USER_VARS ) { ERROR_MSG("Error: too many user variables declared!\n"); return PS_ERROR; @@ -2744,31 +2722,14 @@ int CEXEBuild::GetUserVarIndex(LineParser &line, int token) #ifdef NSIS_SUPPORT_NAMED_USERVARS char *p = line.gettoken_str(token); - UserVarsStringList *pUserVarList = uninstall_mode ? &m_UnUserVarNames : &m_UserVarNames; if ( *p == '$' && *(p+1) ) { - int idxUserVar = pUserVarList->get((char *)p+1); + int idxUserVar = m_UserVarNames.get((char *)p+1); if ( idxUserVar >= 0 ) { - pUserVarList->inc_reference(idxUserVar); + m_UserVarNames.inc_reference(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; diff --git a/Source/build.h b/Source/build.h index bd94198f..e66b856d 100644 --- a/Source/build.h +++ b/Source/build.h @@ -200,7 +200,6 @@ class CEXEBuild { #ifdef NSIS_SUPPORT_NAMED_USERVARS bool b_abort_compile; UserVarsStringList m_UserVarNames; - UserVarsStringList m_UnUserVarNames; int DeclaredUserVar(const char *VarName); void VerifyDeclaredUserVarRefs(UserVarsStringList *pVarsStringList); #endif diff --git a/Source/script.cpp b/Source/script.cpp index 598aeb7a..02a302bf 100644 --- a/Source/script.cpp +++ b/Source/script.cpp @@ -4603,8 +4603,10 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) #ifdef NSIS_SUPPORT_NAMED_USERVARS case TOK_DEFVAR: { - return DeclaredUserVar(line.gettoken_str(1)); - SCRIPT_MSG("dim \"%s\"\n",line.gettoken_str(1)); + SCRIPT_MSG("VAR \"%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));