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

View file

@ -175,14 +175,10 @@ class CEXEBuild {
int add_db_data(IMMap *map); // returns offset int add_db_data(IMMap *map); // returns offset
int add_db_data(const char *data, int length); // 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_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 int add_intstring(const int i); // returns offset in stringblock
#ifdef NSIS_SUPPORT_LANG_IN_STRINGS int preprocess_string(char *out, const char *in, WORD codepage=CP_ACP);
int preprocess_string(char *out, const char *in, bool bUninstall);
#else
int preprocess_string(char *out, const char *in);
#endif
int make_sure_not_in_secorfunc(const char *str, int page_ok=0); int make_sure_not_in_secorfunc(const char *str, int page_ok=0);

View file

@ -438,7 +438,7 @@ int CEXEBuild::GenerateLangTables() {
curfilename = fn; curfilename = fn;
linecnt = lt[i].lang_id; 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++; tabsset++;
curfilename = 0; curfilename = 0;
@ -527,7 +527,7 @@ int CEXEBuild::GenerateLangTables() {
curfilename = fn; curfilename = fn;
linecnt = lt[i].lang_id; 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++; tabsset++;
curfilename = 0; curfilename = 0;