diff --git a/Contrib/Makensisw/makensisw.cpp b/Contrib/Makensisw/makensisw.cpp index d90676df..4f9d4a5c 100644 --- a/Contrib/Makensisw/makensisw.cpp +++ b/Contrib/Makensisw/makensisw.cpp @@ -30,10 +30,10 @@ #include "toolbar.h" #include "update.h" -#ifdef _countof -#define COUNTOF _countof -#else -#define COUNTOF(a) (sizeof(a)/sizeof(a[0])) +#ifdef _countof +#define COUNTOF _countof +#else +#define COUNTOF(a) (sizeof(a)/sizeof(a[0])) #endif NSCRIPTDATA g_sdata; @@ -706,8 +706,8 @@ BOOL CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { } DWORD WINAPI MakeNSISProc(LPVOID p) { - TCHAR buf[1024]; - char iobuf[1024]; //i/o buffer + TCHAR buf[1024]; + char iobuf[1024]; //i/o buffer STARTUPINFO si={sizeof(si),}; SECURITY_ATTRIBUTES sa={sizeof(sa),}; SECURITY_DESCRIPTOR sd={0,}; diff --git a/Source/exehead/exec.c b/Source/exehead/exec.c index 5de07ae1..3f6c55a6 100644 --- a/Source/exehead/exec.c +++ b/Source/exehead/exec.c @@ -1362,26 +1362,43 @@ static int NSISCALL ExecuteEntry(entry *entry_) } break; case EW_FPUTS: +#ifdef _UNICODE + case EW_FPUTWS: + // Jim Park/Wizou: in Unicode version of NSIS, EW_FPUTS still deals with ANSI files (conversion is done). We add EW_FPUTWS to deal with Unicode files. +#endif { DWORD dw; - int l; + int l; // number of bytes to write TCHAR *t=var0; - if (parm2) + if (parm2) // FileWriteByte or FileWriteWord { - ((_TUCHAR *)buf1)[0]=(_TUCHAR) GetIntFromParm(1); - l=1; + // Note: In Unicode version, we put a WORD in buf1[0] and will write 1 or 2 bytes, depending on FileWriteByte/Word. + ((_TUCHAR *)buf1)[0]=(_TUCHAR) GetIntFromParm(1); // FIX_ENDIAN_INT16 needed? + l=(which==EW_FPUTS)?1:sizeof(TCHAR); // Note: This is optimized by the compiler into l=1 for ANSI compilation } +#ifdef _UNICODE + else if (which==EW_FPUTS) + { + GetStringFromParm(0x21); // load string in buf2, convert it to ANSI in buf1 + WideCharToMultiByte(CP_ACP, 0, buf2, -1, (LPSTR) buf1, NSIS_MAX_STRLEN, NULL, NULL); + l=lstrlenA((LPCSTR)buf1); + } +#endif else { - l=mystrlen(GetStringFromParm(0x11)); + l=mystrlen(GetStringFromParm(0x11))*sizeof(TCHAR); } - if (!*t || !WriteFile((HANDLE)myatoi(t),buf1,l*sizeof(TCHAR),&dw,NULL)) + if (!*t || !WriteFile((HANDLE)myatoi(t),buf1,l,&dw,NULL)) { exec_error++; } } break; case EW_FGETS: +#ifdef _UNICODE + case EW_FGETWS: + // Jim Park/Wizou: in Unicode version of NSIS, EW_FGETS still deals with ANSI files (conversion is done). We add EW_FGETWS to deal with Unicode files. +#endif { TCHAR *textout=var1; DWORD dw; @@ -1397,6 +1414,15 @@ static int NSISCALL ExecuteEntry(entry *entry_) while (rpos=0?positionoutput] #endif//NSIS_SUPPORT_FILEFUNCTIONS diff --git a/Source/script.cpp b/Source/script.cpp index f0ae2ff3..995c2ab2 100644 --- a/Source/script.cpp +++ b/Source/script.cpp @@ -12,6 +12,8 @@ * * This software is provided 'as-is', without any express or implied * warranty. + * + * Unicode support by Jim Park -- 08/09/2007 */ #include "Platform.h" @@ -5494,6 +5496,43 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) if (ent.offsets[0]<0) PRINTHELP() SCRIPT_MSG(_T("FileWriteByte: %s->%s\n"),line.gettoken_str(2),line.gettoken_str(1)); return add_entry(&ent); +#ifdef _UNICODE + case TOK_FILEREADUTF16LE: + ent.which=EW_FGETWS; + ent.offsets[0]=GetUserVarIndex(line, 1); // file handle + ent.offsets[1]=GetUserVarIndex(line, 2); // output string + if (line.gettoken_str(3)[0]) + ent.offsets[2]=add_string(line.gettoken_str(3)); + else + ent.offsets[2]=add_intstring(NSIS_MAX_STRLEN-1); + if (ent.offsets[0]<0 || ent.offsets[1]<0) PRINTHELP() + SCRIPT_MSG(_T("FileReadUTF16LE: %s->%s (max:%s)\n"),line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3)); + return add_entry(&ent); + case TOK_FILEWRITEUTF16LE: + ent.which=EW_FPUTWS; + ent.offsets[0]=GetUserVarIndex(line, 1); // file handle + ent.offsets[1]=add_string(line.gettoken_str(2)); + if (ent.offsets[0]<0) PRINTHELP() + SCRIPT_MSG(_T("FileWriteUTF16LE: %s->%s\n"),line.gettoken_str(2),line.gettoken_str(1)); + return add_entry(&ent); + case TOK_FILEREADWORD: + ent.which=EW_FGETWS; + ent.offsets[0]=GetUserVarIndex(line, 1); // file handle + ent.offsets[1]=GetUserVarIndex(line, 2); // output string + ent.offsets[2]=add_string(_T("1")); + ent.offsets[3]=1; + if (ent.offsets[0]<0 || ent.offsets[1]<0) PRINTHELP() + SCRIPT_MSG(_T("FileReadWord: %s->%s\n"),line.gettoken_str(1),line.gettoken_str(2)); + return add_entry(&ent); + case TOK_FILEWRITEWORD: + ent.which=EW_FPUTWS; + ent.offsets[0]=GetUserVarIndex(line, 1); // file handle + ent.offsets[1]=add_string(line.gettoken_str(2)); + ent.offsets[2]=1; + if (ent.offsets[0]<0) PRINTHELP() + SCRIPT_MSG(_T("FileWriteWord: %s->%s\n"),line.gettoken_str(2),line.gettoken_str(1)); + return add_entry(&ent); +#endif case TOK_FILESEEK: { const TCHAR *modestr; @@ -5529,6 +5568,12 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) case TOK_FILEWRITE: case TOK_FILEREADBYTE: case TOK_FILEWRITEBYTE: +#ifdef _UNICODE + case TOK_FILEREADUTF16LE: + case TOK_FILEWRITEUTF16LE: + case TOK_FILEREADWORD: + case TOK_FILEWRITEWORD: +#endif ERROR_MSG(_T("Error: %s specified, NSIS_SUPPORT_FILEFUNCTIONS not defined.\n"), line.gettoken_str(0)); return PS_ERROR; diff --git a/Source/tokens.cpp b/Source/tokens.cpp index 0cea2f8c..f4a7f2ea 100644 --- a/Source/tokens.cpp +++ b/Source/tokens.cpp @@ -97,6 +97,12 @@ static tokenType tokenlist[TOK__LAST] = {TOK_FILEWRITE,_T("FileWrite"),2,0,_T("$(user_var: handle input) text"),TP_CODE}, {TOK_FILEREADBYTE,_T("FileReadByte"),2,0,_T("$(user_var: handle input) $(user_var: bytevalue output)"),TP_CODE}, {TOK_FILEWRITEBYTE,_T("FileWriteByte"),2,0,_T("$(user_var: handle input) bytevalue"),TP_CODE}, +#ifdef _UNICODE +{TOK_FILEREADUTF16LE,_T("FileReadUTF16LE"),2,1,_T("$(user_var: handle input) $(user_var: text output) [maxlen]"),TP_CODE}, +{TOK_FILEWRITEUTF16LE,_T("FileWriteUTF16LE"),2,0,_T("$(user_var: handle input) text"),TP_CODE}, +{TOK_FILEREADWORD,_T("FileReadWord"),2,0,_T("$(user_var: handle input) $(user_var: wordvalue output)"),TP_CODE}, +{TOK_FILEWRITEWORD,_T("FileWriteWord"),2,0,_T("$(user_var: handle input) wordvalue"),TP_CODE}, +#endif {TOK_FILESEEK,_T("FileSeek"),2,2,_T("$(user_var: handle input) offset [mode] [$(user_var: new position output)]\n mode=SET|CUR|END"),TP_CODE}, {TOK_FUNCTION,_T("Function"),1,0,_T("function_name"),TP_GLOBAL}, {TOK_FUNCTIONEND,_T("FunctionEnd"),0,0,_T(""),TP_FUNC}, diff --git a/Source/tokens.h b/Source/tokens.h index bae2fa3c..bd997f86 100644 --- a/Source/tokens.h +++ b/Source/tokens.h @@ -12,6 +12,8 @@ * * This software is provided 'as-is', without any express or implied * warranty. + * + * Added commands for Unicode support by Jim Park -- 08/21/2007 */ #ifndef _TOKENS_H_ @@ -236,6 +238,12 @@ enum TOK_FILEWRITE, TOK_FILEREADBYTE, TOK_FILEWRITEBYTE, +#ifdef _UNICODE + TOK_FILEREADUTF16LE, + TOK_FILEWRITEUTF16LE, + TOK_FILEREADWORD, + TOK_FILEWRITEWORD, +#endif TOK_FILESEEK, TOK_GETFULLPATHNAME, TOK_REBOOT,