Refactor m_macros finder/getter
git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@6304 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
parent
809f5e9b1b
commit
43b30c9337
2 changed files with 55 additions and 97 deletions
|
@ -182,7 +182,8 @@ class CEXEBuild {
|
||||||
#endif
|
#endif
|
||||||
int parseScript();
|
int parseScript();
|
||||||
int includeScript(const TCHAR *f, NStreamEncoding&enc);
|
int includeScript(const TCHAR *f, NStreamEncoding&enc);
|
||||||
int MacroExists(const TCHAR *macroname);
|
TCHAR* GetMacro(const TCHAR *macroname, TCHAR**macroend = 0);
|
||||||
|
inline bool MacroExists(const TCHAR *macroname);
|
||||||
int LoadLicenseFile(const TCHAR *file, TCHAR** pdata, const TCHAR *cmdname, WORD AnsiCP);
|
int LoadLicenseFile(const TCHAR *file, TCHAR** pdata, const TCHAR *cmdname, WORD AnsiCP);
|
||||||
#ifdef NSIS_FIX_DEFINES_IN_STRINGS
|
#ifdef NSIS_FIX_DEFINES_IN_STRINGS
|
||||||
void ps_addtoline(const TCHAR *str, GrowBuf &linedata, StringList &hist, bool bIgnoreDefines = false);
|
void ps_addtoline(const TCHAR *str, GrowBuf &linedata, StringList &hist, bool bIgnoreDefines = false);
|
||||||
|
|
|
@ -568,7 +568,7 @@ parse_again:
|
||||||
{
|
{
|
||||||
if (p & 1)
|
if (p & 1)
|
||||||
{
|
{
|
||||||
int new_s;
|
bool new_s;
|
||||||
if (tkid == TOK_P_IFNDEF || tkid == TOK_P_IFDEF)
|
if (tkid == TOK_P_IFNDEF || tkid == TOK_P_IFDEF)
|
||||||
new_s=!!definedlist.find(line.gettoken_str(p));
|
new_s=!!definedlist.find(line.gettoken_str(p));
|
||||||
else
|
else
|
||||||
|
@ -877,31 +877,36 @@ int CEXEBuild::includeScript(const TCHAR *f, NStreamEncoding&enc)
|
||||||
return PS_OK;
|
return PS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
// !ifmacro[n]def based on Anders Kjersem's code
|
TCHAR* CEXEBuild::GetMacro(const TCHAR *macroname, TCHAR**macroend /*= 0*/)
|
||||||
int CEXEBuild::MacroExists(const TCHAR *macroname)
|
|
||||||
{
|
{
|
||||||
TCHAR *m = (TCHAR *) m_macros.get();
|
TCHAR *t = (TCHAR*)m_macros.get(), *mbeg, *mbufbeg = t;
|
||||||
|
for (; t && *t; ++t)
|
||||||
while (m && *m)
|
|
||||||
{
|
{
|
||||||
// check if macroname matches
|
mbeg = t;
|
||||||
if (!_tcsicmp(m, macroname))
|
const bool foundit = !_tcsicmp(mbeg, macroname);
|
||||||
return 1;
|
t += _tcslen(t) + 1; // advance over macro name
|
||||||
|
|
||||||
// skip macro name
|
// advance over parameters
|
||||||
m += _tcslen(m) + 1;
|
while (*t) t += _tcslen(t) + 1;
|
||||||
|
t++;
|
||||||
|
|
||||||
// skip params
|
// advance over data
|
||||||
while (*m) m += _tcslen(m) + 1;
|
while (*t) t += _tcslen(t) + 1;
|
||||||
m++;
|
|
||||||
|
|
||||||
// skip data
|
if (foundit)
|
||||||
while (*m) m += _tcslen(m) + 1;
|
{
|
||||||
if (m - (TCHAR *) m_macros.get() >= m_macros.getlen() - 1) break;
|
if (macroend) *macroend = t;
|
||||||
m++;
|
return mbeg;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (t-mbufbeg >= m_macros.getlen()-1) break;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
inline bool CEXEBuild::MacroExists(const TCHAR *macroname)
|
||||||
|
{
|
||||||
|
return !!GetMacro(macroname);
|
||||||
|
}
|
||||||
|
|
||||||
int CEXEBuild::LoadLicenseFile(const TCHAR *file, TCHAR** pdata, const TCHAR *cmdname, WORD AnsiCP) // caller must free *pdata, even on error result
|
int CEXEBuild::LoadLicenseFile(const TCHAR *file, TCHAR** pdata, const TCHAR *cmdname, WORD AnsiCP) // caller must free *pdata, even on error result
|
||||||
{
|
{
|
||||||
|
@ -990,8 +995,8 @@ int CEXEBuild::process_oneline(TCHAR *line, const TCHAR *filename, int linenum)
|
||||||
TCHAR *oldfilename = NULL;
|
TCHAR *oldfilename = NULL;
|
||||||
TCHAR *oldtimestamp = NULL;
|
TCHAR *oldtimestamp = NULL;
|
||||||
TCHAR *oldline = NULL;
|
TCHAR *oldline = NULL;
|
||||||
BOOL is_commandline = !_tcscmp(filename,_T("<command line>"));
|
bool is_commandline = !_tcscmp(filename,_T("<command line>"));
|
||||||
BOOL is_macro = !_tcsncmp(filename,_T("macro:"),_tcslen(_T("macro:")));
|
bool is_macro = !_tcsncmp(filename,_T("macro:"),_tcslen(_T("macro:")));
|
||||||
|
|
||||||
if(!is_commandline) { // Don't set the predefines for command line /X option
|
if(!is_commandline) { // Don't set the predefines for command line /X option
|
||||||
if(!is_macro) {
|
if(!is_macro) {
|
||||||
|
@ -1060,7 +1065,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
|
||||||
_T("HKCR\0HKLM\0HKCU\0HKU\0HKCC\0HKDD\0HKPD\0SHCTX\0"),
|
_T("HKCR\0HKLM\0HKCU\0HKU\0HKCC\0HKDD\0HKPD\0SHCTX\0"),
|
||||||
_T("HKEY_CLASSES_ROOT\0HKEY_LOCAL_MACHINE\0HKEY_CURRENT_USER\0HKEY_USERS\0HKEY_CURRENT_CONFIG\0HKEY_DYN_DATA\0HKEY_PERFORMANCE_DATA\0SHELL_CONTEXT\0")
|
_T("HKEY_CLASSES_ROOT\0HKEY_LOCAL_MACHINE\0HKEY_CURRENT_USER\0HKEY_USERS\0HKEY_CURRENT_CONFIG\0HKEY_DYN_DATA\0HKEY_PERFORMANCE_DATA\0SHELL_CONTEXT\0")
|
||||||
};
|
};
|
||||||
static HKEY rootkey_tab[] = {
|
static const HKEY rootkey_tab[] = {
|
||||||
HKEY_CLASSES_ROOT,HKEY_LOCAL_MACHINE,HKEY_CURRENT_USER,HKEY_USERS,HKEY_CURRENT_CONFIG,HKEY_DYN_DATA,HKEY_PERFORMANCE_DATA,0
|
HKEY_CLASSES_ROOT,HKEY_LOCAL_MACHINE,HKEY_CURRENT_USER,HKEY_USERS,HKEY_CURRENT_CONFIG,HKEY_DYN_DATA,HKEY_PERFORMANCE_DATA,0
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1076,29 +1081,15 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
case TOK_P_MACRO:
|
case TOK_P_MACRO:
|
||||||
{
|
{
|
||||||
if (!line.gettoken_str(1)[0]) PRINTHELP()
|
const TCHAR*const macroname=line.gettoken_str(1);
|
||||||
TCHAR *t=(TCHAR *)m_macros.get();
|
if (!macroname[0]) PRINTHELP()
|
||||||
while (t && *t)
|
TCHAR *t=GetMacro(macroname);
|
||||||
|
if (t)
|
||||||
{
|
{
|
||||||
if (!_tcsicmp(t,line.gettoken_str(1))) break;
|
ERROR_MSG(_T("!macro: macro named \"%s\" already found!\n"),macroname);
|
||||||
t+=_tcslen(t)+1;
|
|
||||||
|
|
||||||
// advance over parameters
|
|
||||||
while (*t) t+=_tcslen(t)+1;
|
|
||||||
t++;
|
|
||||||
|
|
||||||
// advance over data
|
|
||||||
while (*t) t+=_tcslen(t)+1;
|
|
||||||
if (t-(TCHAR *)m_macros.get() >= m_macros.getlen()-1)
|
|
||||||
break;
|
|
||||||
t++;
|
|
||||||
}
|
|
||||||
if (t && *t)
|
|
||||||
{
|
|
||||||
ERROR_MSG(_T("!macro: macro named \"%s\" already found!\n"),line.gettoken_str(1));
|
|
||||||
return PS_ERROR;
|
return PS_ERROR;
|
||||||
}
|
}
|
||||||
m_macros.add(line.gettoken_str(1),(_tcslen(line.gettoken_str(1))+1)*sizeof(TCHAR));
|
m_macros.add(macroname,(_tcslen(macroname)+1)*sizeof(TCHAR));
|
||||||
|
|
||||||
int pc;
|
int pc;
|
||||||
for (pc=2; pc < line.getnumtokens(); pc ++)
|
for (pc=2; pc < line.getnumtokens(); pc ++)
|
||||||
|
@ -1133,7 +1124,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
|
||||||
{
|
{
|
||||||
if (!str[0])
|
if (!str[0])
|
||||||
{
|
{
|
||||||
ERROR_MSG(_T("!macro \"%s\": unterminated (no !macroend found in file)!\n"),line.gettoken_str(1));
|
ERROR_MSG(_T("!macro \"%s\": unterminated (no !macroend found in file)!\n"),macroname);
|
||||||
return PS_ERROR;
|
return PS_ERROR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1175,34 +1166,16 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
|
||||||
return PS_ERROR;
|
return PS_ERROR;
|
||||||
case TOK_P_MACROUNDEF:
|
case TOK_P_MACROUNDEF:
|
||||||
{
|
{
|
||||||
const TCHAR* mname=line.gettoken_str(1);
|
const TCHAR*const mname=line.gettoken_str(1);
|
||||||
if (!mname[0]) PRINTHELP()
|
if (!mname[0]) PRINTHELP()
|
||||||
TCHAR *t=(TCHAR *)m_macros.get(), *mbeg, *mend=0, *mbufb=t;
|
TCHAR *mbeg, *mend;
|
||||||
while (t && *t)
|
mbeg=GetMacro(mname,&mend);
|
||||||
{
|
if (!mbeg)
|
||||||
const bool foundit = !_tcsicmp((mbeg=t),mname);
|
|
||||||
t+=_tcslen(t)+1;
|
|
||||||
|
|
||||||
// advance over parameters
|
|
||||||
while (*t) t+=_tcslen(t)+1;
|
|
||||||
t++;
|
|
||||||
|
|
||||||
// advance over data
|
|
||||||
while (*t) t+=_tcslen(t)+1;
|
|
||||||
if (foundit)
|
|
||||||
{
|
|
||||||
mend=t;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (t-mbufb >= m_macros.getlen()-1)
|
|
||||||
break;
|
|
||||||
t++;
|
|
||||||
}
|
|
||||||
if (!mend)
|
|
||||||
{
|
{
|
||||||
ERROR_MSG(_T("!macroundef: \"%s\" does not exist!\n"),mname);
|
ERROR_MSG(_T("!macroundef: \"%s\" does not exist!\n"),mname);
|
||||||
return PS_ERROR;
|
return PS_ERROR;
|
||||||
}
|
}
|
||||||
|
TCHAR *mbufb=(TCHAR*)m_macros.get();
|
||||||
const unsigned int mcb=mend-mbeg, mbufcb=m_macros.getlen();
|
const unsigned int mcb=mend-mbeg, mbufcb=m_macros.getlen();
|
||||||
memmove(mbeg,mend+1,mbufcb-(mcb+(mbeg-mbufb)));
|
memmove(mbeg,mend+1,mbufcb-(mcb+(mbeg-mbufb)));
|
||||||
m_macros.resize(mbufcb-(mcb+1));
|
m_macros.resize(mbufcb-(mcb+1));
|
||||||
|
@ -1212,37 +1185,21 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
|
||||||
return PS_OK;
|
return PS_OK;
|
||||||
case TOK_P_INSERTMACRO:
|
case TOK_P_INSERTMACRO:
|
||||||
{
|
{
|
||||||
if (!line.gettoken_str(1)[0]) PRINTHELP()
|
const TCHAR*const macroname=line.gettoken_str(1);
|
||||||
TCHAR *t=(TCHAR *)m_macros.get();
|
if (!macroname[0]) PRINTHELP()
|
||||||
TCHAR *m=t;
|
TCHAR *t=GetMacro(macroname), *m=(TCHAR *)m_macros.get();
|
||||||
while (t && *t)
|
SCRIPT_MSG(_T("!insertmacro: %s\n"),macroname);
|
||||||
|
if (!t)
|
||||||
{
|
{
|
||||||
if (!_tcsicmp(t,line.gettoken_str(1))) break;
|
ERROR_MSG(_T("!insertmacro: macro named \"%s\" not found!\n"),macroname);
|
||||||
t+=_tcslen(t)+1;
|
|
||||||
|
|
||||||
// advance over parms
|
|
||||||
while (*t) t+=_tcslen(t)+1;
|
|
||||||
t++;
|
|
||||||
|
|
||||||
// advance over data
|
|
||||||
while (*t) t+=_tcslen(t)+1;
|
|
||||||
if (t-(TCHAR *)m_macros.get() >= m_macros.getlen()-1)
|
|
||||||
break;
|
|
||||||
t++;
|
|
||||||
}
|
|
||||||
SCRIPT_MSG(_T("!insertmacro: %s\n"),line.gettoken_str(1));
|
|
||||||
if (!t || !*t)
|
|
||||||
{
|
|
||||||
ERROR_MSG(_T("!insertmacro: macro named \"%s\" not found!\n"),line.gettoken_str(1));
|
|
||||||
return PS_ERROR;
|
return PS_ERROR;
|
||||||
}
|
}
|
||||||
t+=_tcslen(t)+1;
|
t+=_tcslen(t)+1;
|
||||||
|
|
||||||
|
|
||||||
GrowBuf l_define_names;
|
GrowBuf l_define_names;
|
||||||
DefineList l_define_saves;
|
DefineList l_define_saves;
|
||||||
int npr=0;
|
int npr=0;
|
||||||
// advance over parms
|
// advance over params
|
||||||
while (*t)
|
while (*t)
|
||||||
{
|
{
|
||||||
TCHAR *v=definedlist.find(t);
|
TCHAR *v=definedlist.find(t);
|
||||||
|
@ -1262,22 +1219,22 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
|
||||||
if (npr != line.getnumtokens()-2)
|
if (npr != line.getnumtokens()-2)
|
||||||
{
|
{
|
||||||
ERROR_MSG(_T("!insertmacro: macro \"%s\" requires %d parameter(s), passed %d!\n"),
|
ERROR_MSG(_T("!insertmacro: macro \"%s\" requires %d parameter(s), passed %d!\n"),
|
||||||
line.gettoken_str(1),npr,line.getnumtokens()-2);
|
macroname,npr,line.getnumtokens()-2);
|
||||||
return PS_ERROR;
|
return PS_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
int lp=0;
|
int lp=0;
|
||||||
TCHAR str[1024];
|
TCHAR str[1024];
|
||||||
if (m_macro_entry.find(line.gettoken_str(1),0)>=0)
|
if (m_macro_entry.find(macroname,0)>=0)
|
||||||
{
|
{
|
||||||
ERROR_MSG(_T("!insertmacro: macro \"%s\" already being inserted!\n"),line.gettoken_str(1));
|
ERROR_MSG(_T("!insertmacro: macro \"%s\" already being inserted!\n"),macroname);
|
||||||
return PS_ERROR;
|
return PS_ERROR;
|
||||||
}
|
}
|
||||||
int npos=m_macro_entry.add(line.gettoken_str(1),0);
|
int npos=m_macro_entry.add(macroname,0);
|
||||||
|
|
||||||
wsprintf(str,_T("macro:%s"),line.gettoken_str(1));
|
wsprintf(str,_T("macro:%s"),macroname);
|
||||||
const TCHAR* oldmacroname=m_currentmacroname;
|
const TCHAR* oldmacroname=m_currentmacroname;
|
||||||
m_currentmacroname=line.gettoken_str(1);
|
m_currentmacroname=macroname;
|
||||||
definedlist.del(_T("__MACRO__"));
|
definedlist.del(_T("__MACRO__"));
|
||||||
definedlist.add(_T("__MACRO__"),m_currentmacroname);
|
definedlist.add(_T("__MACRO__"),m_currentmacroname);
|
||||||
while (*t)
|
while (*t)
|
||||||
|
@ -1288,7 +1245,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
|
||||||
int ret=process_oneline(t,str,lp);
|
int ret=process_oneline(t,str,lp);
|
||||||
if (ret != PS_OK)
|
if (ret != PS_OK)
|
||||||
{
|
{
|
||||||
ERROR_MSG(_T("Error in macro %s on macroline %d\n"),line.gettoken_str(1),lp);
|
ERROR_MSG(_T("Error in macro %s on macroline %d\n"),macroname,lp);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1317,7 +1274,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
|
||||||
definedlist.del(_T("__MACRO__"));
|
definedlist.del(_T("__MACRO__"));
|
||||||
m_currentmacroname = oldmacroname;
|
m_currentmacroname = oldmacroname;
|
||||||
if (oldmacroname) definedlist.add(_T("__MACRO__"),oldmacroname);
|
if (oldmacroname) definedlist.add(_T("__MACRO__"),oldmacroname);
|
||||||
SCRIPT_MSG(_T("!insertmacro: end of %s\n"),line.gettoken_str(1));
|
SCRIPT_MSG(_T("!insertmacro: end of %s\n"),macroname);
|
||||||
}
|
}
|
||||||
return PS_OK;
|
return PS_OK;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue