Full multilingual support!

git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@640 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
kichik 2002-08-04 20:25:10 +00:00
parent 7f3ad99e51
commit 058656de50
13 changed files with 341 additions and 219 deletions

View file

@ -1,5 +1,5 @@
!define VER_MAJOR 2 !define VER_MAJOR 2
!define VER_MINOR 0a2 !define VER_MINOR 0a3
!ifdef NO_COMPRESSION !ifdef NO_COMPRESSION
SetCompress off SetCompress off
@ -145,6 +145,14 @@ Section "Extra UIs"
SetOutPath $INSTDIR SetOutPath $INSTDIR
SectionEnd SectionEnd
Section "Extra UIs"
SectionIn 1 2
SetOutPath "$INSTDIR\Contrib\Language files"
SetOverwrite try
File "..\Contrib\Language files\*.nlf"
SetOutPath $INSTDIR
SectionEnd
Section "Splash" Section "Splash"
SectionIn 1 2 SectionIn 1 2
SetOutPath $INSTDIR\Contrib\Splash SetOutPath $INSTDIR\Contrib\Splash

View file

@ -319,6 +319,7 @@ int CEXEBuild::preprocess_string(char *out, const char *in)
"TEMP\0" // 31 "TEMP\0" // 31
"WINDIR\0" // 32 "WINDIR\0" // 32
"SYSDIR\0" // 33 "SYSDIR\0" // 33
"LANGUAGE\0" // 34
; ;
const char *p=in; const char *p=in;

View file

@ -116,8 +116,10 @@ class CEXEBuild {
int SetString(char *string, int id, int process, StringTable *table); int SetString(char *string, int id, int process, StringTable *table);
int WriteStringTables(); int WriteStringTables();
void FillDefaultsIfNeeded(StringTable *table, NLF *nlf=0); void FillDefaultsIfNeeded(StringTable *table, NLF *nlf=0);
#define IsNotSet(s) _IsNotSet(string_tables.size()?&(string_tables[0]->##s):0) #define IsNotSet(s) _IsNotSet(string_tables.size()?&(string_tables[0]->s):0)
bool _IsNotSet(int *str); // Checks if a string is not set in all of the string tables bool _IsNotSet(int *str); // Checks if a string is not set in all of the string tables
#define IsSet(s,lang) _IsSet(string_tables.size()?&(string_tables[0]->s):0,lang)
bool _IsSet(int *str, WORD lang); // Checks if a string is set in a given string table
// a whole bunch O data. // a whole bunch O data.

View file

@ -110,15 +110,15 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,LPSTR lpszCmdParam,
if (*cmdline == '\"') seekchar = *cmdline++; if (*cmdline == '\"') seekchar = *cmdline++;
while (*cmdline && *cmdline != seekchar) if (*cmdline) cmdline++; while (*cmdline && *cmdline != seekchar) cmdline=CharNext(cmdline);
if (*cmdline) cmdline++; if (*cmdline) cmdline=CharNext(cmdline);
realcmds=cmdline; realcmds=cmdline;
do do
{ {
#ifdef NSIS_CONFIG_CRC_SUPPORT #ifdef NSIS_CONFIG_CRC_SUPPORT
#endif//NSIS_CONFIG_CRC_SUPPORT #endif//NSIS_CONFIG_CRC_SUPPORT
while (*cmdline == ' ') if (*cmdline) cmdline++; while (*cmdline == ' ') cmdline=CharNext(cmdline);
if (cmdline[0] != '/') break; if (cmdline[0] != '/') break;
cmdline++; cmdline++;
#if defined(NSIS_CONFIG_VISIBLE_SUPPORT) && defined(NSIS_CONFIG_SILENT_SUPPORT) #if defined(NSIS_CONFIG_VISIBLE_SUPPORT) && defined(NSIS_CONFIG_SILENT_SUPPORT)
@ -147,7 +147,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,LPSTR lpszCmdParam,
lstrcpy(state_install_directory,cmdline+2); lstrcpy(state_install_directory,cmdline+2);
cmdline+=lstrlen(cmdline); cmdline+=lstrlen(cmdline);
} }
else while (*cmdline && *cmdline != ' ') if (*cmdline) cmdline++; else while (*cmdline && *cmdline != ' ') cmdline=CharNext(cmdline);
} }
while (*cmdline); while (*cmdline);

View file

@ -42,7 +42,9 @@
installer_strings *install_strings_tables; installer_strings *install_strings_tables;
common_strings *common_strings_tables; common_strings *common_strings_tables;
uninstall_strings *uninstall_strings_tables; uninstall_strings *uninstall_strings_tables;
int current_lang; installer_strings *cur_install_strings_table;
common_strings *cur_common_strings_table;
uninstall_strings *cur_uninstall_strings_table;
int g_quit_flag; // set when Quit has been called (meaning bail out ASAP) int g_quit_flag; // set when Quit has been called (meaning bail out ASAP)
@ -211,7 +213,6 @@ static void CheckTreeItem(HWND hWnd, TV_ITEM *pItem, int checked) {
int ui_doinstall(void) int ui_doinstall(void)
{ {
int size;
g_autoclose=g_inst_cmnheader->misc_flags&1; g_autoclose=g_inst_cmnheader->misc_flags&1;
#ifdef NSIS_CONFIG_UNINSTALL_SUPPORT #ifdef NSIS_CONFIG_UNINSTALL_SUPPORT
if (!g_is_uninstaller) if (!g_is_uninstaller)
@ -234,9 +235,9 @@ int ui_doinstall(void)
char *e; char *e;
if (p[0]=='\"') if (p[0]=='\"')
{ {
char *p2=*p?p+1:p; char *p2=CharNext(p);
p=p2; p=p2;
while (*p2 && *p2 != '\"') if (*p2) p2++; while (*p2 && *p2 != '\"') p2=CharNext(p2);
*p2=0; *p2=0;
} }
// p is the path now, check for .exe extension // p is the path now, check for .exe extension
@ -266,22 +267,6 @@ int ui_doinstall(void)
process_string_fromtab(state_install_directory,g_inst_header->install_directory_ptr); process_string_fromtab(state_install_directory,g_inst_header->install_directory_ptr);
} }
// Added by Amir Szekely 3rd August 2002
// Multilingual support
size=g_inst_header->common.str_tables_num*sizeof(common_strings);
common_strings_tables=(common_strings*)GlobalAlloc(GPTR,size);
GetCompressedDataFromDataBlockToMemory(g_inst_header->common.str_tables,(char*)common_strings_tables,size);
if (!g_is_uninstaller) {
size=g_inst_header->str_tables_num*sizeof(installer_strings);
install_strings_tables=(installer_strings*)GlobalAlloc(GPTR,size);
GetCompressedDataFromDataBlockToMemory(g_inst_header->str_tables,(char*)install_strings_tables,size);
}
else {
size=g_inst_header->str_tables_num*sizeof(uninstall_strings);
uninstall_strings_tables=(uninstall_strings*)GlobalAlloc(GPTR,size);
GetCompressedDataFromDataBlockToMemory(g_inst_header->str_tables,(char*)uninstall_strings_tables,size);
}
#ifdef NSIS_CONFIG_LOG #ifdef NSIS_CONFIG_LOG
if (g_inst_cmnheader->silent_install==2) if (g_inst_cmnheader->silent_install==2)
{ {
@ -291,6 +276,33 @@ int ui_doinstall(void)
#endif #endif
} }
{
// Added by Amir Szekely 3rd August 2002
// Multilingual support
LANGID user_lang=GetUserDefaultLangID();
int size=g_inst_header->common.str_tables_num*sizeof(common_strings);
cur_common_strings_table=common_strings_tables=(common_strings*)GlobalAlloc(GPTR,size);
GetCompressedDataFromDataBlockToMemory(g_inst_header->common.str_tables,(char*)common_strings_tables,size);
if (!g_is_uninstaller) {
size=g_inst_header->str_tables_num*sizeof(installer_strings);
cur_install_strings_table=install_strings_tables=(installer_strings*)GlobalAlloc(GPTR,size);
GetCompressedDataFromDataBlockToMemory(g_inst_header->str_tables,(char*)install_strings_tables,size);
}
else {
size=g_inst_header->str_tables_num*sizeof(uninstall_strings);
cur_uninstall_strings_table=uninstall_strings_tables=(uninstall_strings*)GlobalAlloc(GPTR,size);
GetCompressedDataFromDataBlockToMemory(g_inst_header->str_tables,(char*)uninstall_strings_tables,size);
}
for (size=0; size<g_inst_header->str_tables_num; size++) {
if (user_lang == common_strings_tables[size].lang_id) {
cur_install_strings_table = &install_strings_tables[size];
cur_common_strings_table = &common_strings_tables[size];
cur_uninstall_strings_table = &uninstall_strings_tables[size];
break;
}
}
}
process_string_fromtab(g_caption,COMMON_STR(caption)); process_string_fromtab(g_caption,COMMON_STR(caption));
#ifdef NSIS_CONFIG_VISIBLE_SUPPORT #ifdef NSIS_CONFIG_VISIBLE_SUPPORT

View file

@ -15,12 +15,6 @@
HWND g_SectionHack; HWND g_SectionHack;
#endif #endif
// Added by Amir Szekely 3rd August 2002
extern installer_strings *install_strings_tables;
extern common_strings *common_strings_tables;
extern uninstall_strings *uninstall_strings_tables;
extern int current_lang;
#ifdef NSIS_SUPPORT_STACK #ifdef NSIS_SUPPORT_STACK
typedef struct _stack_t { typedef struct _stack_t {
struct _stack_t *next; struct _stack_t *next;
@ -399,7 +393,7 @@ static int ExecuteEntry(entry *entries, int pos)
lstrcpy(buf3,g_usrvars[0]);//save $0 lstrcpy(buf3,g_usrvars[0]);//save $0
lstrcpy(g_usrvars[0],buf); lstrcpy(g_usrvars[0],buf);
process_string(buf2,LANG_FILEERR); process_string_fromtab(buf2,COMMON_STR(fileerrtext));
lstrcpy(g_usrvars[0],buf3); // restore $0 lstrcpy(g_usrvars[0],buf3); // restore $0
switch (MessageBox(g_hwnd,buf2,g_caption,MB_ABORTRETRYIGNORE|MB_ICONSTOP)) switch (MessageBox(g_hwnd,buf2,g_caption,MB_ABORTRETRYIGNORE|MB_ICONSTOP))
@ -1344,6 +1338,7 @@ static int ExecuteEntry(entry *entries, int pos)
case EW_LOG: case EW_LOG:
if (parms[0]) if (parms[0])
{ {
if (!g_log_file && parms[1]) build_g_logfile();
log_printf2("settings logging to %d",parms[1]); log_printf2("settings logging to %d",parms[1]);
log_dolog=parms[1]; log_dolog=parms[1];
log_printf2("logging set to %d",parms[1]); log_printf2("logging set to %d",parms[1]);

View file

@ -400,7 +400,7 @@ int GetCompressedDataFromDataBlock(int offset, HANDLE hFileOut);
int GetCompressedDataFromDataBlockToMemory(int offset, char *out, int out_len); int GetCompressedDataFromDataBlockToMemory(int offset, char *out, int out_len);
// $0..$9, $INSTDIR, etc are encoded as ASCII bytes starting from this value. // $0..$9, $INSTDIR, etc are encoded as ASCII bytes starting from this value.
#define VAR_CODES_START (256 - 35) #define VAR_CODES_START (256 - 36)
#endif //_FILEFORM_H_ #endif //_FILEFORM_H_

View file

@ -27,7 +27,7 @@
// Please note that all of these define the offset not the string itself. // Please note that all of these define the offset not the string itself.
// To get the string it self use process_string_fromtab or GetStringFromStringTab. // To get the string it self use process_string_fromtab or GetStringFromStringTab.
#define INSTALL_STR(x) (install_strings_tables[current_lang].x) #define INSTALL_STR(x) (cur_install_strings_table->x)
// Installer specific strings // Installer specific strings
#define LANG_BTN_BACK GetStringFromStringTab(INSTALL_STR(backbutton)) #define LANG_BTN_BACK GetStringFromStringTab(INSTALL_STR(backbutton))
@ -45,14 +45,14 @@
#define LANG_LICENSE_DATA GetStringFromStringTab(INSTALL_STR(licensedata)) #define LANG_LICENSE_DATA GetStringFromStringTab(INSTALL_STR(licensedata))
#define LANG_BTN_LICENSE GetStringFromStringTab(INSTALL_STR(licensebutton)) #define LANG_BTN_LICENSE GetStringFromStringTab(INSTALL_STR(licensebutton))
#define UNINSTALL_STR(x) (uninstall_strings_tables[current_lang].x) #define UNINSTALL_STR(x) (cur_uninstall_strings_table->x)
// Uninstall specific strings // Uninstall specific strings
#define LANG_BTN_UNINST GetStringFromStringTab(UNINSTALL_STR(uninstbutton)) #define LANG_BTN_UNINST GetStringFromStringTab(UNINSTALL_STR(uninstbutton))
#define LANG_UNINST_TEXT GetStringFromStringTab(UNINSTALL_STR(uninstalltext)) #define LANG_UNINST_TEXT GetStringFromStringTab(UNINSTALL_STR(uninstalltext))
#define LANG_UNINST_SUBTEXT GetStringFromStringTab(UNINSTALL_STR(uninstalltext2)) #define LANG_UNINST_SUBTEXT GetStringFromStringTab(UNINSTALL_STR(uninstalltext2))
#define COMMON_STR(x) (common_strings_tables[current_lang].x) #define COMMON_STR(x) (cur_common_strings_table->x)
// Common strings // Common strings
#define LANG_BRANDING GetStringFromStringTab(COMMON_STR(branding)) #define LANG_BRANDING GetStringFromStringTab(COMMON_STR(branding))

View file

@ -1,6 +1,11 @@
#ifndef _UI_H_ #ifndef _UI_H_
#define _UI_H_ #define _UI_H_
// Added by Amir Szekely 3rd August 2002
extern installer_strings *cur_install_strings_table;
extern common_strings *cur_common_strings_table;
extern uninstall_strings *cur_uninstall_strings_table;
int ui_doinstall(void); int ui_doinstall(void);
void update_status_text(const char *text1, const char *text2); void update_status_text(const char *text1, const char *text2);
extern int ui_st_updateflag; extern int ui_st_updateflag;

View file

@ -61,7 +61,7 @@ char *scanendslash(const char *str)
int validpathspec(char *ubuf) int validpathspec(char *ubuf)
{ {
return ((ubuf[0]=='\\' && ubuf[1]=='\\') || (ubuf[0] && *(ubuf+1)==':')); return ((ubuf[0]=='\\' && ubuf[1]=='\\') || (ubuf[0] && *CharNext(ubuf)==':'));
} }
int is_valid_instpath(char *s) int is_valid_instpath(char *s)
@ -75,7 +75,7 @@ int is_valid_instpath(char *s)
while (*s) while (*s)
{ {
if (*s == '\\') ivp++; if (*s == '\\') ivp++;
if (*s) s++; s=CharNext(s);
} }
ivp/=5-req; ivp/=5-req;
} }
@ -83,13 +83,13 @@ int is_valid_instpath(char *s)
{ {
if (*s) if (*s)
{ {
if (*s) s++; s=CharNext(s);
if (*s == ':') if (*s == ':')
{ {
if (*s) s++; s=CharNext(s);
if (*s == '\\') if (*s == '\\')
{ {
if (*s) s++; s=CharNext(s);
if (req || (*s && *s != '\\')) ivp++; if (req || (*s && *s != '\\')) ivp++;
} }
} }
@ -237,24 +237,24 @@ void recursive_create_directory(char *directory)
char *tp; char *tp;
char *p; char *p;
p=directory; p=directory;
while (*p == ' ') if (*p) p++; while (*p == ' ') p=CharNext(p);
if (!*p) return; if (!*p) return;
tp=*p?p+1:p; tp=CharNext(p);
if (*tp == ':' && tp[1] == '\\') p=tp+2; if (*tp == ':' && tp[1] == '\\') p=tp+2;
else if (p[0] == '\\' && p[1] == '\\') else if (p[0] == '\\' && p[1] == '\\')
{ {
int x; int x;
for (x = 0; x < 2; x ++) for (x = 0; x < 2; x ++)
{ {
while (*p != '\\' && *p) if (*p) p++; // skip host then share while (*p != '\\' && *p) p=CharNext(p); // skip host then share
if (*p) if (*p) p++; if (*p) p=CharNext(p);
} }
} }
else return; else return;
while (*p) while (*p)
{ {
while (*p != '\\' && *p) if (*p) p++; while (*p != '\\' && *p) CharNext(p);
if (!*p) CreateDirectory(directory,NULL); if (!*p) CreateDirectory(directory,NULL);
else else
{ {
@ -452,15 +452,19 @@ void process_string(char *out, const char *in)
GetSystemDirectory(out, NSIS_MAX_STRLEN); GetSystemDirectory(out, NSIS_MAX_STRLEN);
break; break;
#if VAR_CODES_START + 33 >= 255 case VAR_CODES_START + 34: // LANGUAGE
wsprintf(out, "%u", cur_common_strings_table->lang_id);
break;
#if VAR_CODES_START + 34 >= 255
#error "Too many variables! Extend VAR_CODES_START!" #error "Too many variables! Extend VAR_CODES_START!"
#endif #endif
} // switch } // switch
// remove trailing slash // remove trailing slash
while (*out && *(out+1)) out++; while (*out && *CharNext(out)) out++;
if (nVarIdx > 21+VAR_CODES_START && *out == '\\') // only if not $0 to $R9, $CMDLINE, or $HWNDPARENT if (nVarIdx > 21+VAR_CODES_START && *out == '\\') // only if not $0 to $R9, $CMDLINE, or $HWNDPARENT
*out = 0; *out = 0;
if (*out) out++; out=CharNext(out);
} // >= VAR_CODES_START } // >= VAR_CODES_START
} // while } // while
*out = 0; *out = 0;

View file

@ -67,7 +67,8 @@ extern char *english_strings[] = {
}; };
int CEXEBuild::SetString(char *string, int id, int process, WORD lang/*=0*/) { int CEXEBuild::SetString(char *string, int id, int process, WORD lang/*=0*/) {
if (!lang) lang = build_nlfs.size()?build_nlfs[0]->GetLang():1033; // Default is English (1033) lang = lang?lang:build_nlfs.size()?build_nlfs[build_nlfs.size()-1]->GetLang():0;
lang = lang?lang:string_tables.size()?string_tables[0]->lang_id:1033; // Default is English (1033)
StringTable *table = 0; StringTable *table = 0;
for (int i = 0; i < string_tables.size(); i++) { for (int i = 0; i < string_tables.size(); i++) {
if (lang == string_tables[i]->lang_id) { if (lang == string_tables[i]->lang_id) {
@ -92,9 +93,15 @@ int CEXEBuild::SetString(char *string, int id, int process, WORD lang/*=0*/) {
int CEXEBuild::SetString(char *string, int id, int process, StringTable *table) { int CEXEBuild::SetString(char *string, int id, int process, StringTable *table) {
int *str = 0; int *str = 0;
int *ustr = 0; int *ustr = 0;
#ifdef NSIS_CONFIG_UNINSTALL_SUPPORT
#define HANDLE_STRING_C(id,strname) case id: str=&(table->strname); ustr=&(table->u##strname); break; #define HANDLE_STRING_C(id,strname) case id: str=&(table->strname); ustr=&(table->u##strname); break;
#else
#define HANDLE_STRING_C(id,strname) HANDLE_STRING_I(id,strname)
#endif
#define HANDLE_STRING_I(id,strname) case id: str=&(table->strname); break; #define HANDLE_STRING_I(id,strname) case id: str=&(table->strname); break;
#ifdef NSIS_CONFIG_UNINSTALL_SUPPORT
#define HANDLE_STRING_U(id,strname) case id: ustr=&(table->strname); break; #define HANDLE_STRING_U(id,strname) case id: ustr=&(table->strname); break;
#endif
switch (id) { switch (id) {
HANDLE_STRING_C(NLF_BRANDING, common.branding); HANDLE_STRING_C(NLF_BRANDING, common.branding);
HANDLE_STRING_C(NLF_BTN_CANCEL, common.cancelbutton); HANDLE_STRING_C(NLF_BTN_CANCEL, common.cancelbutton);
@ -149,90 +156,80 @@ int CEXEBuild::SetString(char *string, int id, int process, StringTable *table)
return PS_OK; return PS_OK;
} }
int CEXEBuild::WriteStringTables() { bool CEXEBuild::_IsSet(int *str, WORD lang) {
StringTable *table = 0; if (!str) return false;
lang = lang?lang:build_nlfs.size()?build_nlfs[build_nlfs.size()-1]->GetLang():0;
lang = lang?lang:string_tables.size()?string_tables[0]->lang_id:1033; // Default is English (1033)
int i; int i;
// Set strings that are unsetable from the script and make sure each NLF has a string table for (i = 0; i < string_tables.size(); i++) {
for (i = 0; i < build_nlfs.size(); i++) { if (lang == string_tables[i]->lang_id) {
table = 0; break;
for (int j = 0; j < string_tables.size(); j++) {
if (build_nlfs[i]->GetLang() == string_tables[j]->lang_id) {
table = string_tables[j];
break;
}
} }
if (!table) {
table = (StringTable*)malloc(sizeof(StringTable));
if (!table) {
ERROR_MSG("Internal compiler error #12345: malloc(%d) failed\n",sizeof(StringTable));
return PS_ERROR;
}
memset(table, -1, sizeof(StringTable));
table->lang_id=table->ucommon.lang_id=table->installer.lang_id=table->uninstall.lang_id=build_nlfs[i]->GetLang();
string_tables.push_back(table);
}
// Now that we have a table, fill it!
FillDefaultsIfNeeded(table, build_nlfs[i]);
} }
if (i == string_tables.size()) return false;
if (*(int*)(int(str)-int(string_tables[0])+int(string_tables[i]))>=0) return true;
return false;
}
if (!build_nlfs.size()) { int CEXEBuild::WriteStringTables() {
if (string_tables.size() == 0) { int i;
build_header.str_tables_num = 1;
table = (StringTable*)malloc(sizeof(StringTable));
if (!table) {
ERROR_MSG("Internal compiler error #12345: malloc(%d) failed\n",sizeof(StringTable));
return PS_ERROR;
}
memset(table, -1, sizeof(StringTable));
table->lang_id=table->ucommon.lang_id=table->installer.lang_id=table->uninstall.lang_id=1033;
string_tables.push_back(table);
// Now that we have a table, fill it!
}
else table = string_tables[0];
FillDefaultsIfNeeded(table);
}
// If no NLFs and no user set strings, use defaults only // If we have no tables (user didn't set any string and didn't load any NLF) create the default one
if (string_tables.size() == 0) { if (string_tables.size() == 0) {
build_header.str_tables_num = 1; build_header.str_tables_num = 1;
table = (StringTable*)malloc(sizeof(StringTable)); StringTable *table = (StringTable*)malloc(sizeof(StringTable));
if (!table) { if (!table) {
ERROR_MSG("Internal compiler error #12345: malloc(%d) failed\n",sizeof(StringTable)); ERROR_MSG("Internal compiler error #12345: malloc(%d) failed\n",sizeof(StringTable));
return PS_ERROR; return PS_ERROR;
} }
memset(table, -1, sizeof(StringTable)); memset(table, -1, sizeof(StringTable));
table->lang_id=table->ucommon.lang_id=table->installer.lang_id=table->uninstall.lang_id=1033; // Default is English table->lang_id=table->ucommon.lang_id=table->installer.lang_id=table->uninstall.lang_id=1033; // English
string_tables.push_back(table); string_tables.push_back(table);
// Now that we have a table, fill it!
FillDefaultsIfNeeded(table);
} }
// Fill tables with defaults (if needed) and with instruction strings
int st_num = string_tables.size();
for (i = 0; i < st_num; i++)
FillDefaultsIfNeeded(string_tables[i]);
// Add string tables into datablock // Add string tables into datablock
GrowBuf ist;
for (i = 0; i < st_num; i++)
ist.add(&string_tables[i]->installer, sizeof(installer_strings));
build_header.str_tables_num = st_num;
build_header.str_tables = add_data((char*)ist.get(), st_num*sizeof(installer_strings), &build_datablock);
build_header.str_tables_num = string_tables.size(); GrowBuf cst;
build_header.str_tables = add_data((char*)&string_tables[0]->installer, sizeof(installer_strings), &build_datablock); for (i = 0; i < st_num; i++)
for (i = 1; i < string_tables.size(); i++) cst.add(&string_tables[i]->common, sizeof(common_strings));
add_data((char*)&string_tables[i]->installer, sizeof(installer_strings), &build_datablock); build_header.common.str_tables_num = st_num;
build_header.common.str_tables = add_data((char*)cst.get(), st_num*sizeof(common_strings), &build_datablock);
build_header.common.str_tables_num = string_tables.size(); GrowBuf ust;
build_header.common.str_tables = add_data((char*)&string_tables[0]->common, sizeof(common_strings), &build_datablock); for (i = 0; i < st_num; i++)
for (i = 1; i < string_tables.size(); i++) ust.add(&string_tables[i]->uninstall, sizeof(uninstall_strings));
add_data((char*)&string_tables[i]->common, sizeof(common_strings), &build_datablock); build_uninst.str_tables_num = st_num;
build_uninst.str_tables = add_data((char*)ust.get(), st_num*sizeof(uninstall_strings), &ubuild_datablock);
build_uninst.str_tables_num = string_tables.size(); GrowBuf ucst;
build_uninst.str_tables = add_data((char*)&string_tables[0]->uninstall, sizeof(uninstall_strings), &ubuild_datablock); for (i = 0; i < st_num; i++)
for (i = 1; i < string_tables.size(); i++) ucst.add(&string_tables[i]->ucommon, sizeof(common_strings));
add_data((char*)&string_tables[i]->uninstall, sizeof(uninstall_strings), &ubuild_datablock); build_uninst.common.str_tables_num = st_num;
build_uninst.common.str_tables = add_data((char*)ucst.get(), st_num*sizeof(common_strings), &ubuild_datablock);
build_uninst.common.str_tables_num = string_tables.size();
build_uninst.common.str_tables = add_data((char*)&string_tables[0]->ucommon, sizeof(common_strings), &ubuild_datablock);
for (i = 1; i < string_tables.size(); i++)
add_data((char*)&string_tables[i]->ucommon, sizeof(common_strings), &ubuild_datablock);
return PS_OK; return PS_OK;
} }
void CEXEBuild::FillDefaultsIfNeeded(StringTable *table, NLF *nlf/*=0*/) { void CEXEBuild::FillDefaultsIfNeeded(StringTable *table, NLF *nlf/*=0*/) {
if (!nlf) {
for (int i = 0; i < build_nlfs.size(); i++) {
if (build_nlfs[i]->GetLang() == table->lang_id) {
nlf = build_nlfs[i];
break;
}
}
}
#define str(id) (nlf?nlf->GetString(id):english_strings[id]) #define str(id) (nlf?nlf->GetString(id):english_strings[id])
#ifdef NSIS_CONFIG_COMPONENTPAGE #ifdef NSIS_CONFIG_COMPONENTPAGE
@ -250,7 +247,7 @@ void CEXEBuild::FillDefaultsIfNeeded(StringTable *table, NLF *nlf/*=0*/) {
{ {
if (table->installer.custom<0) table->installer.custom=add_string_main(str(NLF_COMP_CUSTOM),0); if (table->installer.custom<0) table->installer.custom=add_string_main(str(NLF_COMP_CUSTOM),0);
if (table->common.subcaptions[1]<0) if (table->common.subcaptions[1]<0)
table->common.subcaptions[1]=add_string_main(str(NLF_SUBCAPTION_OPTIONS),0); table->common.subcaptions[1]=add_string_main(str(NLF_SUBCAPTION_OPTIONS));
if (build_header.install_types_ptr[0] < 0) if (build_header.install_types_ptr[0] < 0)
{ {
@ -290,7 +287,7 @@ void CEXEBuild::FillDefaultsIfNeeded(StringTable *table, NLF *nlf/*=0*/) {
if (table->installer.licensedata>=0) if (table->installer.licensedata>=0)
{ {
if (table->common.subcaptions[0]<0) if (table->common.subcaptions[0]<0)
table->common.subcaptions[0]=add_string_main(str(NLF_SUBCAPTION_LICENSE),0); table->common.subcaptions[0]=add_string_main(str(NLF_SUBCAPTION_LICENSE));
if (table->installer.licensebutton<0) if (table->installer.licensebutton<0)
table->installer.licensebutton=add_string_main(str(NLF_BTN_LICENSE),0); table->installer.licensebutton=add_string_main(str(NLF_BTN_LICENSE),0);
} }
@ -305,7 +302,7 @@ void CEXEBuild::FillDefaultsIfNeeded(StringTable *table, NLF *nlf/*=0*/) {
table->installer.dirsubtext=add_string_main(buf,0); table->installer.dirsubtext=add_string_main(buf,0);
} }
if (table->common.subcaptions[2]<0) if (table->common.subcaptions[2]<0)
table->common.subcaptions[2]=add_string_main(str(NLF_SUBCAPTION_DIR),0); table->common.subcaptions[2]=add_string_main(str(NLF_SUBCAPTION_DIR));
if (table->installer.browse<0) table->installer.browse=add_string_main(str(NLF_BTN_BROWSE),0); if (table->installer.browse<0) table->installer.browse=add_string_main(str(NLF_BTN_BROWSE),0);
if (table->installer.spaceavailable<0 && !no_space_texts) table->installer.spaceavailable=add_string_main(str(NLF_SPACE_REQ),0); if (table->installer.spaceavailable<0 && !no_space_texts) table->installer.spaceavailable=add_string_main(str(NLF_SPACE_REQ),0);
} }
@ -324,9 +321,9 @@ void CEXEBuild::FillDefaultsIfNeeded(StringTable *table, NLF *nlf/*=0*/) {
} }
if (table->common.subcaptions[3]<0) if (table->common.subcaptions[3]<0)
table->common.subcaptions[3]=add_string_main(str(NLF_SUBCAPTION_INSTFILES),0); table->common.subcaptions[3]=add_string_main(str(NLF_SUBCAPTION_INSTFILES));
if (table->common.subcaptions[4]<0) if (table->common.subcaptions[4]<0)
table->common.subcaptions[4]=add_string_main(str(NLF_USUBCAPTION_COMPLETED),0); table->common.subcaptions[4]=add_string_main(str(NLF_USUBCAPTION_COMPLETED));
if (table->common.branding<0) if (table->common.branding<0)
{ {
@ -354,16 +351,16 @@ void CEXEBuild::FillDefaultsIfNeeded(StringTable *table, NLF *nlf/*=0*/) {
if (table->uninstall.uninstalltext2<0) if (table->uninstall.uninstalltext2<0)
table->uninstall.uninstalltext2=add_string_uninst(str(NLF_UNINST_SUBTEXT),0); table->uninstall.uninstalltext2=add_string_uninst(str(NLF_UNINST_SUBTEXT),0);
if (table->ucommon.subcaptions[0]<0) if (table->ucommon.subcaptions[0]<0)
table->ucommon.subcaptions[0]=add_string_uninst(str(NLF_USUBCAPTION_CONFIRM),0); table->ucommon.subcaptions[0]=add_string_uninst(str(NLF_USUBCAPTION_CONFIRM));
if (table->ucommon.subcaptions[1]<0) if (table->ucommon.subcaptions[1]<0)
table->ucommon.subcaptions[1]=add_string_uninst(str(NLF_USUBCAPTION_INSTFILES),0); table->ucommon.subcaptions[1]=add_string_uninst(str(NLF_USUBCAPTION_INSTFILES));
if (table->ucommon.subcaptions[2]<0) if (table->ucommon.subcaptions[2]<0)
table->ucommon.subcaptions[2]=add_string_uninst(str(NLF_USUBCAPTION_COMPLETED),0); table->ucommon.subcaptions[2]=add_string_uninst(str(NLF_USUBCAPTION_COMPLETED));
if (table->ucommon.caption < 0) if (table->ucommon.caption < 0)
{ {
char buf[1024]; char buf[1024];
wsprintf(buf,str(NLF_UCAPTION),ubuild_strlist.get()+table->ucommon.name); wsprintf(buf,str(NLF_UCAPTION),ubuild_strlist.get()+table->ucommon.name);
table->ucommon.caption=add_string_uninst(buf,0); table->ucommon.caption=add_string_uninst(buf);
} }
table->ucommon.branding=add_string_uninst(build_strlist.get() + table->common.branding,0); table->ucommon.branding=add_string_uninst(build_strlist.get() + table->common.branding,0);
table->ucommon.cancelbutton=add_string_uninst(build_strlist.get() + table->common.cancelbutton,0); table->ucommon.cancelbutton=add_string_uninst(build_strlist.get() + table->common.cancelbutton,0);
@ -388,7 +385,7 @@ void CEXEBuild::FillDefaultsIfNeeded(StringTable *table, NLF *nlf/*=0*/) {
{ {
char buf[1024]; char buf[1024];
wsprintf(buf,str(NLF_CAPTION),build_strlist.get()+table->common.name); wsprintf(buf,str(NLF_CAPTION),build_strlist.get()+table->common.name);
table->common.caption=add_string_main(buf,0); table->common.caption=add_string_main(buf);
} }
#define SET_INSTRUCTION(id,s) table->common.s=add_string_main(str(id),0);table->ucommon.s=add_string_uninst(str(id),0) #define SET_INSTRUCTION(id,s) table->common.s=add_string_main(str(id),0);table->ucommon.s=add_string_uninst(str(id),0)
@ -448,7 +445,7 @@ void CEXEBuild::FillDefaultsIfNeeded(StringTable *table, NLF *nlf/*=0*/) {
bool CEXEBuild::_IsNotSet(int *str) { bool CEXEBuild::_IsNotSet(int *str) {
if (!str) return true; if (!str) return true;
for (int i = 0; i < string_tables.size(); i++) { for (int i = 0; i < string_tables.size(); i++) {
if (*(int*)((char*)str+sizeof(StringTable)*i) >= 0) { if (*(int*)(int(str)-int(string_tables[0])+int(string_tables[i])) >= 0) {
return false; return false;
} }
} }

View file

@ -517,20 +517,28 @@ int CEXEBuild::doCommand(int which_token, LineParser &line, FILE *fp, const char
// header flags // header flags
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
case TOK_NAME: case TOK_NAME:
if (!IsNotSet(common.name))
{ {
warning("Name: specified multiple times, wasting space (%s:%d)",curfilename,linecnt); int a = 1;
WORD lang = 0;
if (!strnicmp(line.gettoken_str(a),"/LANG=",6)) lang=atoi(line.gettoken_str(a++)+6);
if (line.getnumtokens()!=a+1) PRINTHELP();
if (IsSet(common.name,lang))
warning("%s: specified multiple times, wasting space (%s:%d)",line.gettoken_str(0),curfilename,linecnt);
SetString(line.gettoken_str(a),LANG_NAME,0,lang);
SCRIPT_MSG("Name: \"%s\"\n",line.gettoken_str(a));
} }
SetString(line.gettoken_str(1),LANG_NAME,0);
SCRIPT_MSG("Name: \"%s\"\n",line.gettoken_str(1));
return make_sure_not_in_secorfunc(line.gettoken_str(0)); return make_sure_not_in_secorfunc(line.gettoken_str(0));
case TOK_CAPTION: case TOK_CAPTION:
if (!IsNotSet(common.caption))
{ {
warning("Caption: specified multiple times, wasting space (%s:%d)",curfilename,linecnt); int a = 1;
WORD lang = 0;
if (!strnicmp(line.gettoken_str(a),"/LANG=",6)) lang=atoi(line.gettoken_str(a++)+6);
if (line.getnumtokens()!=a+1) PRINTHELP();
if (IsSet(common.caption,lang))
warning("%s: specified multiple times, wasting space (%s:%d)",line.gettoken_str(0),curfilename,linecnt);
SetString(line.gettoken_str(a),NLF_CAPTION,1,lang);
SCRIPT_MSG("Caption: \"%s\"\n",line.gettoken_str(a));
} }
SetString(line.gettoken_str(1),NLF_CAPTION,1);
SCRIPT_MSG("Caption: \"%s\"\n",line.gettoken_str(1));
return make_sure_not_in_secorfunc(line.gettoken_str(0)); return make_sure_not_in_secorfunc(line.gettoken_str(0));
case TOK_ICON: case TOK_ICON:
SCRIPT_MSG("Icon: \"%s\"\n",line.gettoken_str(1)); SCRIPT_MSG("Icon: \"%s\"\n",line.gettoken_str(1));
@ -575,25 +583,33 @@ int CEXEBuild::doCommand(int which_token, LineParser &line, FILE *fp, const char
return PS_ERROR; return PS_ERROR;
#endif//!NSIS_CONFIG_COMPONENTPAGE #endif//!NSIS_CONFIG_COMPONENTPAGE
case TOK_DIRTEXT: case TOK_DIRTEXT:
if (!IsNotSet(installer.text) && line.gettoken_str(1)[0])
{ {
warning("DirText: specified multiple times, wasting space (%s:%d)",curfilename,linecnt); int a = 1;
WORD lang = 0;
if (!strnicmp(line.gettoken_str(a),"/LANG=",6)) lang=atoi(line.gettoken_str(a++)+6);
if (line.getnumtokens()==a) PRINTHELP();
if (IsSet(installer.text,lang) && line.gettoken_str(a)[0])
warning("%s: specified multiple times, wasting space (%s:%d)",line.gettoken_str(0),curfilename,linecnt);
SetString(line.gettoken_str(a),LANG_DIR_TEXT,0,lang);
if (line.getnumtokens()>a+1) SetString(line.gettoken_str(a+1),NLF_DIR_SUBTEXT,0,lang);
if (line.getnumtokens()>a+2) SetString(line.gettoken_str(a+2),NLF_BTN_BROWSE,0,lang);
SCRIPT_MSG("DirText: \"%s\" \"%s\" \"%s\"\n",line.gettoken_str(a),line.gettoken_str(a+1),line.gettoken_str(a+2));
} }
SetString(line.gettoken_str(1),LANG_DIR_TEXT,0);
if (line.getnumtokens()>2) SetString(line.gettoken_str(2),NLF_DIR_SUBTEXT,0);
if (line.getnumtokens()>3) SetString(line.gettoken_str(3),NLF_BTN_BROWSE,0);
SCRIPT_MSG("DirText: \"%s\" \"%s\" \"%s\"\n",line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3));
return make_sure_not_in_secorfunc(line.gettoken_str(0)); return make_sure_not_in_secorfunc(line.gettoken_str(0));
#ifdef NSIS_CONFIG_COMPONENTPAGE #ifdef NSIS_CONFIG_COMPONENTPAGE
case TOK_COMPTEXT: case TOK_COMPTEXT:
if (!IsNotSet(installer.componenttext) && line.gettoken_str(1)[0])
{ {
warning("ComponentText: specified multiple times, wasting space (%s:%d)",curfilename,linecnt); int a = 1;
WORD lang = 0;
if (!strnicmp(line.gettoken_str(a),"/LANG=",6)) lang=atoi(line.gettoken_str(a++)+6);
if (line.getnumtokens()==a) PRINTHELP();
if (IsSet(installer.componenttext,lang) && line.gettoken_str(a)[0])
warning("%s: specified multiple times, wasting space (%s:%d)",line.gettoken_str(0),curfilename,linecnt);
SetString(line.gettoken_str(a),LANG_COMP_TEXT,0,lang);
if (line.getnumtokens()>a+1) SetString(line.gettoken_str(a+1),NLF_COMP_SUBTEXT1,0,lang);
if (line.getnumtokens()>a+2) SetString(line.gettoken_str(a+2),NLF_COMP_SUBTEXT2,0,lang);
SCRIPT_MSG("ComponentText: \"%s\" \"%s\" \"%s\"\n",line.gettoken_str(a),line.gettoken_str(a+1),line.gettoken_str(a+2));
} }
SetString(line.gettoken_str(1),LANG_COMP_TEXT,0);
if (line.getnumtokens()>2) SetString(line.gettoken_str(2),NLF_COMP_SUBTEXT1,0);
if (line.getnumtokens()>3) SetString(line.gettoken_str(3),NLF_COMP_SUBTEXT2,0);
SCRIPT_MSG("ComponentText: \"%s\" \"%s\" \"%s\"\n",line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3));
return make_sure_not_in_secorfunc(line.gettoken_str(0)); return make_sure_not_in_secorfunc(line.gettoken_str(0));
case TOK_INSTTYPE: case TOK_INSTTYPE:
{ {
@ -608,6 +624,13 @@ int CEXEBuild::doCommand(int which_token, LineParser &line, FILE *fp, const char
build_header.no_custom_instmode_flag=2; build_header.no_custom_instmode_flag=2;
SCRIPT_MSG("InstType: making components viewable only on custom install type\n"); SCRIPT_MSG("InstType: making components viewable only on custom install type\n");
} }
else if (!strnicmp(line.gettoken_str(1),"/LANG=",6)) {
if (!strnicmp(line.gettoken_str(2),"/CUSTOMSTRING=",14)) {
SetString(line.gettoken_str(2)+14,NLF_COMP_CUSTOM,0,atoi(line.gettoken_str(1)+6));
SCRIPT_MSG("InstType: setting custom text to: /LANG=%d \"%s\"\n",line.gettoken_str(1)+6,line.gettoken_str(2)+14);
}
else PRINTHELP()
}
else if (!strnicmp(line.gettoken_str(1),"/CUSTOMSTRING=",14)) else if (!strnicmp(line.gettoken_str(1),"/CUSTOMSTRING=",14))
{ {
SetString(line.gettoken_str(1)+14,NLF_COMP_CUSTOM,0); SetString(line.gettoken_str(1)+14,NLF_COMP_CUSTOM,0);
@ -638,19 +661,19 @@ int CEXEBuild::doCommand(int which_token, LineParser &line, FILE *fp, const char
#endif//!NSIS_CONFIG_COMPONENTPAGE #endif//!NSIS_CONFIG_COMPONENTPAGE
#ifdef NSIS_CONFIG_LICENSEPAGE #ifdef NSIS_CONFIG_LICENSEPAGE
case TOK_LICENSETEXT: case TOK_LICENSETEXT:
if (!IsNotSet(installer.licensetext))
{ {
warning("LicenseText: specified multiple times, wasting space (%s:%d)",curfilename,linecnt); int a = 1;
WORD lang = 0;
if (!strnicmp(line.gettoken_str(a),"/LANG=",6)) lang=atoi(line.gettoken_str(a++)+6);
if (line.getnumtokens()==a) PRINTHELP();
if (IsSet(installer.licensetext,lang))
warning("%s: specified multiple times, wasting space (%s:%d)",line.gettoken_str(0),curfilename,linecnt);
SetString(line.gettoken_str(a),LANG_LICENSE_TEXT,0,lang);
if (line.getnumtokens()>a+1) SetString(line.gettoken_str(a+1),NLF_BTN_LICENSE,0,lang);
SCRIPT_MSG("LicenseText: \"%s\" \"%s\"\n",line.gettoken_str(a),line.gettoken_str(a+1));
} }
SetString(line.gettoken_str(1),LANG_LICENSE_TEXT,0);
if (line.getnumtokens()>2) SetString(line.gettoken_str(2),NLF_BTN_LICENSE,0);
SCRIPT_MSG("LicenseText: \"%s\" \"%s\"\n",line.gettoken_str(1),line.gettoken_str(2));
return make_sure_not_in_secorfunc(line.gettoken_str(0)); return make_sure_not_in_secorfunc(line.gettoken_str(0));
case TOK_LICENSEDATA: case TOK_LICENSEDATA:
if (!IsNotSet(installer.licensedata))
{
warning("LicenseData: specified multiple times, wasting space (%s:%d)",curfilename,linecnt);
}
#ifdef NSIS_CONFIG_SILENT_SUPPORT #ifdef NSIS_CONFIG_SILENT_SUPPORT
if (build_header.common.silent_install) if (build_header.common.silent_install)
{ {
@ -658,12 +681,18 @@ int CEXEBuild::doCommand(int which_token, LineParser &line, FILE *fp, const char
} }
#endif #endif
{ {
int a = 1;
WORD lang = 0;
if (!strnicmp(line.gettoken_str(a),"/LANG=",6)) lang=atoi(line.gettoken_str(a++)+6);
if (line.getnumtokens()==a) PRINTHELP();
if (IsSet(installer.licensedata,lang))
warning("%s: specified multiple times, wasting space (%s:%d)",line.gettoken_str(0),curfilename,linecnt);
FILE *fp; FILE *fp;
int datalen; int datalen;
fp=fopen(line.gettoken_str(1),"rb"); fp=fopen(line.gettoken_str(a),"rb");
if (!fp) if (!fp)
{ {
ERROR_MSG("LicenseData: open failed \"%s\"\n",line.gettoken_str(1)); ERROR_MSG("LicenseData: open failed \"%s\"\n",line.gettoken_str(a));
PRINTHELP() PRINTHELP()
} }
fseek(fp,0,SEEK_END); fseek(fp,0,SEEK_END);
@ -677,8 +706,8 @@ int CEXEBuild::doCommand(int which_token, LineParser &line, FILE *fp, const char
} }
fclose(fp); fclose(fp);
data[datalen]=0; data[datalen]=0;
SetString(data,LANG_LICENSE_DATA,0); SetString(data,LANG_LICENSE_DATA,0,lang);
SCRIPT_MSG("LicenseData: \"%s\"\n",line.gettoken_str(1)); SCRIPT_MSG("LicenseData: \"%s\"\n",line.gettoken_str(a));
} }
return make_sure_not_in_secorfunc(line.gettoken_str(0)); return make_sure_not_in_secorfunc(line.gettoken_str(0));
// Added by Amir Szekely 30th July 2002 // Added by Amir Szekely 30th July 2002
@ -849,7 +878,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line, FILE *fp, const char
header_data_new = re.Save((DWORD&)exeheader_size_new); header_data_new = re.Save((DWORD&)exeheader_size_new);
} }
catch (exception& err) { catch (exception& err) {
ERROR_MSG("Error while changing font: %s\n", err.what()); ERROR_MSG("Error removing window icon: %s\n", err.what());
return PS_ERROR; return PS_ERROR;
} }
return make_sure_not_in_secorfunc(line.gettoken_str(0)); return make_sure_not_in_secorfunc(line.gettoken_str(0));
@ -1213,16 +1242,20 @@ int CEXEBuild::doCommand(int which_token, LineParser &line, FILE *fp, const char
{ {
SCRIPT_MSG("LoadLanguageFile: %s\n", line.gettoken_str(1)); SCRIPT_MSG("LoadLanguageFile: %s\n", line.gettoken_str(1));
try { try {
NLF *newLang = new NLF(line.gettoken_str(1)); NLF *newNLF = new NLF(line.gettoken_str(1));
for (int i = 0; i < build_nlfs.size(); i++) for (int i = 0; i < build_nlfs.size(); i++)
if (build_nlfs[i]->GetLang() == newLang->GetLang()) { if (build_nlfs[i]->GetLang() == newNLF->GetLang()) {
ERROR_MSG("Error: Can't add same language twice!\n"); ERROR_MSG("Error: Can't add same language twice!\n");
return PS_ERROR; return PS_ERROR;
} }
build_nlfs.push_back(newLang); build_nlfs.push_back(newNLF);
StringTable *table = (StringTable*)malloc(sizeof(StringTable));
memset(table, -1, sizeof(StringTable));
table->lang_id=table->ucommon.lang_id=table->installer.lang_id=table->uninstall.lang_id=newNLF->GetLang();
string_tables.push_back(table);
} }
catch (exception &err) { catch (exception &err) {
ERROR_MSG("Error while adding language file: %s", err.what()); ERROR_MSG("Error while loading language file: %s\n", err.what());
return PS_ERROR; return PS_ERROR;
} }
} }
@ -1343,12 +1376,16 @@ int CEXEBuild::doCommand(int which_token, LineParser &line, FILE *fp, const char
#ifdef NSIS_CONFIG_UNINSTALL_SUPPORT #ifdef NSIS_CONFIG_UNINSTALL_SUPPORT
case TOK_UNINSTCAPTION: case TOK_UNINSTCAPTION:
if (!IsNotSet(ucommon.caption))
{ {
warning("UninstCaption: specified multiple times, wasting space (%s:%d)",curfilename,linecnt); int a = 1;
WORD lang = 0;
if (!strnicmp(line.gettoken_str(a),"/LANG=",6)) lang=atoi(line.gettoken_str(a++)+6);
if (line.getnumtokens()==a) PRINTHELP();
if (IsSet(ucommon.caption,lang))
warning("%s: specified multiple times, wasting space (%s:%d)",line.gettoken_str(0),curfilename,linecnt);
SetString(line.gettoken_str(a),NLF_UCAPTION,1,lang);
SCRIPT_MSG("UninstCaption: \"%s\"\n",line.gettoken_str(a));
} }
SetString(line.gettoken_str(1),NLF_UCAPTION,1);
SCRIPT_MSG("UninstCaption: \"%s\"\n",line.gettoken_str(1));
return make_sure_not_in_secorfunc(line.gettoken_str(0)); return make_sure_not_in_secorfunc(line.gettoken_str(0));
case TOK_UNINSTICON: case TOK_UNINSTICON:
SCRIPT_MSG("UninstallIcon: \"%s\"\n",line.gettoken_str(1)); SCRIPT_MSG("UninstallIcon: \"%s\"\n",line.gettoken_str(1));
@ -1366,21 +1403,29 @@ int CEXEBuild::doCommand(int which_token, LineParser &line, FILE *fp, const char
} }
return make_sure_not_in_secorfunc(line.gettoken_str(0)); return make_sure_not_in_secorfunc(line.gettoken_str(0));
case TOK_UNINSTTEXT: case TOK_UNINSTTEXT:
if (!IsNotSet(uninstall.uninstalltext))
{ {
warning("UninstallText: specified multiple times, wasting space (%s:%d)",curfilename,linecnt); int a = 1;
WORD lang = 0;
if (!strnicmp(line.gettoken_str(a),"/LANG=",6)) lang=atoi(line.gettoken_str(a++)+6);
if (line.getnumtokens()==a) PRINTHELP();
if (IsSet(uninstall.uninstalltext,lang))
warning("%s: specified multiple times, wasting space (%s:%d)",line.gettoken_str(0),curfilename,linecnt);
SetString(line.gettoken_str(a),LANG_UNINST_TEXT,1,lang);
if (line.getnumtokens()>a+1) SetString(line.gettoken_str(a+1),NLF_UNINST_SUBTEXT,0,lang);
SCRIPT_MSG("UninstallText: \"%s\" \"%s\"\n",line.gettoken_str(a),line.gettoken_str(a+1));
} }
SetString(line.gettoken_str(1),LANG_UNINST_TEXT,0);
if (line.getnumtokens()>2) SetString(line.gettoken_str(2),NLF_UNINST_SUBTEXT,0);
SCRIPT_MSG("UninstallText: \"%s\" \"%s\"\n",line.gettoken_str(1),line.gettoken_str(2));
return make_sure_not_in_secorfunc(line.gettoken_str(0)); return make_sure_not_in_secorfunc(line.gettoken_str(0));
case TOK_UNINSTSUBCAPTION: case TOK_UNINSTSUBCAPTION:
{ {
int a = 1;
WORD lang = 0;
if (!strnicmp(line.gettoken_str(a),"/LANG=",6)) lang=atoi(line.gettoken_str(a++)+6);
if (line.getnumtokens()!=a+2) PRINTHELP();
int s; int s;
int w=line.gettoken_int(1,&s); int w=line.gettoken_int(a,&s);
if (!s || w < 0 || w > 2) PRINTHELP() if (!s || w < 0 || w > 2) PRINTHELP()
SetString(line.gettoken_str(2),NLF_USUBCAPTION_CONFIRM+w,1); SetString(line.gettoken_str(a+1),NLF_USUBCAPTION_CONFIRM+w,1,lang);
SCRIPT_MSG("UninstSubCaption: page:%d, text=%s\n",w,line.gettoken_str(2)); SCRIPT_MSG("UninstSubCaption: page:%d, text=%s\n",w,line.gettoken_str(a+1));
} }
return make_sure_not_in_secorfunc(line.gettoken_str(0)); return make_sure_not_in_secorfunc(line.gettoken_str(0));
case TOK_WRITEUNINSTALLER: case TOK_WRITEUNINSTALLER:
@ -1554,60 +1599,113 @@ int CEXEBuild::doCommand(int which_token, LineParser &line, FILE *fp, const char
return PS_OK; return PS_OK;
case TOK_SUBCAPTION: case TOK_SUBCAPTION:
{ {
int a = 1;
WORD lang = 0;
if (!strnicmp(line.gettoken_str(a),"/LANG=",6)) lang=atoi(line.gettoken_str(a++)+6);
if (line.getnumtokens()!=a+2) PRINTHELP();
int s; int s;
int w=line.gettoken_int(1,&s); int w=line.gettoken_int(a,&s);
if (!s || w < 0 || w > 4) PRINTHELP() if (!s || w < 0 || w > 2) PRINTHELP()
SetString(line.gettoken_str(2),NLF_SUBCAPTION_LICENSE+w,1); SetString(line.gettoken_str(a+1),NLF_SUBCAPTION_LICENSE+w,1,lang);
SCRIPT_MSG("SubCaption: page:%d, text=%s\n",w,line.gettoken_str(2)); SCRIPT_MSG("SubCaption: page:%d, text=%s\n",w,line.gettoken_str(a+1));
} }
return make_sure_not_in_secorfunc(line.gettoken_str(0)); return make_sure_not_in_secorfunc(line.gettoken_str(0));
case TOK_FILEERRORTEXT: case TOK_FILEERRORTEXT:
#ifdef NSIS_SUPPORT_FILE #ifdef NSIS_SUPPORT_FILE
SetString(line.gettoken_str(1),NLF_FILE_ERROR,1); {
SCRIPT_MSG("FileErrorText: \"%s\"\n",line.gettoken_str(1)); int a = 1;
WORD lang = 0;
if (!strnicmp(line.gettoken_str(a),"/LANG=",6)) lang=atoi(line.gettoken_str(a++)+6);
if (line.getnumtokens()!=a+1) PRINTHELP();
SetString(line.gettoken_str(a),NLF_FILE_ERROR,1,lang);
SCRIPT_MSG("FileErrorText: \"%s\"\n",line.gettoken_str(a));
}
return make_sure_not_in_secorfunc(line.gettoken_str(0)); return make_sure_not_in_secorfunc(line.gettoken_str(0));
#else #else
ERROR_MSG("Error: %s specified, NSIS_SUPPORT_FILE not defined.\n", line.gettoken_str(0)); ERROR_MSG("Error: %s specified, NSIS_SUPPORT_FILE not defined.\n", line.gettoken_str(0));
return PS_ERROR; return PS_ERROR;
#endif #endif
case TOK_BRANDINGTEXT: case TOK_BRANDINGTEXT:
SetString(line.gettoken_str(1),NLF_BRANDING,0); {
SCRIPT_MSG("BrandingText: \"%s\"\n",line.gettoken_str(1)); int a = 1;
WORD lang = 0;
if (!strnicmp(line.gettoken_str(a),"/LANG=",6)) lang=atoi(line.gettoken_str(a++)+6);
if (line.getnumtokens()!=a+1) PRINTHELP();
SetString(line.gettoken_str(a),NLF_BRANDING,0,lang);
SCRIPT_MSG("BrandingText: \"%s\"\n",line.gettoken_str(a));
}
return make_sure_not_in_secorfunc(line.gettoken_str(0)); return make_sure_not_in_secorfunc(line.gettoken_str(0));
case TOK_MISCBUTTONTEXT: case TOK_MISCBUTTONTEXT:
SetString(line.gettoken_str(1),NLF_BTN_BACK,0); {
SetString(line.gettoken_str(2),NLF_BTN_NEXT,0); int a = 1;
SetString(line.gettoken_str(3),NLF_BTN_CANCEL,0); WORD lang = 0;
SetString(line.gettoken_str(4),NLF_BTN_CLOSE,0); if (!strnicmp(line.gettoken_str(a),"/LANG=",6)) lang=atoi(line.gettoken_str(a++)+6);
SCRIPT_MSG("MiscButtonText: back=\"%s\" next=\"%s\" cancel=\"%s\" close=\"%s\"\n",line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3),line.gettoken_str(4)); if (line.getnumtokens()==a) PRINTHELP();
SetString(line.gettoken_str(a),NLF_BTN_BACK,0,lang);
SetString(line.gettoken_str(a+1),NLF_BTN_NEXT,0,lang);
SetString(line.gettoken_str(a+2),NLF_BTN_CANCEL,0,lang);
SetString(line.gettoken_str(a+3),NLF_BTN_CLOSE,0,lang);
SCRIPT_MSG("MiscButtonText: back=\"%s\" next=\"%s\" cancel=\"%s\" close=\"%s\"\n",line.gettoken_str(a),line.gettoken_str(a+1),line.gettoken_str(a+2),line.gettoken_str(a+3));
}
return make_sure_not_in_secorfunc(line.gettoken_str(0)); return make_sure_not_in_secorfunc(line.gettoken_str(0));
case TOK_SPACETEXTS: case TOK_SPACETEXTS:
if (!lstrcmp(line.gettoken_str(1), "none")) { {
no_space_texts=true; int a = 1;
SCRIPT_MSG("SpaceTexts: none\n"); WORD lang = 0;
} if (!strnicmp(line.gettoken_str(a),"/LANG=",6)) lang=atoi(line.gettoken_str(a++)+6);
else { if (line.getnumtokens()==a) PRINTHELP();
SetString(line.gettoken_str(1),NLF_SPACE_REQ,0);
SetString(line.gettoken_str(2),NLF_SPACE_AVAIL,0); if (!lstrcmp(line.gettoken_str(a), "none")) {
SCRIPT_MSG("SpaceTexts: required=\"%s\" available=\"%s\"\n",line.gettoken_str(1),line.gettoken_str(2)); no_space_texts=true;
SCRIPT_MSG("SpaceTexts: none\n");
}
else {
SetString(line.gettoken_str(a),NLF_SPACE_REQ,0);
SetString(line.gettoken_str(a+1),NLF_SPACE_AVAIL,0);
SCRIPT_MSG("SpaceTexts: required=\"%s\" available=\"%s\"\n",line.gettoken_str(a),line.gettoken_str(a+1));
}
} }
return make_sure_not_in_secorfunc(line.gettoken_str(0)); return make_sure_not_in_secorfunc(line.gettoken_str(0));
case TOK_INSTBUTTONTEXT: case TOK_INSTBUTTONTEXT:
SetString(line.gettoken_str(1),NLF_BTN_INSTALL,0); {
SCRIPT_MSG("InstallButtonText: \"%s\"\n",line.gettoken_str(1)); int a = 1;
WORD lang = 0;
if (!strnicmp(line.gettoken_str(a),"/LANG=",6)) lang=atoi(line.gettoken_str(a++)+6);
if (line.getnumtokens()==a) PRINTHELP();
SetString(line.gettoken_str(a),NLF_BTN_INSTALL,0,lang);
SCRIPT_MSG("InstallButtonText: \"%s\"\n",line.gettoken_str(a));
}
return make_sure_not_in_secorfunc(line.gettoken_str(0)); return make_sure_not_in_secorfunc(line.gettoken_str(0));
case TOK_DETAILSBUTTONTEXT: case TOK_DETAILSBUTTONTEXT:
SetString(line.gettoken_str(1),NLF_BTN_DETAILS,0); {
SCRIPT_MSG("DetailsButtonText: \"%s\"\n",line.gettoken_str(1)); int a = 1;
WORD lang = 0;
if (!strnicmp(line.gettoken_str(a),"/LANG=",6)) lang=atoi(line.gettoken_str(a++)+6);
if (line.getnumtokens()==a) PRINTHELP();
SetString(line.gettoken_str(a),NLF_BTN_DETAILS,0,lang);
SCRIPT_MSG("DetailsButtonText: \"%s\"\n",line.gettoken_str(a));
}
return make_sure_not_in_secorfunc(line.gettoken_str(0)); return make_sure_not_in_secorfunc(line.gettoken_str(0));
case TOK_COMPLETEDTEXT: case TOK_COMPLETEDTEXT:
SetString(line.gettoken_str(1),NLF_COMPLETED,0); {
SCRIPT_MSG("CompletedText: \"%s\"\n",line.gettoken_str(1)); int a = 1;
WORD lang = 0;
if (!strnicmp(line.gettoken_str(a),"/LANG=",6)) lang=atoi(line.gettoken_str(a++)+6);
if (line.getnumtokens()==a) PRINTHELP();
SetString(line.gettoken_str(a),NLF_COMPLETED,0,lang);
SCRIPT_MSG("CompletedText: \"%s\"\n",line.gettoken_str(a));
}
return make_sure_not_in_secorfunc(line.gettoken_str(0)); return make_sure_not_in_secorfunc(line.gettoken_str(0));
case TOK_UNINSTBUTTONTEXT: case TOK_UNINSTBUTTONTEXT:
#ifdef NSIS_CONFIG_UNINSTALL_SUPPORT #ifdef NSIS_CONFIG_UNINSTALL_SUPPORT
SetString(line.gettoken_str(1),NLF_BTN_UNINSTALL,0); {
SCRIPT_MSG("UninstButtonText: \"%s\"\n",line.gettoken_str(1)); int a = 1;
WORD lang = 0;
if (!strnicmp(line.gettoken_str(a),"/LANG=",6)) lang=atoi(line.gettoken_str(a++)+6);
if (line.getnumtokens()==a) PRINTHELP();
SetString(line.gettoken_str(a),NLF_BTN_UNINSTALL,0,lang);
SCRIPT_MSG("UninstButtonText: \"%s\"\n",line.gettoken_str(a));
}
return make_sure_not_in_secorfunc(line.gettoken_str(0)); return make_sure_not_in_secorfunc(line.gettoken_str(0));
#else #else
ERROR_MSG("Error: %s specified, NSIS_CONFIG_UNINSTALL_SUPPORT not defined.\n", line.gettoken_str(0)); ERROR_MSG("Error: %s specified, NSIS_CONFIG_UNINSTALL_SUPPORT not defined.\n", line.gettoken_str(0));

View file

@ -22,14 +22,14 @@ static tokenType tokenlist[TOK__LAST] =
{TOK_ADDSIZE,"AddSize",1,0,"size_to_add_to_section_in_kb"}, {TOK_ADDSIZE,"AddSize",1,0,"size_to_add_to_section_in_kb"},
{TOK_AUTOCLOSE,"AutoCloseWindow",1,0,"(false|true)"}, {TOK_AUTOCLOSE,"AutoCloseWindow",1,0,"(false|true)"},
{TOK_BGGRADIENT,"BGGradient",0,3,"(off | [top_color [bottom_color [text_color]]])"}, {TOK_BGGRADIENT,"BGGradient",0,3,"(off | [top_color [bottom_color [text_color]]])"},
{TOK_BRANDINGTEXT,"BrandingText",1,0,"installer_text"}, {TOK_BRANDINGTEXT,"BrandingText",1,1,"[/LANG=lang_id] installer_text"},
{TOK_BRINGTOFRONT,"BringToFront",0,0,""}, {TOK_BRINGTOFRONT,"BringToFront",0,0,""},
{TOK_CALL,"Call",1,0,"function_name | [:label_name]"}, {TOK_CALL,"Call",1,0,"function_name | [:label_name]"},
{TOK_CALLINSTDLL,"CallInstDLL",2,0,"dll_path_on_target.dll function"}, {TOK_CALLINSTDLL,"CallInstDLL",2,0,"dll_path_on_target.dll function"},
{TOK_CAPTION,"Caption",1,0,"installer_caption"}, {TOK_CAPTION,"Caption",1,1,"[/LANG=lang_id] installer_caption"},
{TOK_CHANGEUI,"ChangeUI",1,0,"ui_file.exe"}, {TOK_CHANGEUI,"ChangeUI",1,0,"ui_file.exe"},
{TOK_CLEARERRORS,"ClearErrors",0,0,""}, {TOK_CLEARERRORS,"ClearErrors",0,0,""},
{TOK_COMPTEXT,"ComponentText",0,3,"[component_page_description] [component_subtext1] [component_subtext2]"}, {TOK_COMPTEXT,"ComponentText",0,4,"[/LANG=lang_id] [component_page_description] [component_subtext1] [component_subtext2]"},
{TOK_GETDLLVERSION,"GetDLLVersion",3,0,"filename $(user_var: high output) $(user_var: low output)"}, {TOK_GETDLLVERSION,"GetDLLVersion",3,0,"filename $(user_var: high output) $(user_var: low output)"},
{TOK_GETDLLVERSIONLOCAL,"GetDLLVersionLocal",3,0,"localfilename $(user_var: high output) $(user_var: low output)"}, {TOK_GETDLLVERSIONLOCAL,"GetDLLVersionLocal",3,0,"localfilename $(user_var: high output) $(user_var: low output)"},
{TOK_GETFILETIME,"GetFileTime",3,0,"file $(user_var: high output) $(user_var: low output)"}, {TOK_GETFILETIME,"GetFileTime",3,0,"file $(user_var: high output) $(user_var: low output)"},
@ -45,7 +45,7 @@ static tokenType tokenlist[TOK__LAST] =
{TOK_DELETEREGVALUE,"DeleteRegValue",3,0,"root_key subkey entry_name\n root_key=(HKCR|HKLM|HKCU|HKU|HKCC|HKDD|HKPD)"}, {TOK_DELETEREGVALUE,"DeleteRegValue",3,0,"root_key subkey entry_name\n root_key=(HKCR|HKLM|HKCU|HKU|HKCC|HKDD|HKPD)"},
{TOK_DELETE,"Delete",1,1,"[/REBOOTOK] filespec"}, {TOK_DELETE,"Delete",1,1,"[/REBOOTOK] filespec"},
{TOK_DETAILPRINT,"DetailPrint",1,0,"message"}, {TOK_DETAILPRINT,"DetailPrint",1,0,"message"},
{TOK_DIRTEXT,"DirText",0,3,"[directory_page_description] [directory_page_subtext] [browse button text]"}, {TOK_DIRTEXT,"DirText",0,4,"[/LANG=lang_id] [directory_page_description] [directory_page_subtext] [browse button text]"},
{TOK_DIRSHOW,"DirShow",1,0,"(show|hide)"}, {TOK_DIRSHOW,"DirShow",1,0,"(show|hide)"},
{TOK_ROOTDIRINST,"AllowRootDirInstall",1,0,"(true|false)"}, {TOK_ROOTDIRINST,"AllowRootDirInstall",1,0,"(true|false)"},
{TOK_CHECKBITMAP,"CheckBitmap",1,0,"local_bitmap.bmp"}, {TOK_CHECKBITMAP,"CheckBitmap",1,0,"local_bitmap.bmp"},
@ -62,7 +62,7 @@ static tokenType tokenlist[TOK__LAST] =
{TOK_FINDNEXT,"FindNext",2,0,"$(user_var: handle input) $(user_var: filename output)"}, {TOK_FINDNEXT,"FindNext",2,0,"$(user_var: handle input) $(user_var: filename output)"},
{TOK_FILE,"File",1,-1,"([/a] [/r] filespec [...]|/oname=outfile one_file_only)"}, {TOK_FILE,"File",1,-1,"([/a] [/r] filespec [...]|/oname=outfile one_file_only)"},
{TOK_FILECLOSE,"FileClose",1,0,"$(user_var: handle input)"}, {TOK_FILECLOSE,"FileClose",1,0,"$(user_var: handle input)"},
{TOK_FILEERRORTEXT,"FileErrorText",0,1,"[text (can contain $0)]"}, {TOK_FILEERRORTEXT,"FileErrorText",0,2,"[/LANG=lang_id] [text (can contain $0)]"},
{TOK_FILEOPEN,"FileOpen",3,0,"$(user_var: handle output) filename openmode\n openmode=r|w|a"}, {TOK_FILEOPEN,"FileOpen",3,0,"$(user_var: handle output) filename openmode\n openmode=r|w|a"},
{TOK_FILEREAD,"FileRead",2,1,"$(user_var: handle input) $(user_var: text output) [maxlen]"}, {TOK_FILEREAD,"FileRead",2,1,"$(user_var: handle input) $(user_var: text output) [maxlen]"},
{TOK_FILEWRITE,"FileWrite",2,0,"$(user_var: handle input) text"}, {TOK_FILEWRITE,"FileWrite",2,0,"$(user_var: handle input) text"},
@ -90,8 +90,8 @@ static tokenType tokenlist[TOK__LAST] =
{TOK_INTFMT,"IntFmt",3,0,"$(user_var: output) format_string input"}, {TOK_INTFMT,"IntFmt",3,0,"$(user_var: output) format_string input"},
{TOK_ISWINDOW,"IsWindow",2,1,"hwnd jump_if_window [jump_if_not_window]"}, {TOK_ISWINDOW,"IsWindow",2,1,"hwnd jump_if_window [jump_if_not_window]"},
{TOK_GOTO,"Goto",1,0,"label"}, {TOK_GOTO,"Goto",1,0,"label"},
{TOK_LICENSEDATA,"LicenseData",1,0,"local_file_that_has_license_text.txt"}, {TOK_LICENSEDATA,"LicenseData",1,1,"[/LANG=lang_id] local_file_that_has_license_text.txt"},
{TOK_LICENSETEXT,"LicenseText",1,1,"license_page_description [license_button_text]"}, {TOK_LICENSETEXT,"LicenseText",1,2,"[/LANG=lang_id] license_page_description [license_button_text]"},
{TOK_LICENSEBKCOLOR,"LicenseBkColor",1,0,"background_color"}, {TOK_LICENSEBKCOLOR,"LicenseBkColor",1,0,"background_color"},
{TOK_LOADNLF,"LoadLanguageFile",1,0,"language.nlf"}, {TOK_LOADNLF,"LoadLanguageFile",1,0,"language.nlf"},
{TOK_LOGSET,"LogSet",1,0,"on|off"}, {TOK_LOGSET,"LogSet",1,0,"on|off"},
@ -99,7 +99,7 @@ static tokenType tokenlist[TOK__LAST] =
{TOK_MESSAGEBOX,"MessageBox",2,4,"mode messagebox_text [return_check label_to_goto_if_equal [return_check2 label2]]\n mode=modeflag[|modeflag[|modeflag[...]]]\n " {TOK_MESSAGEBOX,"MessageBox",2,4,"mode messagebox_text [return_check label_to_goto_if_equal [return_check2 label2]]\n mode=modeflag[|modeflag[|modeflag[...]]]\n "
"modeflag=(MB_ABORTRETRYIGNORE|MB_OK|MB_OKCANCEL|MB_RETRYCANCEL|MB_YESNO|MB_YESNOCANCEL|MB_ICONEXCLAMATION|MB_ICONINFORMATION|MB_ICONQUESTION|MB_ICONSTOP|MB_TOPMOST|MB_SETFOREGROUND|MB_RIGHT"}, "modeflag=(MB_ABORTRETRYIGNORE|MB_OK|MB_OKCANCEL|MB_RETRYCANCEL|MB_YESNO|MB_YESNOCANCEL|MB_ICONEXCLAMATION|MB_ICONINFORMATION|MB_ICONQUESTION|MB_ICONSTOP|MB_TOPMOST|MB_SETFOREGROUND|MB_RIGHT"},
{TOK_NOP,"Nop",0,0,""}, {TOK_NOP,"Nop",0,0,""},
{TOK_NAME,"Name",1,0,"installer_name"}, {TOK_NAME,"Name",1,1,"[/LANG=lang_id] installer_name"},
{TOK_OUTFILE,"OutFile",1,0,"install_output.exe"}, {TOK_OUTFILE,"OutFile",1,0,"install_output.exe"},
{TOK_POP,"Pop",1,0,"$(user_var: output)"}, {TOK_POP,"Pop",1,0,"$(user_var: output)"},
{TOK_PUSH,"Push",1,0,"string"}, {TOK_PUSH,"Push",1,0,"string"},
@ -146,12 +146,12 @@ static tokenType tokenlist[TOK__LAST] =
{TOK_STRCMP,"StrCmp",3,1,"str1 str2 label_to_goto_if_equal [label_to_goto_if_not]"}, {TOK_STRCMP,"StrCmp",3,1,"str1 str2 label_to_goto_if_equal [label_to_goto_if_not]"},
{TOK_STRCPY,"StrCpy",2,2,"$(user_var: output) str [maxlen] [startoffset]"}, {TOK_STRCPY,"StrCpy",2,2,"$(user_var: output) str [maxlen] [startoffset]"},
{TOK_STRLEN,"StrLen",2,0,"$(user_var: length output) str"}, {TOK_STRLEN,"StrLen",2,0,"$(user_var: length output) str"},
{TOK_SUBCAPTION,"SubCaption",2,0,"page_number(0-4) new_subcaption"}, {TOK_SUBCAPTION,"SubCaption",2,1,"[/LANG=lang_id] page_number(0-4) new_subcaption"},
{TOK_UNINSTALLEXENAME,"UninstallExeName",0,0,"no longer supported, use WriteUninstaller from section."}, {TOK_UNINSTALLEXENAME,"UninstallExeName",0,0,"no longer supported, use WriteUninstaller from section."},
{TOK_UNINSTICON,"UninstallIcon",1,0,"icon_on_local_system.ico"}, {TOK_UNINSTICON,"UninstallIcon",1,0,"icon_on_local_system.ico"},
{TOK_UNINSTTEXT,"UninstallText",1,1,"Text_to_go_on_uninstall page [subtext]"}, {TOK_UNINSTTEXT,"UninstallText",1,2,"[/LANG=lang_id] Text_to_go_on_uninstall page [subtext]"},
{TOK_UNINSTCAPTION,"UninstallCaption",1,0,"uninstaller_caption"}, {TOK_UNINSTCAPTION,"UninstallCaption",1,1,"[/LANG=lang_id] uninstaller_caption"},
{TOK_UNINSTSUBCAPTION,"UninstallSubCaption",2,0,"page_number(0-2) new_subcaption"}, {TOK_UNINSTSUBCAPTION,"UninstallSubCaption",2,1,"[/LANG=lang_id] page_number(0-2) new_subcaption"},
{TOK_UNREGDLL,"UnRegDLL",1,0,"dll_path_on_target.dll"}, {TOK_UNREGDLL,"UnRegDLL",1,0,"dll_path_on_target.dll"},
{TOK_WINDOWICON,"WindowIcon",1,0,"on|off"}, {TOK_WINDOWICON,"WindowIcon",1,0,"on|off"},
{TOK_WRITEINISTR,"WriteINIStr",4,0,"ini_file section_name entry_name new_value"}, {TOK_WRITEINISTR,"WriteINIStr",4,0,"ini_file section_name entry_name new_value"},
@ -182,12 +182,12 @@ static tokenType tokenlist[TOK__LAST] =
{TOK_P_INSERTMACRO,"!insertmacro",1,-1,"macroname [parms ...]"}, {TOK_P_INSERTMACRO,"!insertmacro",1,-1,"macroname [parms ...]"},
{TOK_MISCBUTTONTEXT,"MiscButtonText",0,4,"[back button text] [next button text] [cancel button text] [close button text]"}, {TOK_MISCBUTTONTEXT,"MiscButtonText",0,5,"[/LANG=lang_id] [back button text] [next button text] [cancel button text] [close button text]"},
{TOK_DETAILSBUTTONTEXT,"DetailsButtonText",0,1,"[details button text]"}, {TOK_DETAILSBUTTONTEXT,"DetailsButtonText",0,2,"[/LANG=lang_id] [details button text]"},
{TOK_UNINSTBUTTONTEXT,"UninstallButtonText",0,1,"[uninstall button text]"}, {TOK_UNINSTBUTTONTEXT,"UninstallButtonText",0,2,"[/LANG=lang_id] [uninstall button text]"},
{TOK_INSTBUTTONTEXT,"InstallButtonText",0,1,"[install button text]"}, {TOK_INSTBUTTONTEXT,"InstallButtonText",0,2,"[/LANG=lang_id] [install button text]"},
{TOK_SPACETEXTS,"SpaceTexts",0,2,"[space required text] [space available text]"}, {TOK_SPACETEXTS,"SpaceTexts",0,3,"[/LANG=lang_id] [space required text] [space available text]"},
{TOK_COMPLETEDTEXT,"CompletedText",0,1,"[completed text]"}, {TOK_COMPLETEDTEXT,"CompletedText",0,2,"[/LANG=lang_id] [completed text]"},
{TOK_GETFUNCTIONADDR,"GetFunctionAddress",2,0,"output function"}, {TOK_GETFUNCTIONADDR,"GetFunctionAddress",2,0,"output function"},
{TOK_GETLABELADDR,"GetLabelAddress",2,0,"output label"}, {TOK_GETLABELADDR,"GetLabelAddress",2,0,"output label"},