Parse LangString using the codepage specified in NLF of the language. This helps avoid warnings about unknown variables with LangStrings that contain dollar signs but are not encoded with the system's current codepage.

git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@3204 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
kichik 2003-11-25 05:55:18 +00:00
parent 778e73aca8
commit b6a98d86c3
3 changed files with 16 additions and 42 deletions

View file

@ -419,7 +419,8 @@ CEXEBuild::CEXEBuild()
int CEXEBuild::getcurdbsize() { return cur_datablock->getlen(); }
int CEXEBuild::add_string(const char *string, int process/*=1*/) // returns offset in stringblock
// returns offset in stringblock
int CEXEBuild::add_string(const char *string, int process/*=1*/, WORD codepage/*=CP_ACP*/)
{
if (!string || !*string) return 0;
@ -442,11 +443,7 @@ int CEXEBuild::add_string(const char *string, int process/*=1*/) // returns offs
if (!process) return cur_strlist->add(string,2);
char buf[4096];
#ifdef NSIS_SUPPORT_LANG_IN_STRINGS
preprocess_string(buf,string,false);
#else
preprocess_string(buf,string);
#endif
preprocess_string(buf,string,codepage);
return cur_strlist->add(buf,2);
}
@ -458,11 +455,7 @@ int CEXEBuild::add_intstring(const int i) // returns offset in stringblock
}
// based on Dave Laundon's code
#ifdef NSIS_SUPPORT_LANG_IN_STRINGS
int CEXEBuild::preprocess_string(char *out, const char *in, bool bUninstall)
#else
int CEXEBuild::preprocess_string(char *out, const char *in)
#endif
int CEXEBuild::preprocess_string(char *out, const char *in, WORD codepage/*=CP_ACP*/)
{
#ifndef NSIS_SUPPORT_NAMED_USERVARS
static const char VarNames[] =
@ -510,7 +503,7 @@ int CEXEBuild::preprocess_string(char *out, const char *in)
const char *p=in;
while (*p)
{
const char *np=CharNext(p);
const char *np=CharNextExA(codepage, p, 0);
if (np-p > 1) // multibyte char
{
@ -602,29 +595,14 @@ int CEXEBuild::preprocess_string(char *out, const char *in)
if (pos)
{
*pos = 0;
if ( !bUninstall )
idx = DefineLangString(cp);
if ( idx < 0 )
{
idx = DefineLangString(cp);
if ( idx < 0 )
{
*out++=(unsigned int)LANG_CODES_START; // Next word is lang-string Identifier
*(WORD*)out=(WORD)idx;
out += sizeof(WORD);
p += strlen(cp)+2;
bProceced = true;
}
}
else
{
idx = DefineLangString(cp);
if ( idx < 0 )
{
*out++=(unsigned int)LANG_CODES_START; // Next word is lang-string Identifier
*(WORD*)out=(WORD)idx;
out += sizeof(WORD);
p += strlen(cp)+2;
bProceced = true;
}
*out++=(unsigned int)LANG_CODES_START; // Next word is lang-string Identifier
*(WORD*)out=(WORD)idx;
out += sizeof(WORD);
p += strlen(cp)+2;
bProceced = true;
}
}
free(cp);

View file

@ -175,14 +175,10 @@ class CEXEBuild {
int add_db_data(IMMap *map); // returns offset
int add_db_data(const char *data, int length); // returns offset
int add_data(const char *data, int length, IGrowBuf *dblock); // returns offset
int add_string(const char *string, int process=1); // returns offset (in string table)
int add_string(const char *string, int process=1, WORD codepage=CP_ACP); // returns offset (in string table)
int add_intstring(const int i); // returns offset in stringblock
#ifdef NSIS_SUPPORT_LANG_IN_STRINGS
int preprocess_string(char *out, const char *in, bool bUninstall);
#else
int preprocess_string(char *out, const char *in);
#endif
int preprocess_string(char *out, const char *in, WORD codepage=CP_ACP);
int make_sure_not_in_secorfunc(const char *str, int page_ok=0);

View file

@ -438,7 +438,7 @@ int CEXEBuild::GenerateLangTables() {
curfilename = fn;
linecnt = lt[i].lang_id;
tab = add_string(str, lang_strings[j].process);
tab = add_string(str, lang_strings[j].process, lt[i].nlf.m_uCodePage);
tabsset++;
curfilename = 0;
@ -527,7 +527,7 @@ int CEXEBuild::GenerateLangTables() {
curfilename = fn;
linecnt = lt[i].lang_id;
tab = add_string(str, lang_strings[j].process);
tab = add_string(str, lang_strings[j].process, lt[i].nlf.m_uCodePage);
tabsset++;
curfilename = 0;