From be6c7e6a1dc99951d2209c1df12fc224834398fa Mon Sep 17 00:00:00 2001 From: anders_k Date: Sun, 8 Dec 2013 14:34:38 +0000 Subject: [PATCH] Major POSIX overhaul git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@6416 212acab6-be3b-0410-9dea-997c60f758d6 --- Contrib/InstallOptions/InstallerOptions.cpp | 8 +- Contrib/Makensisw/utils.h | 4 - Docs/src/credits.but | 6 + Docs/src/history.but | 2 + SCons/Config/ms | 8 +- SConstruct | 18 +- Source/DialogTemplate.cpp | 61 +- Source/DialogTemplate.h | 13 +- Source/Platform.h | 62 +- Source/Plugins.cpp | 2 +- Source/ResourceEditor.cpp | 214 ++--- Source/ResourceEditor.h | 75 +- Source/ResourceVersionInfo.cpp | 50 +- Source/build.cpp | 188 ++-- Source/build.h | 2 +- Source/dirreader.cpp | 49 +- Source/exehead/Main.c | 3 +- Source/exehead/fileform.h | 3 + Source/growbuf.cpp | 4 +- Source/icon.cpp | 6 +- Source/lang.cpp | 50 +- Source/makenssi.cpp | 116 ++- Source/manifest.cpp | 2 +- Source/script.cpp | 962 +++++++++----------- Source/strlist.h | 111 ++- Source/tchar.h | 6 +- Source/tokens.cpp | 12 +- Source/tstring.cpp | 52 +- Source/tstring.h | 24 +- Source/utf.cpp | 36 +- Source/utf.h | 7 +- Source/util.cpp | 717 +++++++++------ Source/util.h | 66 +- Source/winchar.cpp | 151 +-- Source/winchar.h | 40 +- 35 files changed, 1718 insertions(+), 1412 deletions(-) diff --git a/Contrib/InstallOptions/InstallerOptions.cpp b/Contrib/InstallOptions/InstallerOptions.cpp index c346f1c8..609ba317 100644 --- a/Contrib/InstallOptions/InstallerOptions.cpp +++ b/Contrib/InstallOptions/InstallerOptions.cpp @@ -13,15 +13,15 @@ #include #include #include +#include #include "resource.h" -#include "shellapi.h" #include // nsis plugin -#ifdef _countof -#define COUNTOF _countof -#else #define COUNTOF(a) (sizeof(a)/sizeof(a[0])) +#ifndef min +#include +#define min std::min // mingw64? #endif // Use for functions only called from one place to possibly reduce some code diff --git a/Contrib/Makensisw/utils.h b/Contrib/Makensisw/utils.h index e40ef8bb..6a9804b4 100644 --- a/Contrib/Makensisw/utils.h +++ b/Contrib/Makensisw/utils.h @@ -27,11 +27,7 @@ #include "resource.h" #include "toolbar.h" -#ifdef _countof -#define COUNTOF _countof -#else #define COUNTOF(a) (sizeof(a)/sizeof(a[0])) -#endif #define MRU_LIST_SIZE 5 #define MRU_DISPLAY_LENGTH 40 diff --git a/Docs/src/credits.but b/Docs/src/credits.but index 69e9449f..ca86bb64 100644 --- a/Docs/src/credits.but +++ b/Docs/src/credits.but @@ -108,6 +108,12 @@ \b NSIS 3 patron saint +\H{testers} Testers + +\e{Jason Ross aka JasonFriday13} + +\b NSIS 3 POSIX support + \H{designers} Designers \e{Nikos Adamamas} diff --git a/Docs/src/history.but b/Docs/src/history.but index 08e34590..01fc12a1 100644 --- a/Docs/src/history.but +++ b/Docs/src/history.but @@ -24,6 +24,8 @@ Released on ? \b Unicode stubs create WCHAR richedit controls (\W{http://sf.net/p/nsis/bugs/1080/}{bug #1080}) +\b Fixed !macroundef + \b Fixed MakeNSISW default pushbutton and tab order \H{v3.0a1} 3.0 Alpha 1 diff --git a/SCons/Config/ms b/SCons/Config/ms index f751554b..0d651107 100644 --- a/SCons/Config/ms +++ b/SCons/Config/ms @@ -31,11 +31,14 @@ if msvs_version >= 8.0: defenv['EXCEPTION_FLAG'] = '/EHsc' defenv.Append(CCFLAGS = ['/GS-']) defenv.Append(CPPDEFINES = ['_CRT_SECURE_NO_WARNINGS', '_CRT_NONSTDC_NO_WARNINGS', '_CRT_SECURE_NO_DEPRECATE', '_CRT_NON_CONFORMING_SWPRINTFS']) + defenv['MSVCRT_FLAG'] = '/MT' # Avoid msvcr?0.dll dependency else: defenv['EXCEPTION_FLAG'] = '/GX' if msvs_version < 10.0: # not even /ALIGN:512 works for vc10... fails to load process defenv.Append(LINKFLAGS = ['/opt:nowin98']) +if defenv['MSTOOLKIT']: + defenv['MSVCRT_FLAG'] = '/ML' # TK2003 does not have all libs ### defines @@ -51,6 +54,7 @@ if defenv['DEBUG']: defenv.Append(CCFLAGS = ['/Zi']) defenv.Append(CCFLAGS = ['/Fd${TARGET.dir}\\${TARGET.dir.file}.pdb']) defenv.Append(LINKFLAGS = ['/debug']) + defenv['MSVCRT_FLAG'] = defenv['MSVCRT_FLAG'] + 'd' ### workarounds @@ -109,7 +113,7 @@ stub_env = defenv.Clone() stub_env.Append(CPPPATH = ['#$BUILD_CONFIG']) if not defenv['DEBUG']: - stub_env.Append(CCFLAGS = ['/O1']) # optimize for size + stub_env.Append(CCFLAGS = ['/O1']) # optimize for size stub_env.Append(CCFLAGS = ['/W3']) # level 3 warnings stub_env.Append(CCFLAGS = ['/FAcs']) # full listing files stub_env.Append(CCFLAGS = ['/Fa${TARGET}.lst']) # listing file name @@ -132,6 +136,7 @@ makensis_env.Append(CCFLAGS = ['$EXCEPTION_FLAG']) # enable exceptions makensis_env.Append(CCFLAGS = ['/W3']) # level 3 warnings makensis_env.Append(CCFLAGS = ['/FAcs']) # full listing files makensis_env.Append(CCFLAGS = ['/Fa${TARGET}.lst']) # listing file name +makensis_env.Append(CCFLAGS = [defenv['MSVCRT_FLAG']]) makensis_env.Append(LINKFLAGS = ['$MAP_FLAG']) # generate map file if defenv['UNICODE']: @@ -157,6 +162,7 @@ util_env = tdefenv.Clone() if not defenv['DEBUG']: util_env.Append(CCFLAGS = ['/O1']) # optimize for speed util_env.Append(CCFLAGS = ['/W3']) # level 3 warnings +util_env.Append(CCFLAGS = [defenv['MSVCRT_FLAG']]) util_env.Append(LINKFLAGS = ['$MAP_FLAG']) # generate map file diff --git a/SConstruct b/SConstruct index b4b047d5..f48b2ff4 100644 --- a/SConstruct +++ b/SConstruct @@ -209,15 +209,15 @@ if 'NSIS_CONFIG_CONST_DATA_PATH' in defenv['NSIS_CPPDEFINES']: # Need this early for the config header files to be placed in if defenv['UNICODE']: - if defenv['DEBUG']: - defenv.Replace(BUILD_PREFIX = 'build/udebug') - else: - defenv.Replace(BUILD_PREFIX = 'build/urelease') + if defenv['DEBUG']: + defenv.Replace(BUILD_PREFIX = 'build/udebug') + else: + defenv.Replace(BUILD_PREFIX = 'build/urelease') else: - if defenv['DEBUG']: - defenv.Replace(BUILD_PREFIX = 'build/debug') - else: - defenv.Replace(BUILD_PREFIX = 'build/release') + if defenv['DEBUG']: + defenv.Replace(BUILD_PREFIX = 'build/debug') + else: + defenv.Replace(BUILD_PREFIX = 'build/release') defenv.Replace(BUILD_CONFIG = defenv.subst('$BUILD_PREFIX/config')) @@ -248,7 +248,7 @@ defines_h.close() # write version into version.h f = open(defenv.File('#$BUILD_CONFIG/nsis-version.h').abspath, 'w') f.write('// This file is automatically generated by SCons\n// DO NOT EDIT THIS FILE\n') -f.write('#include "tchar.h"\n') +f.write('#include "%s"\n' % File('#/Source/tchar.h').abspath) if (not defenv.has_key('VER_PACKED')) and defenv.has_key('VER_MAJOR') and defenv.has_key('VER_MINOR'): packed_r = packed_b = 0 diff --git a/Source/DialogTemplate.cpp b/Source/DialogTemplate.cpp index 16235f7b..cd845dab 100644 --- a/Source/DialogTemplate.cpp +++ b/Source/DialogTemplate.cpp @@ -46,7 +46,7 @@ static inline short ConvertEndianness(short s) { #define ALIGN(dwToAlign, dwAlignOn) dwToAlign = (dwToAlign%dwAlignOn == 0) ? dwToAlign : dwToAlign - (dwToAlign%dwAlignOn) + dwAlignOn // Reads a variant length array from seeker into readInto and advances seeker -void ReadVarLenArr(LPBYTE &seeker, WCHAR* &readInto, unsigned int uCodePage) { +void ReadVarLenArr(LPBYTE &seeker, WINWCHAR* &readInto, unsigned int uCodePage) { WORD* arr = (WORD*)seeker; switch (ConvertEndianness(arr[0])) { case 0x0000: @@ -54,13 +54,13 @@ void ReadVarLenArr(LPBYTE &seeker, WCHAR* &readInto, unsigned int uCodePage) { seeker += sizeof(WORD); break; case 0xFFFF: - readInto = MAKEINTRESOURCEW(ConvertEndianness(arr[1])); + readInto = MAKEINTRESOURCEWINW(ConvertEndianness(arr[1])); seeker += 2*sizeof(WORD); break; default: { - readInto = wcsdup((WCHAR *) arr); - PWCHAR wseeker = PWCHAR(seeker); + readInto = WinWStrDupFromWinWStr((WINWCHAR*) arr); + WINWCHAR *wseeker = (WINWCHAR*) seeker; while (*wseeker++); seeker = LPBYTE(wseeker); } @@ -78,14 +78,14 @@ void ReadVarLenArr(LPBYTE &seeker, WCHAR* &readInto, unsigned int uCodePage) { seeker += sizeof(WORD); \ } \ else { \ - wcscpy((WCHAR *) seeker, x); \ - seeker += wcslen((WCHAR *) seeker) * sizeof(WCHAR) + sizeof(WCHAR); \ + WinWStrCpy((WINWCHAR *) seeker, x); \ + seeker += WinWStrLen((WINWCHAR *) seeker) * sizeof(WINWCHAR) + sizeof(WINWCHAR); \ } \ else \ seeker += sizeof(WORD); // A macro that adds the size of x (which can be a string a number, or nothing) to dwSize -#define AddStringOrIdSize(x) dwSize += x ? (IS_INTRESOURCE(x) ? sizeof(DWORD) : (wcslen(x) + 1) * sizeof(WCHAR)) : sizeof(WORD) +#define AddStringOrIdSize(x) dwSize += x ? (IS_INTRESOURCE(x) ? sizeof(DWORD) : (WinWStrLen(x) + 1) * sizeof(WINWCHAR)) : sizeof(WORD) ////////////////////////////////////////////////////////////////////// // Construction/Destruction @@ -220,23 +220,22 @@ CDialogTemplate::CDialogTemplate(BYTE* pbData, bool build_unicode, unsigned int } } +static void free_template_string(WINWCHAR*s) +{ + if (!IS_INTRESOURCE(s)) free(s); +} + CDialogTemplate::~CDialogTemplate() { - if (m_szMenu && !IS_INTRESOURCE(m_szMenu)) - delete [] m_szMenu; - if (m_szClass && !IS_INTRESOURCE(m_szClass)) - delete [] m_szClass; - if (m_szTitle) - delete [] m_szTitle; - if (m_szFont) - free(m_szFont); + free_template_string(m_szMenu); + free_template_string(m_szClass); + free(m_szTitle); + free(m_szFont); for (unsigned int i = 0; i < m_vItems.size(); i++) { - if (m_vItems[i]->szClass && !IS_INTRESOURCE(m_vItems[i]->szClass)) - delete [] m_vItems[i]->szClass; - if (m_vItems[i]->szTitle && !IS_INTRESOURCE(m_vItems[i]->szTitle)) - delete [] m_vItems[i]->szTitle; - if (m_vItems[i]->szCreationData) - delete [] m_vItems[i]->szCreationData; + free_template_string(m_vItems[i]->szClass); + free_template_string(m_vItems[i]->szTitle); + if (m_vItems[i]->szCreationData) delete [] m_vItems[i]->szCreationData; + delete m_vItems[i]; } } @@ -293,7 +292,7 @@ void CDialogTemplate::SetFont(TCHAR* szFaceName, WORD wFontSize) { m_bCharset = DEFAULT_CHARSET; m_dwStyle |= DS_SETFONT; if (m_szFont) free(m_szFont); - m_szFont = wcsdup_fromTchar(szFaceName, m_uCodePage); + m_szFont = WinWStrDupFromTChar(szFaceName, m_uCodePage); m_sFontSize = wFontSize; } @@ -303,10 +302,10 @@ void CDialogTemplate::AddItem(DialogItemTemplate item) { CopyMemory(newItem, &item, sizeof(DialogItemTemplate)); if (item.szClass && !IS_INTRESOURCE(item.szClass)) { - newItem->szClass = _wcsdup(item.szClass); + newItem->szClass = WinWStrDupFromWinWStr(item.szClass); } if (item.szTitle && !IS_INTRESOURCE(item.szTitle)) { - newItem->szTitle = _wcsdup(item.szTitle); + newItem->szTitle = WinWStrDupFromWinWStr(item.szTitle); } if (item.wCreateDataSize) { newItem->szCreationData = new char[item.wCreateDataSize]; @@ -475,18 +474,18 @@ void CDialogTemplate::ConvertToRTL() { m_vItems[i]->dwStyle |= SS_CENTERIMAGE; } } - else if (!IS_INTRESOURCE(m_vItems[i]->szClass) && !_wcsnicmp(m_vItems[i]->szClass, L"RichEdit20", 10)) { + else if (!IS_INTRESOURCE(m_vItems[i]->szClass) && !WinWStrNICmpASCII(m_vItems[i]->szClass, "RichEdit20", 10)) { if ((m_vItems[i]->dwStyle & ES_CENTER) == 0) { m_vItems[i]->dwStyle ^= ES_RIGHT; } } - else if (!IS_INTRESOURCE(m_vItems[i]->szClass) && !_wcsicmp(m_vItems[i]->szClass, L"SysTreeView32")) { + else if (!IS_INTRESOURCE(m_vItems[i]->szClass) && !WinWStrICmpASCII(m_vItems[i]->szClass, "SysTreeView32")) { m_vItems[i]->dwStyle |= TVS_RTLREADING; m_vItems[i]->dwExtStyle |= WS_EX_LAYOUTRTL; addExStyle = true; addExLeftScrollbar = false; } - else if (!IS_INTRESOURCE(m_vItems[i]->szClass) && !_wcsicmp(m_vItems[i]->szClass, L"SysListView32")) { + else if (!IS_INTRESOURCE(m_vItems[i]->szClass) && !WinWStrICmpASCII(m_vItems[i]->szClass, "SysListView32")) { m_vItems[i]->dwExtStyle |= WS_EX_LAYOUTRTL; addExLeftScrollbar = false; } @@ -603,12 +602,14 @@ BYTE* CDialogTemplate::Save(DWORD& dwSize) { } // Write class variant length array - const WCHAR *szClass = m_vItems[i]->szClass; + const WINWCHAR *szClass = m_vItems[i]->szClass; #ifdef _UNICODE + static const WINWCHAR clsRE20W[] = {'R','i','c','h','E','d','i','t','2','0','W',0}; + static const WINWCHAR clsRE20A[] = {'R','i','c','h','E','d','i','t','2','0','A',0}; if (!IS_INTRESOURCE(szClass)) { // transmute RichEdit20A/W control into RichEdit20T that matches the target - if (m_build_unicode && !_wcsicmp(szClass, L"RichEdit20A")) szClass = L"RichEdit20W"; - if (!m_build_unicode && !_wcsicmp(szClass, L"RichEdit20W")) szClass = L"RichEdit20A"; + if (m_build_unicode && !WinWStrICmpASCII(szClass, "RichEdit20A")) szClass = clsRE20W; + if (!m_build_unicode && !WinWStrICmpASCII(szClass, "RichEdit20W")) szClass = clsRE20A; } #endif WriteStringOrId(szClass); diff --git a/Source/DialogTemplate.h b/Source/DialogTemplate.h index 5b6891b2..496a808a 100644 --- a/Source/DialogTemplate.h +++ b/Source/DialogTemplate.h @@ -24,6 +24,7 @@ #endif // _MSC_VER > 1000 #include "Platform.h" +#include "winchar.h" #include #include @@ -45,8 +46,8 @@ struct DialogItemTemplate { DWORD dwStyle; WORD wId; - WCHAR *szClass; - WCHAR *szTitle; + WINWCHAR *szClass; + WINWCHAR *szTitle; char *szCreationData; WORD wCreateDataSize; @@ -148,16 +149,16 @@ private: DWORD m_dwExtStyle; DWORD m_dwStyle; - WCHAR *m_szMenu; - WCHAR *m_szClass; - WCHAR *m_szTitle; + WINWCHAR *m_szMenu; + WINWCHAR *m_szClass; + WINWCHAR *m_szTitle; // Only if DS_FONT style is set short m_sFontSize; short m_sFontWeight; // Extended only BYTE m_bItalic; // Extended only BYTE m_bCharset; // Extended only - WCHAR *m_szFont; + WINWCHAR *m_szFont; // For (en/de)coding Unicode unsigned int m_uCodePage; diff --git a/Source/Platform.h b/Source/Platform.h index 256fe5a6..77bb364e 100644 --- a/Source/Platform.h +++ b/Source/Platform.h @@ -21,6 +21,15 @@ // some definitions for non Win32 platforms were taken from MinGW's free Win32 library + +#if defined(__cplusplus) && defined(MAKENSIS) +template class NSISCHARTYPE{ T _c; public: NSISCHARTYPE(){} NSISCHARTYPE(T c):_c(c){} operator T()const{ return _c; } }; +typedef NSISCHARTYPE WINWCHAR; // WINWCHAR is always UTF16LE and should not be passed to wcs* functions +#else +typedef unsigned short WINWCHAR; +#endif + + // includes #include "tchar.h" @@ -50,6 +59,14 @@ typedef long LONG; typedef unsigned long ULONG; typedef long long INT64, LARGE_INTEGER; typedef unsigned long long UINT64, ULARGE_INTEGER; +#include +#ifdef INTPTR_MAX +typedef intptr_t INT_PTR; +typedef uintptr_t UINT_PTR; +#else +typedef int INT_PTR; +typedef unsigned int UINT_PTR; +#endif typedef int BOOL, *LPBOOL; typedef short VARIANT_BOOL; typedef void VOID; @@ -64,8 +81,6 @@ typedef const unsigned short *LPCWCH, *PCWCH, *LPCWSTR, *PCWSTR, *LPCOLESTR; #else #define _tctime ctime #endif -typedef int INT_PTR; -typedef unsigned int UINT_PTR; // basic stuff typedef void * HANDLE; typedef HANDLE HWND; @@ -221,6 +236,13 @@ typedef DWORDLONG ULONGLONG,*PULONGLONG; # ifndef RGB # define RGB(r,g,b) ((DWORD)(((BYTE)(r)|((WORD)(g)<<8))|(((DWORD)(BYTE)(b))<<16))) # endif +# ifndef LOBYTE +# define LOBYTE(w) ((BYTE)(w)) +# define HIBYTE(w) ((BYTE)(((WORD)(w)>>8)&0xFF)) +# endif +# ifndef MAKEWORD +# define MAKEWORD(a,b) ((WORD)(((BYTE)(a))|(((WORD)((BYTE)(b)))<<8))) +# endif # ifndef MAKELONG # define MAKELONG(a,b) ((DWORD)(((WORD)(a))|(((DWORD)((WORD)(b)))<<16))) # endif @@ -237,7 +259,10 @@ typedef DWORDLONG ULONGLONG,*PULONGLONG; // Anders: MSVC's swprintf is non standard, use _snwprintf when you really mean swprintf #if !defined(_MSC_VER) && !defined(__MINGW32__) && !defined(_snwprintf) -#define _snwprintf swprintf +# define _snwprintf swprintf // (wchar_t*,size_t,const wchar_t*,...) +#endif +#ifndef _WIN32 +# define _vsnwprintf vswprintf // (wchar_t*,size_t,const wchar_t*,va_list) #endif // Jim Park: These str functions will probably never be encountered with all my @@ -467,6 +492,7 @@ typedef DWORDLONG ULONGLONG,*PULONGLONG; #ifndef CP_ACP # define CP_ACP 0 +# define CP_OEMCP 1 #endif #ifndef CP_UTF8 # define CP_UTF8 65001 @@ -628,6 +654,7 @@ typedef DWORDLONG ULONGLONG,*PULONGLONG; # define SW_SHOWMINIMIZED 2 # define SW_SHOWMAXIMIZED 3 # define SW_SHOWNOACTIVATE 4 +# define SW_SHOW 5 # define SW_SHOWMINNOACTIVE 7 # define SW_SHOWNA 8 # define SW_RESTORE 9 @@ -972,4 +999,33 @@ typedef struct tagVS_FIXEDFILEINFO { #define NSIS_CXX_THROWSPEC(ignoredthrowspec) // Ignore c++ exception specifications +/* +_tprintf on Windows/MSVCRT treats %s as TCHAR* and on POSIX %s is always char*! +Always use our NPRI* (NsisPRInt[Narrow|Wide]*) defines in format strings when calling +functions from tchar.h (Similar to the way works) + +Example: _tprintf(_T("Hello %") NPRIs _T("\n"), _T("World")); +*/ +#ifdef _WIN32 +# define NPRIs _T("s") +# define NPRINs _T("hs") +# define NPRIWs _T("ls") // ws also works, not sure which is most compatible +# ifndef _WIN64 +# define NPRIp _T(".8x") +# define NPRINp ".8x" +# endif +#else // !_WIN32 +# define NPRINs _T("s") +# define NPRIWs _T("ls") +# ifdef _UNICODE +# define NPRIs _T("ls") +# else // !_UNICODE +# define NPRIs _T("s") +# endif // ~_UNICODE +#endif // ~_WIN32 +#ifndef NPRIp +# define NPRIp _T("p") +# define NPRINp "p" #endif + +#endif // EOF diff --git a/Source/Plugins.cpp b/Source/Plugins.cpp index 174602e4..07a5767c 100644 --- a/Source/Plugins.cpp +++ b/Source/Plugins.cpp @@ -82,7 +82,7 @@ static inline tstring GetDllName(const tstring&command) static inline void PrintCommandSig(const tstring sig) { - _ftprintf(g_output, _T(" + %s\n"), sig.c_str()); + _ftprintf(g_output, _T(" + %") NPRIs _T("\n"), sig.c_str()); } void Plugins::AddPluginsDir(const tstring &path, bool displayInfo) diff --git a/Source/ResourceEditor.cpp b/Source/ResourceEditor.cpp index 60704da9..7edc6a5a 100644 --- a/Source/ResourceEditor.cpp +++ b/Source/ResourceEditor.cpp @@ -21,12 +21,14 @@ #include "winchar.h" #include #include "tchar.h" +#include "utf.h" using namespace std; ////////////////////////////////////////////////////////////////////// // Utilities ////////////////////////////////////////////////////////////////////// +#define WCHARPTR2WINWCHARPTR(s) ( (WINWCHAR*) (s) ) // Only for WinSDK structs like IMAGE_RESOURCE_DIR_STRING_U where we cannot change the WCHAR type! #define ALIGN(dwToAlign, dwAlignOn) dwToAlign = (dwToAlign%dwAlignOn == 0) ? dwToAlign : dwToAlign - (dwToAlign%dwAlignOn) + dwAlignOn #define RALIGN(dwToAlign, dwAlignOn) ((dwToAlign%dwAlignOn == 0) ? dwToAlign : dwToAlign - (dwToAlign%dwAlignOn) + dwAlignOn) @@ -144,10 +146,7 @@ CResourceEditor::CResourceEditor(BYTE* pbPE, int iSize, bool bKeepData /*=true*/ } CResourceEditor::~CResourceEditor() { - if (m_cResDir) { - m_cResDir->Destroy(); - delete m_cResDir; - } + delete m_cResDir; } ////////////////////////////////////////////////////////////////////// @@ -156,7 +155,7 @@ CResourceEditor::~CResourceEditor() { // Adds/Replaces/Removes a resource. // If lpData is 0 UpdateResource removes the resource. -bool CResourceEditor::UpdateResourceW(const WCHAR* szType, WCHAR* szName, LANGID wLanguage, BYTE* lpData, DWORD dwSize) { +bool CResourceEditor::UpdateResourceW(const WINWCHAR* szType, WINWCHAR* szName, LANGID wLanguage, BYTE* lpData, DWORD dwSize) { CResourceDirectory* nameDir = 0; CResourceDirectory* langDir = 0; CResourceDataEntry* data = 0; @@ -186,17 +185,20 @@ bool CResourceEditor::UpdateResourceW(const WCHAR* szType, WCHAR* szName, LANGID if (!nameDir) { // Type doesn't yet exist nameDir = new CResourceDirectory(&rd); - m_cResDir->AddEntry(new CResourceDirectoryEntry(szType, nameDir)); + CResourceDirectoryEntry *pRDE = new CResourceDirectoryEntry(szType, nameDir); + if (!m_cResDir->AddEntry(pRDE)) delete pRDE; } if (!langDir) { // Name doesn't yet exist langDir = new CResourceDirectory(&rd); - nameDir->AddEntry(new CResourceDirectoryEntry(szName, langDir)); + CResourceDirectoryEntry *pRDE = new CResourceDirectoryEntry(szName, langDir); + if (!nameDir->AddEntry(pRDE)) delete pRDE; } if (!data) { // Language doesn't yet exist, hence data nither data = new CResourceDataEntry(lpData, dwSize); - langDir->AddEntry(new CResourceDirectoryEntry(MAKEINTRESOURCEW(wLanguage), data)); + CResourceDirectoryEntry *pRDE = new CResourceDirectoryEntry(MAKEINTRESOURCEWINW(wLanguage), data); + if (!langDir->AddEntry(pRDE)) delete pRDE; } } else if (data) { @@ -218,25 +220,37 @@ bool CResourceEditor::UpdateResourceW(const WCHAR* szType, WCHAR* szName, LANGID } #ifndef _UNICODE -static WCHAR* ResStringToUnicode(const char *szString) { - if (IS_INTRESOURCE(szString)) - return MAKEINTRESOURCEW((ULONG_PTR)szString); - else - return wcsdup_fromTchar(szString, CP_ACP); +static WINWCHAR* ResStringToUnicode(const char *szString) { + if (IS_INTRESOURCE(szString)) return MAKEINTRESOURCEWINW((ULONG_PTR)szString); + WINWCHAR *s = WinWStrDupFromTChar(szString, CP_ACP); + if (!s) throw std::bad_alloc(); + return s; } -static void FreeUnicodeResString(WCHAR* szwString) { - if (!IS_INTRESOURCE(szwString)) - free(szwString); +static void FreeUnicodeResString(WINWCHAR* szwString) { + if (!IS_INTRESOURCE(szwString)) free(szwString); } -#endif - -bool CResourceEditor::UpdateResource(const TCHAR* szType, WORD szName, LANGID wLanguage, BYTE* lpData, DWORD dwSize) { -#ifdef _UNICODE - return UpdateResourceW(szType, MAKEINTRESOURCEW(szName), wLanguage, lpData, dwSize); #else - WCHAR* szwType = ResStringToUnicode(szType); - bool result = UpdateResourceW(szwType, MAKEINTRESOURCEW(szName), wLanguage, lpData, dwSize); +#ifndef _WIN32 +static WINWCHAR* ResStringToUnicode(const TCHAR *s) { + if (IS_INTRESOURCE(s)) return MAKEINTRESOURCEWINW((ULONG_PTR)s); + WCToUTF16LEHlpr cnv; + if (!cnv.Create(s)) throw std::runtime_error("Unicode conversion failed"); + return (WINWCHAR*) cnv.Detach(); +} +static void FreeUnicodeResString(WINWCHAR* s) { + if (!IS_INTRESOURCE(s)) free(s); +} +#endif // ~_WIN32 +#endif // ~_UNICODE + + +bool CResourceEditor::UpdateResourceT(const TCHAR* szType, WORD szName, LANGID wLanguage, BYTE* lpData, DWORD dwSize) { +#if defined(_WIN32) && defined(_UNICODE) + return UpdateResourceW((WINWCHAR*)szType, MAKEINTRESOURCEWINW(szName), wLanguage, lpData, dwSize); +#else + WINWCHAR* szwType = ResStringToUnicode(szType); + bool result = UpdateResourceW(szwType, MAKEINTRESOURCEWINW(szName), wLanguage, lpData, dwSize); FreeUnicodeResString(szwType); return result; #endif @@ -244,7 +258,7 @@ bool CResourceEditor::UpdateResource(const TCHAR* szType, WORD szName, LANGID wL // Returns a copy of the requested resource // Returns 0 if the requested resource can't be found -BYTE* CResourceEditor::GetResourceW(const WCHAR* szType, WCHAR* szName, LANGID wLanguage) { +BYTE* CResourceEditor::GetResourceW(const WINWCHAR* szType, WINWCHAR* szName, LANGID wLanguage) { if (!m_bKeepData) throw runtime_error("Can't GetResource() when bKeepData is false"); @@ -276,12 +290,12 @@ BYTE* CResourceEditor::GetResourceW(const WCHAR* szType, WCHAR* szName, LANGID w return NULL; } -BYTE* CResourceEditor::GetResource(const TCHAR* szType, WORD szName, LANGID wLanguage) { -#ifdef _UNICODE - return GetResourceW(szType, MAKEINTRESOURCEW(szName), wLanguage); +BYTE* CResourceEditor::GetResourceT(const TCHAR* szType, WORD szName, LANGID wLanguage) { +#if defined(_WIN32) && defined(_UNICODE) + return GetResourceW((WINWCHAR*)szType, MAKEINTRESOURCEWINW(szName), wLanguage); #else - WCHAR* szwType = ResStringToUnicode(szType); - BYTE* result = GetResourceW(szwType, MAKEINTRESOURCEW(szName), wLanguage); + WINWCHAR* szwType = ResStringToUnicode(szType); + BYTE* result = GetResourceW(szwType, MAKEINTRESOURCEWINW(szName), wLanguage); FreeUnicodeResString(szwType); return result; #endif @@ -289,7 +303,7 @@ BYTE* CResourceEditor::GetResource(const TCHAR* szType, WORD szName, LANGID wLan // Returns the size of the requested resource // Returns -1 if the requested resource can't be found -int CResourceEditor::GetResourceSizeW(const WCHAR* szType, WCHAR* szName, LANGID wLanguage) { +int CResourceEditor::GetResourceSizeW(const WINWCHAR* szType, WINWCHAR* szName, LANGID wLanguage) { CResourceDirectory* nameDir = 0; CResourceDirectory* langDir = 0; CResourceDataEntry* data = 0; @@ -315,12 +329,12 @@ int CResourceEditor::GetResourceSizeW(const WCHAR* szType, WCHAR* szName, LANGID return -1; } -int CResourceEditor::GetResourceSize(const TCHAR* szType, WORD szName, LANGID wLanguage) { -#ifdef _UNICODE - return GetResourceSizeW(szType, MAKEINTRESOURCEW(szName), wLanguage); +int CResourceEditor::GetResourceSizeT(const TCHAR* szType, WORD szName, LANGID wLanguage) { +#if defined(_WIN32) && defined(_UNICODE) + return GetResourceSizeW((WINWCHAR*)szType, MAKEINTRESOURCEWINW(szName), wLanguage); #else - WCHAR* szwType = ResStringToUnicode(szType); - int result = GetResourceSizeW(szwType, MAKEINTRESOURCEW(szName), wLanguage); + WINWCHAR* szwType = ResStringToUnicode(szType); + int result = GetResourceSizeW(szwType, MAKEINTRESOURCEWINW(szName), wLanguage); FreeUnicodeResString(szwType); return result; #endif @@ -328,7 +342,7 @@ int CResourceEditor::GetResourceSize(const TCHAR* szType, WORD szName, LANGID wL // Returns the offset of the requested resource in the original PE // Returns -1 if the requested resource can't be found -DWORD CResourceEditor::GetResourceOffsetW(const WCHAR* szType, WCHAR* szName, LANGID wLanguage) { +DWORD CResourceEditor::GetResourceOffsetW(const WINWCHAR* szType, WINWCHAR* szName, LANGID wLanguage) { CResourceDirectory* nameDir = 0; CResourceDirectory* langDir = 0; CResourceDataEntry* data = 0; @@ -354,12 +368,12 @@ DWORD CResourceEditor::GetResourceOffsetW(const WCHAR* szType, WCHAR* szName, LA return DWORD(-1); } -DWORD CResourceEditor::GetResourceOffset(const TCHAR* szType, WORD szName, LANGID wLanguage) { -#ifdef _UNICODE - return GetResourceOffsetW(szType, MAKEINTRESOURCEW(szName), wLanguage); +DWORD CResourceEditor::GetResourceOffsetT(const TCHAR* szType, WORD szName, LANGID wLanguage) { +#if defined(_WIN32) && defined(_UNICODE) + return GetResourceOffsetW((WINWCHAR*)szType, MAKEINTRESOURCEWINW(szName), wLanguage); #else - WCHAR* szwType = ResStringToUnicode(szType); - DWORD result = GetResourceOffsetW(szwType, MAKEINTRESOURCEW(szName), wLanguage); + WINWCHAR* szwType = ResStringToUnicode(szType); + DWORD result = GetResourceOffsetW(szwType, MAKEINTRESOURCEWINW(szName), wLanguage); FreeUnicodeResString(szwType); return result; #endif @@ -557,7 +571,7 @@ bool CResourceEditor::SetPESectionVirtualSize(const char* pszSectionName, DWORD CResourceDirectory* CResourceEditor::ScanDirectory(PRESOURCE_DIRECTORY rdRoot, PRESOURCE_DIRECTORY rdToScan) { // Create CResourceDirectory from rdToScan CResourceDirectory* rdc = new CResourceDirectory(PIMAGE_RESOURCE_DIRECTORY(rdToScan)); - WCHAR* szName; + WINWCHAR* szName; PIMAGE_RESOURCE_DATA_ENTRY rde = NULL; // Go through all entries of this resource directory @@ -578,25 +592,24 @@ CResourceDirectory* CResourceEditor::ScanDirectory(PRESOURCE_DIRECTORY rdRoot, P PIMAGE_RESOURCE_DIR_STRING_U rds = PIMAGE_RESOURCE_DIR_STRING_U(rd.UName.NameString.NameOffset + (char*)rdRoot); size_t nameSize = ConvertEndianness(rds->Length); - szName = new WCHAR[nameSize+1]; - wcsncpy(szName, rds->NameString, nameSize); + szName = new WINWCHAR[nameSize+1]; + WinWStrNCpy(szName, WCHARPTR2WINWCHARPTR(rds->NameString), nameSize); szName[nameSize] = 0; } // Else, set the name to this entry's id else - szName = MAKEINTRESOURCEW(ConvertEndianness(rdToScan->Entries[i].UName.Id)); + szName = MAKEINTRESOURCEWINW(ConvertEndianness(rdToScan->Entries[i].UName.Id)); if (rd.UOffset.DirectoryOffset.DataIsDirectory) { - rdc->AddEntry( - new CResourceDirectoryEntry( - szName, - ScanDirectory( - rdRoot, - PRESOURCE_DIRECTORY(rd.UOffset.DirectoryOffset.OffsetToDirectory + (LPBYTE)rdRoot) - ) + CResourceDirectoryEntry *pRDE = new CResourceDirectoryEntry( + szName, + ScanDirectory( + rdRoot, + PRESOURCE_DIRECTORY(rd.UOffset.DirectoryOffset.OffsetToDirectory + (LPBYTE)rdRoot) ) ); + if (!rdc->AddEntry(pRDE)) delete pRDE; } else { @@ -614,18 +627,16 @@ CResourceDirectory* CResourceEditor::ScanDirectory(PRESOURCE_DIRECTORY rdRoot, P { pbData = m_pbPE; // dummy pointer to "nothing" } - - rdc->AddEntry( - new CResourceDirectoryEntry( - szName, - new CResourceDataEntry( - pbData, - ConvertEndianness(rde->Size), - ConvertEndianness(rde->CodePage), - dwOffset - ) + CResourceDirectoryEntry *pRDE = new CResourceDirectoryEntry( + szName, + new CResourceDataEntry( + pbData, + ConvertEndianness(rde->Size), + ConvertEndianness(rde->CodePage), + dwOffset ) ); + if (!rdc->AddEntry(pRDE)) delete pRDE; } // Delete the dynamicly allocated name if it is a name and not an id @@ -707,15 +718,15 @@ void CResourceEditor::WriteRsrcSec(BYTE* pbRsrcSec) { PMY_IMAGE_RESOURCE_DIRECTORY_ENTRY(cRDirE->m_ulWrittenAt)->UName.NameString.NameOffset = ConvertEndianness((DWORD) (seeker - pbRsrcSec)); - WCHAR* szName = cRDirE->GetName(); - WORD iLen = wcslen(szName) + 1; + WINWCHAR* szName = cRDirE->GetName(); + WORD iLen = WinWStrLen(szName) + 1; *(WORD*)seeker = ConvertEndianness(iLen); - CopyMemory(seeker + sizeof(WORD), szName, iLen*sizeof(WCHAR)); + CopyMemory(seeker + sizeof(WORD), szName, iLen*sizeof(WINWCHAR)); - seeker += RALIGN(iLen * sizeof(WCHAR) + sizeof(WORD), 4); + seeker += RALIGN(iLen * sizeof(WINWCHAR) + sizeof(WORD), 4); - delete [] szName; + free(szName); qStrings.pop(); } @@ -793,6 +804,7 @@ CResourceDirectory::CResourceDirectory(PIMAGE_RESOURCE_DIRECTORY prd) { } CResourceDirectory::~CResourceDirectory() { + Destroy(); } ////////////////////////////////////////////////////////////////////// @@ -811,34 +823,33 @@ CResourceDirectoryEntry* CResourceDirectory::GetEntry(unsigned int i) { // This function inserts a new directory entry // It also keeps the directory entries sorted -void CResourceDirectory::AddEntry(CResourceDirectoryEntry* entry) { +bool CResourceDirectory::AddEntry(CResourceDirectoryEntry* entry) { int i = 0; if (entry->HasName()) { - WCHAR* szEntName = entry->GetName(); + WINWCHAR* szEntName = entry->GetName(); for (i = 0; i < m_rdDir.NumberOfNamedEntries; i++) { - WCHAR* szName = m_vEntries[i]->GetName(); - int cmp = wcscmp(szName, szEntName); - delete [] szName; + WINWCHAR* szName = m_vEntries[i]->GetName(); + int cmp = WinWStrCmp(szName, szEntName); + free(szName); if (cmp == 0) { - delete [] szEntName; - return; + free(szEntName); + return false; } if (cmp > 0) break; } - delete [] szEntName; + free(szEntName); m_rdDir.NumberOfNamedEntries++; } else { for (i = m_rdDir.NumberOfNamedEntries; i < m_rdDir.NumberOfNamedEntries+m_rdDir.NumberOfIdEntries; i++) { - if (m_vEntries[i]->GetId() == entry->GetId()) - return; - if (m_vEntries[i]->GetId() > entry->GetId()) - break; + if (m_vEntries[i]->GetId() == entry->GetId()) return false; + if (m_vEntries[i]->GetId() > entry->GetId()) break; } m_rdDir.NumberOfIdEntries++; } m_vEntries.insert(m_vEntries.begin() + i, entry); + return true; } void CResourceDirectory::RemoveEntry(int i) { @@ -857,25 +868,24 @@ int CResourceDirectory::CountEntries() { // Returns the index of a directory entry with the specified name // Name can be a string or an id // Returns -1 if can not be found -int CResourceDirectory::Find(const WCHAR* szName) { +int CResourceDirectory::Find(const WINWCHAR* szName) { if (IS_INTRESOURCE(szName)) return Find((WORD) (ULONG_PTR) szName); else if (szName[0] == L'#') - return Find(WORD(_wtoi(szName + 1))); + return Find(WORD(WinWStrToInt(szName + 1))); for (unsigned int i = 0; i < m_vEntries.size(); i++) { if (!m_vEntries[i]->HasName()) continue; - WCHAR* szEntName = m_vEntries[i]->GetName(); - int cmp = wcscmp(szName, szEntName); - delete [] szEntName; + WINWCHAR* szEntName = m_vEntries[i]->GetName(); + int cmp = WinWStrCmp(szName, szEntName); + free(szEntName); if (!cmp) return i; } - return -1; } @@ -883,13 +893,9 @@ int CResourceDirectory::Find(const WCHAR* szName) { // Returns -1 if can not be found int CResourceDirectory::Find(WORD wId) { for (unsigned int i = 0; i < m_vEntries.size(); i++) { - if (m_vEntries[i]->HasName()) - continue; - - if (wId == m_vEntries[i]->GetId()) - return i; + if (m_vEntries[i]->HasName()) continue; + if (wId == m_vEntries[i]->GetId()) return i; } - return -1; } @@ -899,7 +905,7 @@ DWORD CResourceDirectory::GetSize() { for (unsigned int i = 0; i < m_vEntries.size(); i++) { dwSize += sizeof(MY_IMAGE_RESOURCE_DIRECTORY_ENTRY); if (m_vEntries[i]->HasName()) - dwSize += sizeof(IMAGE_RESOURCE_DIR_STRING_U) + (m_vEntries[i]->GetNameLength()+1)*sizeof(WCHAR); + dwSize += sizeof(IMAGE_RESOURCE_DIR_STRING_U) + (m_vEntries[i]->GetNameLength()+1)*sizeof(WINWCHAR); if (m_vEntries[i]->IsDataDirectory()) dwSize += m_vEntries[i]->GetSubDirectory()->GetSize(); else { @@ -920,7 +926,9 @@ void CResourceDirectory::Destroy() { } else delete m_vEntries[i]->GetDataEntry(); + delete m_vEntries[i]; } + m_vEntries.clear(); } ////////////////////////////////////////////////////////////////////// @@ -933,7 +941,7 @@ void CResourceDirectory::Destroy() { // Construction/Destruction ////////////////////////////////////////////////////////////////////// -CResourceDirectoryEntry::CResourceDirectoryEntry(const WCHAR* szName, CResourceDirectory* rdSubDir) { +CResourceDirectoryEntry::CResourceDirectoryEntry(const WINWCHAR* szName, CResourceDirectory* rdSubDir) { if (IS_INTRESOURCE(szName)) { m_bHasName = false; m_szName = 0; @@ -941,13 +949,13 @@ CResourceDirectoryEntry::CResourceDirectoryEntry(const WCHAR* szName, CResourceD } else { m_bHasName = true; - m_szName = _wcsdup(szName); + m_szName = WinWStrDupFromWinWStr(szName); } m_bIsDataDirectory = true; m_rdSubDir = rdSubDir; } -CResourceDirectoryEntry::CResourceDirectoryEntry(const WCHAR* szName, CResourceDataEntry* rdeData) { +CResourceDirectoryEntry::CResourceDirectoryEntry(const WINWCHAR* szName, CResourceDataEntry* rdeData) { if (IS_INTRESOURCE(szName)) { m_bHasName = false; m_szName = 0; @@ -955,7 +963,7 @@ CResourceDirectoryEntry::CResourceDirectoryEntry(const WCHAR* szName, CResourceD } else { m_bHasName = true; - m_szName = _wcsdup(szName); + m_szName = WinWStrDupFromWinWStr(szName); } m_bIsDataDirectory = false; m_rdeData = rdeData; @@ -963,7 +971,7 @@ CResourceDirectoryEntry::CResourceDirectoryEntry(const WCHAR* szName, CResourceD CResourceDirectoryEntry::~CResourceDirectoryEntry() { if (m_szName && m_bHasName) - delete [] m_szName; + free(m_szName); } ////////////////////////////////////////////////////////////////////// @@ -975,20 +983,16 @@ bool CResourceDirectoryEntry::HasName() { } // Don't forget to free the memory used by the string after usage! -WCHAR* CResourceDirectoryEntry::GetName() { - if (!m_bHasName) - return 0; - return _wcsdup(m_szName); +WINWCHAR* CResourceDirectoryEntry::GetName() { + return m_bHasName ? WinWStrDupFromWinWStr(m_szName) : 0; } int CResourceDirectoryEntry::GetNameLength() { - return wcslen(m_szName); + return WinWStrLen(m_szName); } WORD CResourceDirectoryEntry::GetId() { - if (m_bHasName) - return 0; - return m_wId; + return m_bHasName ? 0 : m_wId; } bool CResourceDirectoryEntry::IsDataDirectory() { diff --git a/Source/ResourceEditor.h b/Source/ResourceEditor.h index c53407b4..efbb4357 100644 --- a/Source/ResourceEditor.h +++ b/Source/ResourceEditor.h @@ -24,10 +24,11 @@ #pragma once #endif // _MSC_VER > 1000 - -#include - #include "Platform.h" +#include "winchar.h" +#include +#include + #ifdef _WIN32 #include #else @@ -114,10 +115,50 @@ public: CResourceEditor(BYTE* pbPE, int iSize, bool bKeepData = true); virtual ~CResourceEditor(); - bool UpdateResource (const TCHAR* szType, WORD szName, LANGID wLanguage, BYTE* lpData, DWORD dwSize); - BYTE* GetResource (const TCHAR* szType, WORD szName, LANGID wLanguage); - int GetResourceSize (const TCHAR* szType, WORD szName, LANGID wLanguage); - DWORD GetResourceOffset(const TCHAR* szType, WORD szName, LANGID wLanguage); + // On POSIX+Unicode GetResource(RT_VERSION,..) is not TCHAR nor WINWCHAR, it is WCHAR/UINT16. + // If it passes IS_INTRESOURCE we must allow it. + // Use TCHAR* for real strings. If you need to pass in a WINWCHAR*, make GetResourceW public... + template bool UpdateResource(const T*Type, WORD Name, LANGID Lang, BYTE*Data, DWORD Size) + { + if (sizeof(T) != sizeof(TCHAR) && !IS_INTRESOURCE(Type)) + { + assert(IS_INTRESOURCE(Type)); + return false; + } + return UpdateResourceT((const TCHAR*) Type, Name, Lang, Data, Size); + } + template BYTE* GetResource(const T*Type, WORD Name, LANGID Lang) + { + if (sizeof(T) != sizeof(TCHAR) && !IS_INTRESOURCE(Type)) + { + assert(IS_INTRESOURCE(Type)); + return NULL; + } + return GetResourceT((const TCHAR*) Type, Name, Lang); + } + template int GetResourceSize(const T*Type, WORD Name, LANGID Lang) + { + if (sizeof(T) != sizeof(TCHAR) && !IS_INTRESOURCE(Type)) + { + assert(IS_INTRESOURCE(Type)); + return -1; + } + return GetResourceSizeT((const TCHAR*) Type, Name, Lang); + } + template DWORD GetResourceOffset(const T*Type, WORD Name, LANGID Lang) + { + if (sizeof(T) != sizeof(TCHAR) && !IS_INTRESOURCE(Type)) + { + assert(IS_INTRESOURCE(Type)); + return -1; + } + return GetResourceOffsetT((const TCHAR*) Type, Name, Lang); + } + + bool UpdateResourceT (const TCHAR* szType, WORD szName, LANGID wLanguage, BYTE* lpData, DWORD dwSize); + BYTE* GetResourceT (const TCHAR* szType, WORD szName, LANGID wLanguage); + int GetResourceSizeT (const TCHAR* szType, WORD szName, LANGID wLanguage); + DWORD GetResourceOffsetT(const TCHAR* szType, WORD szName, LANGID wLanguage); void FreeResource(BYTE* pbResource); // The section name must be in ASCII. @@ -135,10 +176,10 @@ public: DWORD *pdwSectionIndex = NULL ); private: - bool UpdateResourceW(const WCHAR* szType, WCHAR* szName, LANGID wLanguage, BYTE* lpData, DWORD dwSize); - BYTE* GetResourceW(const WCHAR* szType, WCHAR* szName, LANGID wLanguage); - int GetResourceSizeW(const WCHAR* szType, WCHAR* szName, LANGID wLanguage); - DWORD GetResourceOffsetW(const WCHAR* szType, WCHAR* szName, LANGID wLanguage); + bool UpdateResourceW(const WINWCHAR* szType, WINWCHAR* szName, LANGID wLanguage, BYTE* lpData, DWORD dwSize); + BYTE* GetResourceW(const WINWCHAR* szType, WINWCHAR* szName, LANGID wLanguage); + int GetResourceSizeW(const WINWCHAR* szType, WINWCHAR* szName, LANGID wLanguage); + DWORD GetResourceOffsetW(const WINWCHAR* szType, WINWCHAR* szName, LANGID wLanguage); private: BYTE* m_pbPE; @@ -169,10 +210,10 @@ public: IMAGE_RESOURCE_DIRECTORY GetInfo(); CResourceDirectoryEntry* GetEntry(unsigned int i); - void AddEntry(CResourceDirectoryEntry* entry); + bool AddEntry(CResourceDirectoryEntry* entry); void RemoveEntry(int i); int CountEntries(); - int Find(const WCHAR* szName); + int Find(const WINWCHAR* szName); int Find(WORD wId); DWORD GetSize(); @@ -188,12 +229,12 @@ private: class CResourceDirectoryEntry { public: - CResourceDirectoryEntry(const WCHAR* szName, CResourceDirectory* rdSubDir); - CResourceDirectoryEntry(const WCHAR* szName, CResourceDataEntry* rdeData); + CResourceDirectoryEntry(const WINWCHAR* szName, CResourceDirectory* rdSubDir); + CResourceDirectoryEntry(const WINWCHAR* szName, CResourceDataEntry* rdeData); virtual ~CResourceDirectoryEntry(); bool HasName(); - WCHAR* GetName(); + WINWCHAR* GetName(); int GetNameLength(); WORD GetId(); @@ -207,7 +248,7 @@ public: private: bool m_bHasName; - WCHAR* m_szName; + WINWCHAR* m_szName; WORD m_wId; bool m_bIsDataDirectory; diff --git a/Source/ResourceVersionInfo.cpp b/Source/ResourceVersionInfo.cpp index 2767d6ec..351dd376 100644 --- a/Source/ResourceVersionInfo.cpp +++ b/Source/ResourceVersionInfo.cpp @@ -21,6 +21,7 @@ #include "Platform.h" #include "util.h" #include "winchar.h" +#include "utf.h" #ifdef NSIS_SUPPORT_VERSION_INFO @@ -129,7 +130,7 @@ void CResourceVersionInfo::SetProductVersion(int HighPart, int LowPart) // Jim Park: Not sure where this is used. int GetVersionHeader (LPSTR &p, WORD &wLength, WORD &wValueLength, WORD &wType) { - WCHAR *szKey; + WINWCHAR *szKey; char * baseP; baseP = p; @@ -139,11 +140,11 @@ int GetVersionHeader (LPSTR &p, WORD &wLength, WORD &wValueLength, WORD &wType) p += sizeof(WORD); wType = *(WORD*)p; p += sizeof(WORD); - szKey = (WCHAR*)p; - p += (wcslen(szKey) + 1) * sizeof (WCHAR); + szKey = (WINWCHAR*)p; + p += (WinWStrLen(szKey) + 1) * sizeof (WINWCHAR); while ( ((ULONG_PTR)p % 4) != 0 ) p++; - return p - baseP; + return p - baseP; } DWORD ZEROS = 0; @@ -162,16 +163,16 @@ void PadStream (GrowBuf &strm) // @param wType If type is 1, it's a wchar_t string, so save value length appropriately. // @param key The string key // @param value The value mapped to string key. -void SaveVersionHeader (GrowBuf &strm, WORD wLength, WORD wValueLength, WORD wType, const WCHAR *key, void *value) +static void SaveVersionHeaderUTF16LE(GrowBuf &strm, WORD wLength, WORD wValueLength, WORD wType, const unsigned short *key, void *value) { WORD valueLen; WORD keyLen; - strm.add (&wLength, sizeof (wLength)); + strm.add (&wLength, sizeof(wLength)); - strm.add (&wValueLength, sizeof (wValueLength)); + strm.add (&wValueLength, sizeof(wValueLength)); strm.add (&wType, sizeof (wType)); - keyLen = WORD((wcslen(key) + 1) * sizeof (WCHAR)); + keyLen = WORD((StrLenUTF16(key) + 1) * sizeof(WINWCHAR)); strm.add ((void*)key, keyLen); PadStream(strm); @@ -180,20 +181,26 @@ void SaveVersionHeader (GrowBuf &strm, WORD wLength, WORD wValueLength, WORD wTy { valueLen = wValueLength; if ( wType == 1 ) - valueLen = valueLen * WORD(sizeof (WCHAR)); + valueLen = valueLen * WORD(sizeof(WINWCHAR)); strm.add (value, valueLen); } } +static void SaveVersionHeader(GrowBuf &strm, WORD wLength, WORD wValueLength, WORD wType, const wchar_t *key, void *value) +{ + WCToUTF16LEHlpr cnv; + if (!cnv.Create(key)) throw std::runtime_error("Unicode conversion failed"); + SaveVersionHeaderUTF16LE(strm, wLength, wValueLength, wType, cnv.Get(), value); + cnv.Destroy(); +} void CResourceVersionInfo::ExportToStream(GrowBuf &strm, int Index) { DWORD v; WORD wSize; int p, p1; - WCHAR *KeyName, *KeyValue; strm.resize(0); - SaveVersionHeader (strm, 0, sizeof (VS_FIXEDFILEINFO), 0, L"VS_VERSION_INFO", &m_FixedInfo); + SaveVersionHeader(strm, 0, sizeof (VS_FIXEDFILEINFO), 0, L"VS_VERSION_INFO", &m_FixedInfo); DefineList *pChildStrings = m_ChildStringLists.get_strings(Index); if ( pChildStrings->getnum() > 0 ) @@ -201,20 +208,19 @@ void CResourceVersionInfo::ExportToStream(GrowBuf &strm, int Index) GrowBuf stringInfoStream; int codepage = m_ChildStringLists.get_codepage(Index); LANGID langid = m_ChildStringLists.get_lang(Index); - WCHAR Buff[16]; + wchar_t Buff[16]; _snwprintf(Buff, COUNTOF(Buff), L"%04x%04x", langid, codepage); - SaveVersionHeader (stringInfoStream, 0, 0, 0, Buff, &ZEROS); + SaveVersionHeader(stringInfoStream, 0, 0, 0, Buff, &ZEROS); for ( int i = 0; i < pChildStrings->getnum(); i++ ) { PadStream (stringInfoStream); - + WCToUTF16LEHlpr cnvName, cnvValue; + if (!cnvName.Create(pChildStrings->getname(i), codepage)) throw std::runtime_error("Unicode conversion failed"); + if (!cnvValue.Create(pChildStrings->getvalue(i), codepage)) throw std::runtime_error("Unicode conversion failed"); p = stringInfoStream.getlen(); - KeyName = wcsdup_fromTchar(pChildStrings->getname(i), codepage); - KeyValue = wcsdup_fromTchar(pChildStrings->getvalue(i), codepage); - SaveVersionHeader (stringInfoStream, 0, WORD(wcslen(KeyValue) + 1), 1, KeyName, (void*)KeyValue); - free(KeyName); - free(KeyValue); + SaveVersionHeaderUTF16LE(stringInfoStream, 0, WORD(StrLenUTF16(cnvValue.Get()) + 1), 1, cnvName.Get(), (void*)cnvValue.Get()); + cnvName.Destroy(), cnvValue.Destroy(); wSize = WORD(stringInfoStream.getlen() - p); *(WORD*)((PBYTE)stringInfoStream.get()+p)=wSize; @@ -225,7 +231,7 @@ void CResourceVersionInfo::ExportToStream(GrowBuf &strm, int Index) PadStream (strm); p = strm.getlen(); - SaveVersionHeader (strm, 0, 0, 0, L"StringFileInfo", &ZEROS); + SaveVersionHeader(strm, 0, 0, 0, L"StringFileInfo", &ZEROS); strm.add (stringInfoStream.get(), stringInfoStream.getlen()); wSize = WORD(strm.getlen() - p); @@ -237,11 +243,11 @@ void CResourceVersionInfo::ExportToStream(GrowBuf &strm, int Index) { PadStream (strm); p = strm.getlen(); - SaveVersionHeader (strm, 0, 0, 0, L"VarFileInfo", &ZEROS); + SaveVersionHeader(strm, 0, 0, 0, L"VarFileInfo", &ZEROS); PadStream (strm); p1 = strm.getlen(); - SaveVersionHeader (strm, 0, 0, 0, L"Translation", &ZEROS); + SaveVersionHeader(strm, 0, 0, 0, L"Translation", &ZEROS); // First add selected code language translation v = MAKELONG(m_ChildStringLists.get_lang(Index), m_ChildStringLists.get_codepage(Index)); diff --git a/Source/build.cpp b/Source/build.cpp index b976b434..03172d34 100644 --- a/Source/build.cpp +++ b/Source/build.cpp @@ -391,7 +391,7 @@ void CEXEBuild::initialize(const TCHAR *makensis_path) #ifndef NSIS_CONFIG_CONST_DATA_PATH nsis_dir = get_dir_name(get_executable_dir(makensis_path)); #else - nsis_dir = PREFIX_DATA; + nsis_dir = PosixBug_CtoTString(PREFIX_DATA); #endif } definedlist.add(_T("NSISDIR"), nsis_dir.c_str()); @@ -419,9 +419,10 @@ int CEXEBuild::getcurdbsize() { return cur_datablock->getlen(); } void CEXEBuild::init_shellconstantvalues() { static bool done = false; - if (done) return ; - done = true; + if (done) return ; else done = true; + const int orgunmode = uninstall_mode; + set_uninstall_mode(0); // Note: The order matters because some of the strings are preprocessed and cf must be <= 0x40 unsigned int pf = add_asciistring(_T("ProgramFilesDir"), 0); unsigned int cf = add_asciistring(_T("CommonFilesDir"), 0); @@ -445,7 +446,6 @@ void CEXEBuild::init_shellconstantvalues() throw out_of_range("Internal compiler error: too many strings added to strings block before adding shell constants!"); } - const int orgunmode = uninstall_mode; set_uninstall_mode(1); unsigned int unpf = add_asciistring(_T("ProgramFilesDir"), 0); unsigned int uncf = add_asciistring(_T("CommonFilesDir"), 0); @@ -473,7 +473,7 @@ int CEXEBuild::add_string(const TCHAR *string, int process/*=1*/, UINT codepage/ if (!string || !*string) return 0; build_lockedunicodetarget = true; init_shellconstantvalues(); - if ((unsigned)-2 == codepage) + if ((UINT)-2 == codepage) { codepage = curlinereader ? curlinereader->StreamEncoding().GetCodepage() : CP_UTF8; // If the current source file is Unicode we have to pick a real codepage for ANSI! @@ -500,7 +500,7 @@ int CEXEBuild::add_string(const TCHAR *string, int process/*=1*/, UINT codepage/ ExpandoString buf; // NOTE: It is impossible to know how much preprocessing will increase the size, we have to guess buf.Reserve(_tcsclen(string) * 2); - preprocess_string(buf, string, codepage); + preprocess_string(buf, string, codepage); // BUGBUG: This could overflow buf i = cur_strlist->add(buf, (WORD)codepage, true); } else @@ -624,8 +624,8 @@ int CEXEBuild::preprocess_string(TCHAR *out, const TCHAR *in, WORD codepage/*=CP //m_UserVarNames.inc_reference(idxUserVar); *out++ = (TCHAR) NS_VAR_CODE; // Named user variable; WORD w = FIX_ENDIAN_INT16(CODE_SHORT(idxUserVar)); - memcpy(out, &w, sizeof(WORD)); - out += sizeof(WORD)/sizeof(TCHAR); + unsigned int w4 = sizeof(TCHAR) > 2 ? FIX_ENDIAN_INT32(CODE_SHORT(idxUserVar)) : w; // Maybe this is too much endian fixing? + if (sizeof(TCHAR) < 2) *((WORD*)out) = w, out += 2; else *out = (TCHAR) w4, out++; p += pUserVarName-p; // zip past the user var string. bProceced = true; break; @@ -680,8 +680,8 @@ int CEXEBuild::preprocess_string(TCHAR *out, const TCHAR *in, WORD codepage/*=CP { *out++ = (TCHAR)NS_LANG_CODE; // Next word is lang-string Identifier WORD w = FIX_ENDIAN_INT16(CODE_SHORT(-idx-1)); - memcpy(out, &w, sizeof(WORD)); - out += sizeof(WORD)/sizeof(TCHAR); + unsigned int w4 = sizeof(TCHAR) > 2 ? FIX_ENDIAN_INT32(CODE_SHORT(-idx-1)) : w; // Maybe this is too much endian fixing? + if (sizeof(TCHAR) < 2) *((WORD*)out) = w, out += 2; else *out = (TCHAR) w4, out++; p += _tcslen(cp) + 2; bProceced = true; } @@ -722,7 +722,7 @@ int CEXEBuild::preprocess_string(TCHAR *out, const TCHAR *in, WORD codepage/*=CP if (_tcsstr(tbuf,_T(" "))) _tcsstr(tbuf,_T(" "))[0]=0; } if ( bDoWarning ) - warning_fl(_T("unknown variable/constant \"%s\" detected, ignoring"),tbuf); + warning_fl(_T("unknown variable/constant \"%") NPRIs _T("\" detected, ignoring"),tbuf); i = _T('$'); // redundant since i is already '$' and has // not changed. } @@ -837,7 +837,7 @@ int CEXEBuild::add_db_data(IMMap *mmap) // returns offset int n = compressor->Init(build_compress_level, build_compress_dict_size); if (n != C_OK) { - ERROR_MSG(_T("Internal compiler error #12345: deflateInit() failed(%s [%d]).\n"), compressor->GetErrStr(n), n); + ERROR_MSG(_T("Internal compiler error #12345: deflateInit() failed(%") NPRIs _T(" [%d]).\n"), compressor->GetErrStr(n), n); extern void quit(); quit(); } @@ -853,7 +853,7 @@ int CEXEBuild::add_db_data(IMMap *mmap) // returns offset compressor->SetNextOut((char*) db->get(st + sizeof(int) + bufferlen - avail_out, out_len), out_len); if ((ret = compressor->Compress(0)) < 0) { - ERROR_MSG(_T("Error: add_db_data() - compress() failed(%s [%d])\n"), compressor->GetErrStr(ret), ret); + ERROR_MSG(_T("Error: add_db_data() - compress() failed(%") NPRIs _T(" [%d])\n"), compressor->GetErrStr(ret), ret); return -1; } mmap->release(); @@ -884,7 +884,7 @@ int CEXEBuild::add_db_data(IMMap *mmap) // returns offset compressor->SetNextOut(out, out_len); if ((ret = compressor->Compress(C_FINISH)) < 0) { - ERROR_MSG(_T("Error: add_db_data() - compress() failed(%s [%d])\n"), compressor->GetErrStr(ret), ret); + ERROR_MSG(_T("Error: add_db_data() - compress() failed(%") NPRIs _T(" [%d])\n"), compressor->GetErrStr(ret), ret); return -1; } @@ -976,7 +976,7 @@ int CEXEBuild::add_data(const char *data, int length, IGrowBuf *dblock) // retur int n = compressor->Init(build_compress_level, build_compress_dict_size); if (n != C_OK) { - ERROR_MSG(_T("Internal compiler error #12345: deflateInit() failed(%s [%d]).\n"), compressor->GetErrStr(n), n); + ERROR_MSG(_T("Internal compiler error #12345: deflateInit() failed(%") NPRIs _T(" [%d]).\n"), compressor->GetErrStr(n), n); extern void quit(); quit(); } @@ -1043,13 +1043,13 @@ int CEXEBuild::add_label(const TCHAR *name) if ((*name == _T('.') || (t->code >= cs && t->code <= ce)) && t->name_ptr==offs) { - if (*name == _T('.')) ERROR_MSG(_T("Error: global label \"%s\" already declared\n"),name); + if (*name == _T('.')) ERROR_MSG(_T("Error: global label \"%") NPRIs _T("\" already declared\n"),name); else { const TCHAR *szType = _T("section"); if (build_cursection_isfunc) szType = _T("function"); - ERROR_MSG(_T("Error: label \"%s\" already declared in %s\n"),name,szType); + ERROR_MSG(_T("Error: label \"%") NPRIs _T("\" already declared in %") NPRIs _T("\n"),name,szType); } return PS_ERROR; } @@ -1099,7 +1099,7 @@ int CEXEBuild::add_function(const TCHAR *funname) { if (tmp[x].name_ptr == addr) { - ERROR_MSG(_T("Error: Function named \"%s\" already exists.\n"),funname); + ERROR_MSG(_T("Error: Function named \"%") NPRIs _T("\" already exists.\n"),funname); return PS_ERROR; } } @@ -1267,7 +1267,7 @@ int CEXEBuild::add_section(const TCHAR *secname, const TCHAR *defname, int expan { if (uninstall_mode != old_uninstall_mode) { - ERROR_MSG(_T("Error: Can't create %s section in %s section group (use SectionGroupEnd first)\n"), uninstall_mode ? _T("uninstaller") : _T("installer"), old_uninstall_mode ? _T("uninstaller") : _T("installer")); + ERROR_MSG(_T("Error: Can't create %") NPRIs _T(" section in %") NPRIs _T(" section group (use SectionGroupEnd first)\n"), uninstall_mode ? _T("uninstaller") : _T("installer"), old_uninstall_mode ? _T("uninstaller") : _T("installer")); return PS_ERROR; } } @@ -1287,7 +1287,7 @@ int CEXEBuild::add_section(const TCHAR *secname, const TCHAR *defname, int expan wsprintf(buf, _T("%d"), cur_header->blocks[NB_SECTIONS].num); if (definedlist.add(defname, buf)) { - ERROR_MSG(_T("Error: \"%s\" already defined, can't assign section index!\n"), defname); + ERROR_MSG(_T("Error: \"%") NPRIs _T("\" already defined, can't assign section index!\n"), defname); return PS_ERROR; } } @@ -1417,7 +1417,7 @@ int CEXEBuild::resolve_jump_int(const TCHAR *fn, int *a, int offs, int start, in s++; } - ERROR_MSG(_T("Error: could not resolve label \"%s\" in %s\n"),lname,fn); + ERROR_MSG(_T("Error: could not resolve label \"%") NPRIs _T("\" in %") NPRIs _T("\n"),lname,fn); return 1; } } @@ -1443,7 +1443,7 @@ int CEXEBuild::resolve_call_int(const TCHAR *fn, const TCHAR *str, int fptr, int } sec++; } - ERROR_MSG(_T("Error: resolving %s function \"%s\" in %s\n"),str,(TCHAR*)ns_func.get()+fptr,fn); + ERROR_MSG(_T("Error: resolving %") NPRIs _T(" function \"%") NPRIs _T("\" in %") NPRIs _T("\n"),str,(TCHAR*)ns_func.get()+fptr,fn); ERROR_MSG(_T("Note: uninstall functions must begin with \"un.\", and install functions must not\n")); return 1; } @@ -1546,7 +1546,7 @@ int CEXEBuild::resolve_coderefs(const TCHAR *str) for (x = sec->code; x < sec->code+sec->code_size; x ++) { TCHAR fname[1024]; - wsprintf(fname,_T("function \"%s\""),ns_func.get()+sec->name_ptr); + wsprintf(fname,_T("function \"%") NPRIs _T("\""),ns_func.get()+sec->name_ptr); if (resolve_instruction(fname,str,w+x,x,sec->code,sec->code+sec->code_size)) return 1; } sec++; @@ -1570,8 +1570,8 @@ int CEXEBuild::resolve_coderefs(const TCHAR *str) // normal string cur_strlist->get(x,section_name); } - if (x) wsprintf(fname,_T("%s section \"%s\" (%d)"),str,section_name.c_str(),cnt); - else wsprintf(fname,_T("unnamed %s section (%d)"),str,cnt); + if (x) wsprintf(fname,_T("%") NPRIs _T(" section \"%") NPRIs _T("\" (%d)"),str,section_name.c_str(),cnt); + else wsprintf(fname,_T("unnamed %") NPRIs _T(" section (%d)"),str,cnt); for (x = sec->code; x < sec->code+sec->code_size; x ++) { if (resolve_instruction(fname,str,w+x,x,sec->code,sec->code+sec->code_size)) @@ -1587,7 +1587,7 @@ int CEXEBuild::resolve_coderefs(const TCHAR *str) int i = 0; while (i < cur_header->blocks[NB_PAGES].num) { TCHAR pagestr[1024]; - wsprintf(pagestr, _T("%s pages"), str); + wsprintf(pagestr, _T("%") NPRIs _T(" pages"), str); if (resolve_call_int(pagestr,p->dlg_id?_T("pre-page"):_T("create-page"),p->prefunc,&p->prefunc)) return 1; if (resolve_call_int(pagestr,_T("show-page"),p->showfunc,&p->showfunc)) return 1; if (resolve_call_int(pagestr,_T("leave-page"),p->leavefunc,&p->leavefunc)) return 1; @@ -1606,21 +1606,21 @@ int CEXEBuild::resolve_coderefs(const TCHAR *str) const TCHAR *name; int *p; } callbacks[] = { - {_T("%s.onInit"), &cur_header->code_onInit}, - {_T("%s.on%sInstSuccess"), &cur_header->code_onInstSuccess}, - {_T("%s.on%sInstFailed"), &cur_header->code_onInstFailed}, - {_T("%s.onUserAbort"), &cur_header->code_onUserAbort}, - {_T("%s.onVerifyInstDir"), &cur_header->code_onVerifyInstDir}, + {_T("%") NPRIs _T(".onInit"), &cur_header->code_onInit}, + {_T("%") NPRIs _T(".on%") NPRIs _T("InstSuccess"), &cur_header->code_onInstSuccess}, + {_T("%") NPRIs _T(".on%") NPRIs _T("InstFailed"), &cur_header->code_onInstFailed}, + {_T("%") NPRIs _T(".onUserAbort"), &cur_header->code_onUserAbort}, + {_T("%") NPRIs _T(".onVerifyInstDir"), &cur_header->code_onVerifyInstDir}, #ifdef NSIS_CONFIG_ENHANCEDUI_SUPPORT - {_T("%s.onGUIInit"), &cur_header->code_onGUIInit}, - {_T("%s.onGUIEnd"), &cur_header->code_onGUIEnd}, - {_T("%s.onMouseOverSection"), &cur_header->code_onMouseOverSection}, + {_T("%") NPRIs _T(".onGUIInit"), &cur_header->code_onGUIInit}, + {_T("%") NPRIs _T(".onGUIEnd"), &cur_header->code_onGUIEnd}, + {_T("%") NPRIs _T(".onMouseOverSection"), &cur_header->code_onMouseOverSection}, #endif//NSIS_CONFIG_ENHANCEDUI_SUPPORT #ifdef NSIS_CONFIG_COMPONENTPAGE - {_T("%s.onSelChange"), &cur_header->code_onSelChange}, + {_T("%") NPRIs _T(".onSelChange"), &cur_header->code_onSelChange}, #endif//NSIS_CONFIG_COMPONENTPAGE #ifdef NSIS_SUPPORT_REBOOT - {_T("%s.onRebootFailed"), &cur_header->code_onRebootFailed}, + {_T("%") NPRIs _T(".onRebootFailed"), &cur_header->code_onRebootFailed}, #endif//NSIS_SUPPORT_REBOOT {0, 0} }; @@ -1630,9 +1630,9 @@ int CEXEBuild::resolve_coderefs(const TCHAR *str) TCHAR fname[1024]; wsprintf(fname, callbacks[i].name, un, un); TCHAR cbstr[1024]; - wsprintf(cbstr, _T("%s callback"), str); + wsprintf(cbstr, _T("%") NPRIs _T(" callback"), str); TCHAR cbstr2[1024]; - wsprintf(cbstr2, _T("%s.callbacks"), un); + wsprintf(cbstr2, _T("%") NPRIs _T(".callbacks"), un); if (resolve_call_int(cbstr,cbstr2,ns_func.find(fname,0),callbacks[i].p)) return PS_ERROR; @@ -1653,7 +1653,7 @@ int CEXEBuild::resolve_coderefs(const TCHAR *str) { if (sec->code_size>0) { - warning(_T("%s function \"%s\" not referenced - zeroing code (%d-%d) out\n"),str, + warning(_T("%") NPRIs _T(" function \"%") NPRIs _T("\" not referenced - zeroing code (%d-%d) out\n"),str, ns_func.get()+sec->name_ptr, sec->code,sec->code+sec->code_size); memset(w+sec->code,0,sec->code_size*sizeof(entry)); @@ -1673,8 +1673,8 @@ int CEXEBuild::resolve_coderefs(const TCHAR *str) if (!t->flags) { TCHAR *n=(TCHAR*)ns_label.get()+t->name_ptr; - if (*n == _T('.')) warning(_T("global label \"%s\" not used"),n); - else warning(_T("label \"%s\" not used"),n); + if (*n == _T('.')) warning(_T("global label \"%") NPRIs _T("\" not used"),n); + else warning(_T("label \"%") NPRIs _T("\" not used"),n); } t++; } @@ -1751,7 +1751,6 @@ int CEXEBuild::add_page(int type) cur_pages->add(&pg,sizeof(page)); cur_page = (page *)cur_pages->get() + cur_header->blocks[NB_PAGES].num++; - cur_page_type = type; set_code_type_predefines(ids[type].name); @@ -1786,7 +1785,7 @@ int CEXEBuild::AddVersionInfo() if ( !(2 & version_fixedflags) ) { // This error string should match the one used by the TOK_VI_SETFILEVERSION handler - ERROR_MSG(_T("Error: invalid %s format, should be X.X.X.X\n"),_T("VIProductVersion")); + ERROR_MSG(_T("Error: invalid %") NPRIs _T(" format, should be X.X.X.X\n"),_T("VIProductVersion")); return PS_ERROR; } @@ -1808,7 +1807,7 @@ int CEXEBuild::AddVersionInfo() { if ( !*recverkeys ) break; if ( !rVersionInfo.FindKey(lang_id, code_page, recverkeys) ) - warning(_T("Generating version information for language \"%04d-%s\" without standard key \"%s\""), lang_id, lang_name, recverkeys); + warning(_T("Generating version information for language \"%04d-%") NPRIs _T("\" without standard key \"%") NPRIs _T("\""), lang_id, lang_name, recverkeys); recverkeys += _tcsclen(recverkeys) + 1; } @@ -1817,7 +1816,7 @@ int CEXEBuild::AddVersionInfo() } } catch (exception& err) { - ERROR_MSG(_T("Error adding version information: %s\n"), CtoTStrParam(err.what())); + ERROR_MSG(_T("Error adding version information: %") NPRIs _T("\n"), CtoTStrParam(err.what())); return PS_ERROR; } } @@ -2134,7 +2133,7 @@ again: } if (!instlog_used) { - warning(_T("%sage instfiles not used, no sections will be executed!"), uninstall_mode ? _T("Uninstall p") : _T("P")); + warning(_T("%") NPRIs _T("age instfiles not used, no sections will be executed!"), uninstall_mode ? _T("Uninstall p") : _T("P")); } } } @@ -2223,7 +2222,7 @@ again: SCRIPT_MSG(_T("Done!\n")); } catch (exception& err) { - ERROR_MSG(_T("\nError: %s\n"), CtoTStrParam(err.what())); + ERROR_MSG(_T("\nError: %") NPRIs _T("\n"), CtoTStrParam(err.what())); return PS_ERROR; } @@ -2335,12 +2334,12 @@ int CEXEBuild::SetVarsSection() int stringSize = NSIS_MAX_STRLEN*(build_unicode?sizeof(TCHAR):sizeof(char)); if (!res_editor->SetPESectionVirtualSize(NSIS_VARS_SECTION, MaxUserVars * stringSize)) { - ERROR_MSG(_T("Internal compiler error #12346: invalid exehead cannot find section \"%s\"!\n"), _T(NSIS_VARS_SECTION)); + ERROR_MSG(_T("Internal compiler error #12346: invalid exehead cannot find section \"%") NPRIs _T("\"!\n"), _T(NSIS_VARS_SECTION)); return PS_ERROR; } } catch (exception& err) { - ERROR_MSG(_T("\nError: %s\n"), CtoTStrParam(err.what())); + ERROR_MSG(_T("\nError: %") NPRIs _T("\n"), CtoTStrParam(err.what())); return PS_ERROR; } @@ -2361,7 +2360,7 @@ int CEXEBuild::SetManifest() res_editor->UpdateResource(MAKEINTRESOURCE(24), 1, NSIS_DEFAULT_LANG, (LPBYTE) manifest.c_str(), manifest.length()); } catch (exception& err) { - ERROR_MSG(_T("Error setting manifest: %s\n"), CtoTStrParam(err.what())); + ERROR_MSG(_T("Error setting manifest: %") NPRIs _T("\n"), CtoTStrParam(err.what())); return PS_ERROR; } @@ -2378,7 +2377,7 @@ int CEXEBuild::UpdatePEHeader() // terminal services aware headers->OptionalHeader.DllCharacteristics |= IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE; } catch (std::runtime_error& err) { - ERROR_MSG(_T("Error updating PE headers: %s\n"), CtoTStrParam(err.what())); + ERROR_MSG(_T("Error updating PE headers: %") NPRIs _T("\n"), CtoTStrParam(err.what())); return PS_ERROR; } @@ -2495,7 +2494,7 @@ int CEXEBuild::pack_exe_header() FILE *tmpfile=FOPEN(build_packname,("wb")); if (!tmpfile) { - ERROR_MSG(_T("Error: writing temporary file \"%s\" for pack\n"),build_packname); + ERROR_MSG(_T("Error: writing temporary file \"%") NPRIs _T("\" for pack\n"),build_packname); return PS_ERROR; } fwrite(m_exehead,1,m_exehead_size,tmpfile); @@ -2503,7 +2502,7 @@ int CEXEBuild::pack_exe_header() if (sane_system(build_packcmd) == -1) { _tremove(build_packname); - ERROR_MSG(_T("Error: calling packer on \"%s\"\n"),build_packname); + ERROR_MSG(_T("Error: calling packer on \"%") NPRIs _T("\"\n"),build_packname); return PS_ERROR; } @@ -2512,7 +2511,7 @@ int CEXEBuild::pack_exe_header() if (result != PS_OK) { - ERROR_MSG(_T("Error: reading temporary file \"%s\" after pack\n"),build_packname); + ERROR_MSG(_T("Error: reading temporary file \"%") NPRIs _T("\" after pack\n"),build_packname); return result; } @@ -2579,7 +2578,7 @@ int CEXEBuild::write_output(void) close_res_editor(); } catch (exception& err) { - ERROR_MSG(_T("\nError: %s\n"), CtoTStrParam(err.what())); + ERROR_MSG(_T("\nError: %") NPRIs _T("\n"), CtoTStrParam(err.what())); return PS_ERROR; } @@ -2600,7 +2599,7 @@ int CEXEBuild::write_output(void) { tstring full_path = get_full_path(build_output_filename); notify(MakensisAPI::NOTIFY_OUTPUT, full_path.c_str()); - INFO_MSG(_T("\nOutput: \"%s\"\n"), full_path.c_str()); + INFO_MSG(_T("\nOutput: \"%") NPRIs _T("\"\n"), full_path.c_str()); } FILE *fp = FOPEN(build_output_filename,("w+b")); @@ -2649,7 +2648,7 @@ int CEXEBuild::write_output(void) int n = compressor->Init(build_compress_level, build_compress_dict_size); if (n != C_OK) { - ERROR_MSG(_T("Internal compiler error #12345: deflateInit() failed(%s [%d]).\n"), compressor->GetErrStr(n), n); + ERROR_MSG(_T("Internal compiler error #12345: deflateInit() failed(%") NPRIs _T(" [%d]).\n"), compressor->GetErrStr(n), n); return PS_ERROR; } } @@ -2717,7 +2716,7 @@ int CEXEBuild::write_output(void) INFO_MSG(_T("Install: ")); #ifdef NSIS_CONFIG_VISIBLE_SUPPORT int np=build_header.blocks[NB_PAGES].num; - INFO_MSG(_T("%d page%s (%d bytes), "),np,np==1?_T(""):_T("s"),np*sizeof(page)); + INFO_MSG(_T("%d page%") NPRIs _T(" (%d bytes), "),np,np==1?_T(""):_T("s"),np*sizeof(page)); #endif { int ns=build_sections.getlen()/sizeof(section); @@ -2728,7 +2727,7 @@ int CEXEBuild::write_output(void) { if (!s[x].name_ptr || s[x].flags & SF_RO) req++; } - INFO_MSG(_T("%d section%s"),ns,ns==1?_T(""):_T("s")); + INFO_MSG(_T("%d section%") NPRIs,ns,ns==1?_T(""):_T("s")); if (req) { INFO_MSG(_T(" (%u required)"),req); @@ -2736,17 +2735,17 @@ int CEXEBuild::write_output(void) INFO_MSG(_T(" (%d bytes), "), build_sections.getlen()); } int ne=build_header.blocks[NB_ENTRIES].num; - INFO_MSG(_T("%d instruction%s (%d bytes), "),ne,ne==1?_T(""):_T("s"),ne*sizeof(entry)); + INFO_MSG(_T("%d instruction%") NPRIs _T(" (%d bytes), "),ne,ne==1?_T(""):_T("s"),ne*sizeof(entry)); int ns=build_strlist.getnum(); - INFO_MSG(_T("%d string%s (%d bytes), "),ns,ns==1?_T(""):_T("s"),build_strlist.gettotalsize()); + INFO_MSG(_T("%d string%") NPRIs _T(" (%d bytes), "),ns,ns==1?_T(""):_T("s"),build_strlist.gettotalsize()); int nlt=build_header.blocks[NB_LANGTABLES].num; - INFO_MSG(_T("%d language table%s (%d bytes).\n"),nlt,nlt==1?_T(""):_T("s"),build_langtables.getlen()); + INFO_MSG(_T("%d language table%") NPRIs _T(" (%d bytes).\n"),nlt,nlt==1?_T(""):_T("s"),build_langtables.getlen()); if (ubuild_entries.getlen()) { INFO_MSG(_T("Uninstall: ")); #ifdef NSIS_CONFIG_VISIBLE_SUPPORT np=build_uninst.blocks[NB_PAGES].num; - INFO_MSG(_T("%d page%s (%d bytes), \n"),np,np==1?_T(""):_T("s"),ubuild_pages.getlen()); + INFO_MSG(_T("%d page%") NPRIs _T(" (%d bytes), "),np,np==1?_T(""):_T("s"),ubuild_pages.getlen()); #endif { int ns=ubuild_sections.getlen()/sizeof(section); @@ -2757,7 +2756,7 @@ int CEXEBuild::write_output(void) { if (!s[x].name_ptr || s[x].flags & SF_RO) req++; } - INFO_MSG(_T("%d section%s"),ns,ns==1?_T(""):_T("s")); + INFO_MSG(_T("%d section%") NPRIs,ns,ns==1?_T(""):_T("s")); if (req) { INFO_MSG(_T(" (%u required)"),req); @@ -2765,11 +2764,11 @@ int CEXEBuild::write_output(void) INFO_MSG(_T(" (%d bytes), "), ubuild_sections.getlen()); } ne=build_uninst.blocks[NB_ENTRIES].num; - INFO_MSG(_T("%d instruction%s (%d bytes), "),ne,ne==1?_T(""):_T("s"),ubuild_entries.getlen()); + INFO_MSG(_T("%d instruction%") NPRIs _T(" (%d bytes), "),ne,ne==1?_T(""):_T("s"),ubuild_entries.getlen()); ns=ubuild_strlist.getnum(); - INFO_MSG(_T("%d string%s (%d bytes), "),ns,ns==1?_T(""):_T("s"),ubuild_strlist.gettotalsize()); + INFO_MSG(_T("%d string%") NPRIs _T(" (%d bytes), "),ns,ns==1?_T(""):_T("s"),ubuild_strlist.gettotalsize()); nlt=build_uninst.blocks[NB_LANGTABLES].num; - INFO_MSG(_T("%d language table%s (%d bytes).\n"),nlt,nlt==1?_T(""):_T("s"),ubuild_langtables.getlen()); + INFO_MSG(_T("%d language table%") NPRIs _T(" (%d bytes).\n"),nlt,nlt==1?_T(""):_T("s"),ubuild_langtables.getlen()); } @@ -2783,7 +2782,7 @@ int CEXEBuild::write_output(void) } #ifdef NSIS_CONFIG_COMPRESSION_SUPPORT - INFO_MSG(_T("\nUsing %s%s compression.\n\n"), compressor->GetName(), build_compress_whole?_T(" (compress whole)"):_T("")); + INFO_MSG(_T("\nUsing %") NPRIs _T("%") NPRIs _T(" compression.\n\n"), compressor->GetName(), build_compress_whole?_T(" (compress whole)"):_T("")); #endif unsigned int total_usize=m_exehead_original_size; @@ -2944,12 +2943,12 @@ int CEXEBuild::write_output(void) { for (struct postbuild_cmd *cmd=postbuild_cmds; cmd; cmd = cmd->next) { - LPTSTR cmdstr = cmd->cmd, cmdstrbuf = NULL; - LPTSTR arg = _tcsstr(cmdstr, _T("%1")); + TCHAR *cmdstr = cmd->cmd, *cmdstrbuf = NULL; + TCHAR *arg = _tcsstr(cmdstr, _T("%1")); if (arg) // if found, replace %1 by build_output_filename { const UINT cchbldoutfile = _tcslen(build_output_filename); - cmdstrbuf = (LPTSTR) malloc( (_tcslen(cmdstr) + cchbldoutfile + 1)*sizeof(TCHAR) ); + cmdstrbuf = (TCHAR*) malloc( (_tcslen(cmdstr) + cchbldoutfile + 1)*sizeof(TCHAR) ); if (!cmdstrbuf) { ERROR_MSG(_T("Error: can't allocate memory for finalize command\n")); @@ -2960,17 +2959,12 @@ int CEXEBuild::write_output(void) cmdstr = cmdstrbuf; memmove(arg+cchbldoutfile, arg+2, (_tcslen(arg+2)+1)*sizeof(TCHAR)); memmove(arg, build_output_filename, cchbldoutfile*sizeof(TCHAR)); + //BUGBUG: Should we call PathConvertWinToPosix on build_output_filename? } - SCRIPT_MSG(_T("\nFinalize command: %s\n"),cmdstr); -#ifdef _WIN32 - int ret=sane_system(cmdstr); -#else - PATH_CONVERT(cmdstr); - int ret=system(cmdstr); -#endif - if (ret != 0) - INFO_MSG(_T("Finalize command returned %d\n"),ret); + SCRIPT_MSG(_T("\nFinalize command: %") NPRIs _T("\n"),cmdstr); + int ret = sane_system(cmdstr); + if (ret != 0) INFO_MSG(_T("Finalize command returned %d\n"),ret); free(cmdstrbuf); } } @@ -2998,7 +2992,7 @@ int CEXEBuild::deflateToFile(FILE *fp, char *buf, int len) // len==0 to flush int ret=compressor->Compress(flush); if (ret<0 && (ret!=-1 || !flush)) { - ERROR_MSG(_T("Error: deflateToFile: deflate() failed(%s [%d])\n"), compressor->GetErrStr(ret), ret); + ERROR_MSG(_T("Error: deflateToFile: deflate() failed(%") NPRIs _T(" [%d])\n"), compressor->GetErrStr(ret), ret); return 1; } int l=compressor->GetNextOut()-obuf; @@ -3143,7 +3137,7 @@ int CEXEBuild::uninstall_generate() int n = compressor->Init(build_compress_level, build_compress_dict_size); if (n != C_OK) { - ERROR_MSG(_T("Internal compiler error #12345: deflateInit() failed(%s [%d]).\n"), compressor->GetErrStr(n), n); + ERROR_MSG(_T("Internal compiler error #12345: deflateInit() failed(%") NPRIs _T(" [%d]).\n"), compressor->GetErrStr(n), n); extern void quit(); quit(); } @@ -3327,7 +3321,7 @@ void CEXEBuild::warning(const TCHAR *s, ...) notify(MakensisAPI::NOTIFY_WARNING,buf.GetPtr()); if (display_warnings) { - PrintColorFmtMsg_WARN(_T("warning: %s\n"),buf.GetPtr()); + PrintColorFmtMsg_WARN(_T("warning: %") NPRIs _T("\n"),buf.GetPtr()); } } @@ -3340,13 +3334,13 @@ void CEXEBuild::warning_fl(const TCHAR *s, ...) va_end(val); buf.Reserve(cchMsg+2+_tcslen(curfilename)+50+1+1); - _stprintf(&buf[cchMsg],_T(" (%s:%u)"),curfilename,linecnt); + _stprintf(&buf[cchMsg],_T(" (%") NPRIs _T(":%u)"),curfilename,linecnt); m_warnings.add(buf,0); notify(MakensisAPI::NOTIFY_WARNING,buf.GetPtr()); if (display_warnings) { - PrintColorFmtMsg_WARN(_T("warning: %s\n"),buf.GetPtr()); + PrintColorFmtMsg_WARN(_T("warning: %") NPRIs _T("\n"),buf.GetPtr()); } } @@ -3363,7 +3357,7 @@ void CEXEBuild::ERROR_MSG(const TCHAR *s, ...) const notify(MakensisAPI::NOTIFY_ERROR,buf.GetPtr()); if (display_errors) { - PrintColorFmtMsg_ERR(_T("%s"),buf.GetPtr()); + PrintColorFmtMsg_ERR(_T("%") NPRIs ,buf.GetPtr()); } } } @@ -3399,10 +3393,10 @@ void CEXEBuild::print_warnings() TCHAR *p=m_warnings.get(); while (x>0) if (!p[--x]) nw++; SetPrintColorWARN(); - _ftprintf(g_output,_T("\n%d warning%s:\n"),nw,nw==1?_T(""):_T("s")); + _ftprintf(g_output,_T("\n%d warning%") NPRIs _T(":\n"),nw,nw==1?_T(""):_T("s")); for (x = 0; x < nw; x ++) { - _ftprintf(g_output,_T(" %s\n"),p); + _ftprintf(g_output,_T(" %") NPRIs _T("\n"),p); p+=_tcslen(p)+1; } FlushOutputAndResetPrintColor(); @@ -3435,7 +3429,7 @@ int CEXEBuild::initialize_default_plugins(bool newtargetarc) searchPath += PLATFORM_PATH_SEPARATOR_STR _T("Plugins") PLATFORM_PATH_SEPARATOR_STR; searchPath += get_target_suffix(); - SCRIPT_MSG(_T("Processing default plugins: \"%s") PLATFORM_PATH_SEPARATOR_STR _T("*.dll\"\n"), searchPath.c_str()); + SCRIPT_MSG(_T("Processing default plugins: \"%") NPRIs PLATFORM_PATH_SEPARATOR_STR _T("*.dll\"\n"), searchPath.c_str()); if (!m_pPlugins->Initialize(searchPath.c_str(), !!display_script)) { ERROR_MSG(_T("Error initializing default plugins!\n")); @@ -3562,14 +3556,14 @@ int CEXEBuild::DeclaredUserVar(const TCHAR *szVarName) { if (m_ShellConstants.get((TCHAR*)szVarName) >= 0) { - ERROR_MSG(_T("Error: name \"%s\" in use by constant\n"), szVarName); + ERROR_MSG(_T("Error: name \"%") NPRIs _T("\" in use by constant\n"), szVarName); return PS_ERROR; } int idxUserVar = m_UserVarNames.get((TCHAR*)szVarName); if (idxUserVar >= 0) { - ERROR_MSG(_T("Error: variable \"%s\" already declared\n"), szVarName); + ERROR_MSG(_T("Error: variable \"%") NPRIs _T("\" already declared\n"), szVarName); return PS_ERROR; } const TCHAR *pVarName = szVarName; @@ -3591,7 +3585,7 @@ int CEXEBuild::DeclaredUserVar(const TCHAR *szVarName) { if (!isSimpleChar(*pVarName)) { - ERROR_MSG(_T("Error: invalid characters in variable name \"%s\", use only characters [a-z][A-Z][0-9] and '_'\n"), szVarName); + ERROR_MSG(_T("Error: invalid characters in variable name \"%") NPRIs _T("\", use only characters [a-z][A-Z][0-9] and '_'\n"), szVarName); return PS_ERROR; } pVarName++; @@ -3624,7 +3618,7 @@ int CEXEBuild::GetUserVarIndex(LineParser &line, int token) int idxConst = m_ShellConstants.get((TCHAR *)p+1); if (idxConst >= 0) { - ERROR_MSG(_T("Error: cannot change constants : %s\n"), p); + ERROR_MSG(_T("Error: cannot change constants : %") NPRIs _T("\n"), p); } } } @@ -3637,7 +3631,7 @@ void CEXEBuild::VerifyDeclaredUserVarRefs(UserVarsStringList *pVarsStringList) { if (!pVarsStringList->get_reference(i)) { - warning(_T("Variable \"%s\" not referenced or never set, wasting memory!"), pVarsStringList->idx2name(i)); + warning(_T("Variable \"%") NPRIs _T("\" not referenced or never set, wasting memory!"), pVarsStringList->idx2name(i)); } } } @@ -3711,7 +3705,7 @@ const TCHAR* CEXEBuild::get_target_suffix(CEXEBuild::TARGETTYPE tt) const { case TARGET_X86ANSI :return _T("x86-ansi"); case TARGET_X86UNICODE:return _T("x86-unicode"); -#if !defined(_WIN32) || defined(_WIN64) +#if !defined(_WIN32) || defined(_WIN64) // BUGBUG: Need a better define for this case TARGET_AMD64 :return _T("amd64-unicode"); #endif default:return _T("?"); @@ -3727,7 +3721,7 @@ int CEXEBuild::update_exehead(const tstring& file, size_t *size/*=NULL*/) { FILE *tmpfile = FOPEN(file.c_str(), ("rb")); if (!tmpfile) { - ERROR_MSG(_T("Error: opening stub \"%s\"\n"), file.c_str()); + ERROR_MSG(_T("Error: opening stub \"%") NPRIs _T("\"\n"), file.c_str()); return PS_ERROR; } @@ -3738,7 +3732,7 @@ int CEXEBuild::update_exehead(const tstring& file, size_t *size/*=NULL*/) { fseek(tmpfile, 0, SEEK_SET); if (fread(exehead, 1, exehead_size, tmpfile) != exehead_size) { - ERROR_MSG(_T("Error: reading stub \"%s\"\n"), file.c_str()); + ERROR_MSG(_T("Error: reading stub \"%") NPRIs _T("\"\n"), file.c_str()); fclose(tmpfile); delete [] exehead; return PS_ERROR; diff --git a/Source/build.h b/Source/build.h index 8e169f6c..8692a9d4 100644 --- a/Source/build.h +++ b/Source/build.h @@ -143,7 +143,7 @@ class CEXEBuild { DefineList definedlist; // List of identifiers marked as "defined" like // C++ macro definitions such as _UNICODE. - void define(const TCHAR *p, const TCHAR *v=TEXT("")); // to add a defined thing. + void define(const TCHAR *p, const TCHAR *v=_T("")); // to add a defined thing. int display_errors; int display_script; diff --git a/Source/dirreader.cpp b/Source/dirreader.cpp index 77d4ff4b..9a0d1de3 100644 --- a/Source/dirreader.cpp +++ b/Source/dirreader.cpp @@ -19,10 +19,14 @@ #include "Platform.h" #include "dirreader.h" #include "tstring.h" +#include "util.h" #include #include // for stricmp() #include // for tolower() +#ifdef _UNICODE +# include // towlower() +#endif using namespace std; @@ -175,11 +179,10 @@ public: HANDLE h = ::FindFirstFile(spec.c_str(), &fd); if (h != INVALID_HANDLE_VALUE) { do { - if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { + if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) dir_reader::add_dir(fd.cFileName); - } else { + else dir_reader::add_file(fd.cFileName); - } } while (::FindNextFile(h, &fd)); ::FindClose(h); } @@ -197,43 +200,33 @@ class posix_dir_reader : public dir_reader { public: virtual void read(const tstring& dir) { - //convert(dir); - DIR *dip = ::opendir(dir.c_str()); + static const char platformpathsep[2] = {(char)PLATFORM_PATH_SEPARATOR_C, '\0'}; + + char *nativedir = NSISRT_ttombpath(dir.c_str()); + if (!nativedir) return ; + + DIR *dip = ::opendir(nativedir); if (dip) { dirent *dit; while ((dit = ::readdir(dip))) { struct stat st; - string file = dir + PLATFORM_PATH_SEPARATOR_STR + dit->d_name; + string file = nativedir; + file += platformpathsep, file += dit->d_name; if (!stat(file.c_str(), &st)) { - if (S_ISDIR(st.st_mode)) { - dir_reader::add_dir(dit->d_name); - } else { - dir_reader::add_file(dit->d_name); - } + tstring name; + name = PosixBug_CtoTString(dit->d_name); + if (S_ISDIR(st.st_mode)) + dir_reader::add_dir(name); + else + dir_reader::add_file(name); } } ::closedir(dip); } + NSISRT_free(nativedir); } - -private: - - void convert(string& path) { - string::size_type pos = path.find(_T('\\')); - while (pos != string::npos) { - path[pos] = _T('/'); - pos = path.find(_T('\\')); - } - - /* Replace drive letter X: by /x */ - if (path[1] == _T(':')) { - path[1] = ::_totlower(path[0]); - path[0] = _T('/'); - } - } - }; #endif diff --git a/Source/exehead/Main.c b/Source/exehead/Main.c index 743a327a..b60dc7ef 100644 --- a/Source/exehead/Main.c +++ b/Source/exehead/Main.c @@ -361,9 +361,10 @@ void NSISCALL CleanUp() dbd_hFile = INVALID_HANDLE_VALUE; } #endif +#ifdef NSIS_CONFIG_PLUGIN_SUPPORT // Notify plugins that we are about to unload Plugins_UnloadAll(); -#ifdef NSIS_CONFIG_PLUGIN_SUPPORT + // Clean up after plug-ins myDelete(state_plugins_dir, DEL_DIR | DEL_RECURSE | DEL_REBOOT); #endif // NSIS_CONFIG_PLUGIN_SUPPORT diff --git a/Source/exehead/fileform.h b/Source/exehead/fileform.h index 9b30720a..97e145a9 100644 --- a/Source/exehead/fileform.h +++ b/Source/exehead/fileform.h @@ -474,6 +474,9 @@ typedef struct { COLORREF bkc; UINT lbStyle; HBRUSH bkb; +#ifdef _WIN64 +#error Should we swap lbStyle and bkb to get better alignment? If we are going to do it, now is our only chance before plugins in the wild start depending on the ctlcolors layout on x64 +#endif int bkmode; int flags; } ctlcolors; diff --git a/Source/growbuf.cpp b/Source/growbuf.cpp index a79e71d6..fa14bfcb 100644 --- a/Source/growbuf.cpp +++ b/Source/growbuf.cpp @@ -16,6 +16,7 @@ * Unicode support and Doxygen comments by Jim Park -- 07/31/2007 */ +#include "Platform.h" #include "growbuf.h" #include // for malloc/free @@ -25,7 +26,6 @@ #include "tchar.h" #include "util.h" -#include "Platform.h" using namespace std; @@ -88,7 +88,7 @@ void GrowBuf::resize(int newlen) memset((BYTE*)m_s + ou, 0, m_used - ou); if (!m_used && m_alloc > 2*m_bs) // only free if you resize to 0 and we're > 64k or - // 2K in the case of TinyGrowBuf + // 2K in the case of TinyGrowBuf { m_alloc=0; free(m_s); diff --git a/Source/icon.cpp b/Source/icon.cpp index 182cbd39..f36a053e 100644 --- a/Source/icon.cpp +++ b/Source/icon.cpp @@ -86,6 +86,7 @@ IconGroup load_icon_res(CResourceEditor* re, WORD id) result.push_back(icon); } + re->FreeResource(group); return result; } @@ -243,6 +244,7 @@ static IconPairs get_icon_order(IconGroup icon1, IconGroup icon2) return result; } +#define destroy_icon_group(p) ( delete [] (p) ) static LPBYTE generate_icon_group(IconGroup icon, IconPairs order, bool first) { LPBYTE group = new BYTE[ @@ -284,6 +286,7 @@ void set_icon(CResourceEditor* re, WORD wIconId, IconGroup icon1, IconGroup icon + order.size() * SIZEOF_RSRC_ICON_GROUP_ENTRY; // entries re->UpdateResource(RT_GROUP_ICON, wIconId, NSIS_DEFAULT_LANG, group1, group_size); + destroy_icon_group(group1); // delete old icons unsigned i = 1; @@ -367,6 +370,7 @@ unsigned char* generate_uninstall_icon_data(IconGroup icon1, IconGroup icon2, si *(LPDWORD) seeker = 0; // done + destroy_icon_group(group); return uninst_data; } @@ -423,7 +427,7 @@ int generate_unicons_offsets(LPBYTE exeHeader, size_t exeHeaderSize, LPBYTE unin catch (const exception& e) { if (g_display_errors) - PrintColorFmtMsg_ERR(_T("\nError generating uninstaller icon: %s -- failing!\n"), CtoTStrParam(e.what())); + PrintColorFmtMsg_ERR(_T("\nError generating uninstaller icon: %") NPRIs _T(" -- failing!\n"), CtoTStrParam(e.what())); return 0; } diff --git a/Source/lang.cpp b/Source/lang.cpp index d3d81d8b..c28d7fc1 100644 --- a/Source/lang.cpp +++ b/Source/lang.cpp @@ -494,7 +494,7 @@ int CEXEBuild::SetLangString(const TCHAR *name, LANGID lang, const TCHAR *str, B int sn; if (!LicenseData && _tcsclen(str) > NSIS_MAX_STRLEN-1) - warning_fl(_T("LangString \"%s\" longer than NSIS_MAX_STRLEN!"), name); + warning_fl(_T("LangString \"%") NPRIs _T("\" longer than NSIS_MAX_STRLEN!"), name); int pos = build_langstrings.get(name, &sn); if (pos < 0) @@ -589,16 +589,16 @@ int CEXEBuild::GenerateLangTable(LanguageTable *lt, int num_lang_tables) { if (lsn[0] != _T('^')) { if (lt[i].nlf.m_bLoaded) - warning(_T("LangString \"%s\" is not set in language table of language %s"), lsn, lt[i].nlf.m_szName); + warning(_T("LangString \"%") NPRIs _T("\" is not set in language table of language %") NPRIs, lsn, lt[i].nlf.m_szName); else - warning(_T("LangString \"%s\" is not set in language table of language %d"), lsn, lt[i].lang_id); + warning(_T("LangString \"%") NPRIs _T("\" is not set in language table of language %d"), lsn, lt[i].lang_id); } } else { // Add the language string to the string data block TCHAR fn[1024]; - _stprintf(fn, _T("LangString %s"), lsn); + _stprintf(fn, _T("LangString %") NPRIs, lsn); curfilename = fn; linecnt = lt[i].lang_id; *ptr = add_string(str, lang_strings[j].process, (WORD) lt[i].nlf.m_uCodePage); @@ -644,7 +644,7 @@ int CEXEBuild::GenerateLangTable(LanguageTable *lt, int num_lang_tables) { name = build_langstrings.offset2name(lang_strings[l].name); } } - ERROR_MSG(_T("Error: LangString %s is recursive!\n"), name); + ERROR_MSG(_T("Error: LangString %") NPRIs _T(" is recursive!\n"), name); delete [] string_ptrs; return PS_ERROR; } @@ -718,7 +718,7 @@ int CEXEBuild::GenerateLangTables() { DWORD dwSize; \ dlg = td.Save(dwSize); \ res_editor->UpdateResource(RT_DIALOG, id, NSIS_DEFAULT_LANG, dlg, dwSize); \ - delete [] dlg; \ + res_editor->FreeResource(dlg); \ } \ } @@ -742,7 +742,7 @@ int CEXEBuild::GenerateLangTables() { #undef ADD_FONT } catch (exception& err) { - ERROR_MSG(_T("\nError while applying font: %s\n"), CtoTStrParam(err.what())); + ERROR_MSG(_T("\nError while applying font: %") NPRIs _T("\n"), CtoTStrParam(err.what())); return PS_ERROR; } } @@ -757,7 +757,7 @@ int CEXEBuild::GenerateLangTables() { // A Unicode-only language is never displayed correctly by ANSI exehead if (!build_unicode && 1200 == lt[i].nlf.m_uCodePage) { - ERROR_MSG(_T("\nError: Unicode-only language %s cannot be used in ANSI installer!\n"), lt[i].nlf.m_szName); + ERROR_MSG(_T("\nError: Unicode-only language %") NPRIs _T(" cannot be used in ANSI installer!\n"), lt[i].nlf.m_szName); return PS_ERROR; } @@ -788,7 +788,7 @@ int CEXEBuild::GenerateLangTables() { DWORD dwSize; \ dlg = td.Save(dwSize); \ res_editor->UpdateResource(RT_DIALOG, id+cur_offset, NSIS_DEFAULT_LANG, dlg, dwSize); \ - delete [] dlg; \ + res_editor->FreeResource(dlg); \ } \ } @@ -812,7 +812,7 @@ int CEXEBuild::GenerateLangTables() { #undef ADD_FONT } catch (exception& err) { - ERROR_MSG(_T("\nError while applying NLF font/RTL: %s\n"), CtoTStrParam(err.what())); + ERROR_MSG(_T("\nError while applying NLF font/RTL: %") NPRIs _T("\n"), CtoTStrParam(err.what())); return PS_ERROR; } @@ -839,6 +839,21 @@ int CEXEBuild::GenerateLangTables() { return PS_OK; } +static void CreatePlatformStrfmt(const TCHAR *templ, TCHAR *out) { + // NOTE: Only supports plain %s with no options + for ( ;; out++ ) + { + *out = *templ++; + if (!*out) break; + if (*out == L'%' && *templ == L's') + { + out++, templ++; + unsigned int cch = my_strncpy(out, NPRIs, -1); + out += --cch; // --cch because for loop does out++ + } + } +} + void CEXEBuild::FillLanguageTable(LanguageTable *table) { for (int i = 0; i < NLF_STRINGS; i++) { #ifdef NSIS_CONFIG_UNINSTALL_SUPPORT @@ -876,8 +891,9 @@ void CEXEBuild::FillLanguageTable(LanguageTable *table) { if (!dstr) continue; if (i == NLF_BRANDING) { - TCHAR temp[NSIS_MAX_STRLEN + sizeof(NSIS_VERSION)]; - _stprintf(temp, dstr, NSIS_VERSION); + TCHAR temp[NSIS_MAX_STRLEN + sizeof(NSIS_VERSION)], temp2[COUNTOF(temp)]; + CreatePlatformStrfmt(dstr, temp2); // Change %s to %ls if required + _stprintf(temp, temp2, NSIS_VERSION); table->lang_strings->set(sn, temp); continue; } @@ -931,7 +947,7 @@ LanguageTable * CEXEBuild::LoadLangFile(TCHAR *filename) { NIStream strm; strm.StreamEncoding().SetCodepage(NStreamEncoding::ACP); if (!strm.OpenFileForReading(filename)) { - ERROR_MSG(_T("Error: Can't open language file - \"%s\"!\n"),filename); + ERROR_MSG(_T("Error: Can't open language file - \"%") NPRIs _T("\"!\n"),filename); return 0; } NStreamLineReader lr(strm); @@ -992,7 +1008,7 @@ l_readerr: if (p) *p = t; if (nlf_version != NLF_VERSION) { - warning_fl(_T("%s language file version doesn't match. Using default English texts for missing strings."), nlf->m_szName); + warning_fl(_T("%") NPRIs _T(" language file version doesn't match. Using default English texts for missing strings."), nlf->m_szName); } // set ^Language @@ -1035,7 +1051,7 @@ l_readerr: } if (CP_ACP != nlf->m_uCodePage && !isnlfdataucp && !IsValidCodePage(nlf->m_uCodePage)) { - warning_fl(_T("%s language file uses a codepage (%d) that is not supported on this system, using ACP!"), nlf->m_szName, nlf->m_uCodePage); + warning_fl(_T("%") NPRIs _T(" language file uses a codepage (%d) that is not supported on this system, using ACP!"), nlf->m_szName, nlf->m_uCodePage); nlf->m_uCodePage = CP_ACP; } } @@ -1043,7 +1059,7 @@ l_readerr: // SVN is not a big fan of UTF16 so we should always use UTF8SIG if (isnlfdataucp && !lr.StreamEncoding().IsUTF8()) { - warning_fl(_T("%s Unicode language file is not UTF8SIG."), nlf->m_szName); + warning_fl(_T("%") NPRIs _T(" Unicode language file is not UTF8SIG."), nlf->m_szName); } if (!lr.IsUnicode()) @@ -1119,7 +1135,7 @@ l_readerr: errlr = GetNextNLFLine(lr, buf, NSIS_MAX_STRLEN); if (_tcslen(buf) == NSIS_MAX_STRLEN-1) { - ERROR_MSG(_T("Error: String too long (string #%d - \"%s\")\n"), i, NLFStrings[i].szLangStringName); + ERROR_MSG(_T("Error: String too long (string #%d - \"%") NPRIs _T("\")\n"), i, NLFStrings[i].szLangStringName); return 0; } if (NStream::OK != errlr) goto l_readerr; diff --git a/Source/makenssi.cpp b/Source/makenssi.cpp index 7a084231..a76fb490 100644 --- a/Source/makenssi.cpp +++ b/Source/makenssi.cpp @@ -29,11 +29,9 @@ #include "build.h" #include "util.h" #include "utf.h" +#include "winchar.h" // assert(sizeof(WINWCHAR)...) #include -#include -#include - #define NSIS_COPYYEARS _T("1999-2013") using namespace std; @@ -125,7 +123,7 @@ static void init_signals(HWND notify_hwnd) static void print_logo() { - _ftprintf(g_output,_T("MakeNSIS %s - Copyright ") NSIS_COPYYEARS _T(" Contributors\n") + _ftprintf(g_output,_T("MakeNSIS %") NPRIs _T(" - Copyright ") NSIS_COPYYEARS _T(" Contributors\n") _T("See the file COPYING for license details.\n") _T("Credits can be found in the Users Manual.\n\n"), NSIS_VERSION); fflush(g_output); @@ -160,21 +158,25 @@ static void print_usage() _T(" ") _T("makensis [ option | script.nsi | - ] [...]\n") _T("\n") _T("Options:\n") - _T(" ") OPT_STR _T("CMDHELP item prints out help for 'item', or lists all commands\n") + _T(" ") OPT_STR _T("CMDHELP [item] prints out help for 'item', or lists all commands\n") _T(" ") OPT_STR _T("HDRINFO prints information about what options makensis was compiled with\n") _T(" ") OPT_STR _T("LICENSE prints the makensis software license\n") _T(" ") OPT_STR _T("VERSION prints the makensis version and exits\n") +#ifdef _WIN32 _T(" ") OPT_STR _T("Px sets the compiler process priority, where x is 5=realtime,4=high,\n") _T(" ") _T(" 3=above normal,2=normal,1=below normal,0=idle\n") +#endif _T(" ") OPT_STR _T("Vx verbosity where x is 4=all,3=no script,2=no info,1=no warnings,0=none\n") _T(" ") OPT_STR _T("Ofile specifies a text file to log compiler output (default is stdout)\n") _T(" ") OPT_STR _T("PAUSE pauses after execution\n") _T(" ") OPT_STR _T("NOCONFIG disables inclusion of ") PLATFORM_PATH_SEPARATOR_STR _T("nsisconf.nsh\n") _T(" ") OPT_STR _T("NOCD disabled the current directory change to that of the .nsi file\n") _T(" ") OPT_STR _T("INPUTCHARSET <") TSTR_INPUTCHARSET _T(">\n") +#ifdef _WIN32 _T(" ") OPT_STR _T("OUTPUTCHARSET <") TSTR_OUTPUTCHARSET _T(">\n") +#endif _T(" ") OPT_STR _T("Ddefine[=value] defines the symbol \"define\" for the script [to value]\n") - _T(" ") OPT_STR _T("Xscriptcmd executes scriptcmd in script (i.e. \"") OPT_STR _T("XOutFile poop.exe\")\n") + _T(" ") OPT_STR _T("Xscriptcmd executes scriptcmd in script (i.e. \"") OPT_STR _T("XOutFile inst.exe\")\n") _T(" ") _T(" parameters are processed by order (") OPT_STR _T("Ddef ins.nsi != ins.nsi ") OPT_STR _T("Ddef)\n") _T("\n") _T("For script file name, you can use - to read from the standard input\n") @@ -198,9 +200,9 @@ static void print_stub_info(CEXEBuild& build) _ftprintf(g_output,_T("\nDefined symbols: ")); for (int i=0; i 1 && sizeof(wchar_t) <= 4 && sizeof(WORD) == 2); + assert(sizeof(UINT_PTR) == sizeof(void*)); + assert(sizeof(wchar_t) > 1 && sizeof(wchar_t) <= 4); + assert(sizeof(WINWCHAR) == 2 && sizeof(WORD) == 2); + assert(sizeof(WINWCHAR) == sizeof(WCHAR)); // Not really required but if WCHAR changes we need to know + + if (!NSISRT_Initialize()) + { + _ftprintf(stdout,_T("NSISRT_Initialize failed!\n")); + return 1; + } HWND hostnotifyhandle=0; const TCHAR*stdoutredirname=0; @@ -388,14 +398,14 @@ int _tmain(int argc, TCHAR **argv) } catch (exception& err) { - PrintColorFmtMsg_ERR(_T("Error initalizing CEXEBuild: %s\n"), CtoTStrParam(err.what())); + PrintColorFmtMsg_ERR(_T("Error initalizing CEXEBuild: %") NPRIs _T("\n"), CtoTStrParam(err.what())); return 1; } #ifdef _WIN32 build.notify_hwnd=hostnotifyhandle; #else - const TCHAR*const badnonwinswitchfmt=OPT_STR _T("%s is disabled for non Win32 platforms."); + const TCHAR*const badnonwinswitchfmt=OPT_STR _T("%") NPRIs _T(" is disabled for non Win32 platforms."); if (hostnotifyhandle) build.warning(badnonwinswitchfmt,_T("NOTIFYHWND")); if (NStreamEncoding::UNKNOWN==outputenc.GetCodepage()) @@ -446,7 +456,7 @@ int _tmain(int argc, TCHAR **argv) if (NStreamEncoding::UNKNOWN == cp) { if (_tcsicmp(argv[argpos], _T("AUTO"))) - build.warning(OPT_STR _T("INPUTCHARSET: Ignoring invalid charset %s"), argv[argpos]); + build.warning(OPT_STR _T("INPUTCHARSET: Ignoring invalid charset %") NPRIs , argv[argpos]); cp = NStreamEncoding::AUTO; } inputenc.SafeSetCodepage(cp); @@ -479,10 +489,8 @@ int _tmain(int argc, TCHAR **argv) {HIGH_PRIORITY_CLASS, HIGH_PRIORITY_CLASS}, {REALTIME_PRIORITY_CLASS, REALTIME_PRIORITY_CLASS} }; - if (SetPriorityClass(hProc, classes[p].priority) == FALSE) - { + if (!SetPriorityClass(hProc, classes[p].priority)) SetPriorityClass(hProc, classes[p].fallback); - } if (p == 5) build.warning(_T("makensis is running in REALTIME priority mode!")); #else build.warning(badnonwinswitchfmt,_T("Px")); @@ -496,7 +504,7 @@ int _tmain(int argc, TCHAR **argv) { TCHAR *p=argv[argpos]+2; TCHAR *s=_tcsdup(p),*v; - build.SCRIPT_MSG(_T("Command line defined: \"%s\"\n"),p); + build.SCRIPT_MSG(_T("Command line defined: \"%") NPRIs _T("\"\n"),p); v=_tcsstr(s,_T("=")); if (v) *v++=0; build.define(s,v?v:_T("")); @@ -532,7 +540,7 @@ int _tmain(int argc, TCHAR **argv) #ifndef NSIS_CONFIG_CONST_DATA_PATH main_conf = get_dir_name(get_executable_dir(argv[0])); #else - main_conf = PREFIX_CONF; + main_conf = PosixBug_CtoTString(PREFIX_CONF); #endif else main_conf = env_var; main_conf += PLATFORM_PATH_SEPARATOR_STR; @@ -571,7 +579,7 @@ int _tmain(int argc, TCHAR **argv) if (!strm.OpenFileForReading(nsifile.c_str(),inputenc)) { nsifile = argv[argpos]; - build.ERROR_MSG(_T("Can't open script \"%s\"\n"),nsifile.c_str()); + build.ERROR_MSG(_T("Can't open script \"%") NPRIs _T("\"\n"),nsifile.c_str()); return 1; } } @@ -586,12 +594,12 @@ int _tmain(int argc, TCHAR **argv) build.notify(MakensisAPI::NOTIFY_SCRIPT,nsifile.c_str()); TCHAR bufcpdisp[20]; strm.StreamEncoding().GetCPDisplayName(bufcpdisp); - build.INFO_MSG(_T("Processing script file: \"%s\" (%s)\n"),nsifile.c_str(),bufcpdisp); + build.INFO_MSG(_T("Processing script file: \"%") NPRIs _T("\" (%") NPRIs _T(")\n"),nsifile.c_str(),bufcpdisp); int ret=build.process_script(strm,nsifile.c_str()); if (ret != PS_EOF && ret != PS_OK) { - build.ERROR_MSG(_T("Error in script \"%s\" on line %d -- aborting creation process\n"),nsifile.c_str(),build.linecnt); + build.ERROR_MSG(_T("Error in script \"%") NPRIs _T("\" on line %d -- aborting creation process\n"),nsifile.c_str(),build.linecnt); return 1; } } @@ -611,9 +619,9 @@ int _tmain(int argc, TCHAR **argv) if (build.display_info) { _ftprintf(g_output,_T("\nProcessed ")); - if (files_processed) _ftprintf(g_output,_T("%d file%s, "),files_processed,files_processed==1?_T(""):_T("s")); - if (cmds_processed) _ftprintf(g_output,_T("%d command line command%s, "),cmds_processed,cmds_processed==1?_T(""):_T("s")); - _ftprintf(g_output,_T("writing output (%s):\n"),build.get_target_suffix()); + if (files_processed) _ftprintf(g_output,_T("%d file%") NPRIs _T(", "),files_processed,files_processed==1?_T(""):_T("s")); + if (cmds_processed) _ftprintf(g_output,_T("%d command line command%") NPRIs _T(", "),cmds_processed,cmds_processed==1?_T(""):_T("s")); + _ftprintf(g_output,_T("writing output (%") NPRIs _T("):\n"),build.get_target_suffix()); fflush(g_output); } @@ -624,3 +632,55 @@ int _tmain(int argc, TCHAR **argv) } return 0; } + + +#ifndef NDEBUG +# ifdef _MSC_VER +# include +# endif +#endif + +NSIS_ENTRYPOINT_TMAIN +int _tmain(int argc, TCHAR **argv) +{ +#ifndef NDEBUG +#ifdef _MSC_VER + _CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_CHECK_ALWAYS_DF); + _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE), _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDOUT); + _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE), _CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDOUT); + //_CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE), _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDOUT); +#endif +#endif + int retval = makensismain(argc,argv); +#ifndef NDEBUG +#ifdef _MSC_VER + _CrtDumpMemoryLeaks(); + assert(_CrtCheckMemory()); +#endif +#endif + return retval; +} + + +#if !defined(_WIN32) && defined(_UNICODE) +#include +int main(int argc, char **argv) +{ + errno = ENOMEM; + int wargc = 0; + wchar_t term[1], *p, **wargv = (wchar_t **) malloc((argc+1) * sizeof(void*)); + if (wargv) + for ( ; wargc < argc; ++wargc ) + if ((p = NSISRT_mbtowc(argv[wargc]))) wargv[wargc] = p; else break; + if (wargc == argc) + *term = L'\0', wargv[wargc] = term, errno = _tmain(wargc,wargv); + else + wprintf(L"FATAL: main argv conversion failed!\n"); +#ifndef NDEBUG // Normally we just leak + if (wargv) for ( int i = 0; i < wargc; ++i ) NSISRT_free(wargv[i]); + free(wargv); +#endif + return errno; +} +#endif + diff --git a/Source/manifest.cpp b/Source/manifest.cpp index 59972b75..c26915e4 100644 --- a/Source/manifest.cpp +++ b/Source/manifest.cpp @@ -20,7 +20,7 @@ #include "manifest.h" #include #include "tstring.h" -#include "utf.h" +#include "util.h" // RawTStrToASCII // Jim Park: The manifest must stay UTF-8. Do not convert. diff --git a/Source/script.cpp b/Source/script.cpp index 8ff1efef..e1889107 100644 --- a/Source/script.cpp +++ b/Source/script.cpp @@ -86,28 +86,24 @@ TCHAR *CEXEBuild::set_file_predefine(const TCHAR *filename) TCHAR *oldfiledir = definedlist.find(_T("__FILEDIR__")); if(oldfilename && oldfiledir) { - oldfileinfo = new TCHAR[_tcslen(oldfilename)+_tcslen(oldfiledir)+2]; + oldfileinfo = new TCHAR[_tcslen(oldfilename)+1+_tcslen(oldfiledir)+1]; _tcscpy(oldfileinfo, oldfilename); _tcscat(oldfileinfo, _T("|")); _tcscat(oldfileinfo, oldfiledir); definedlist.del(_T("__FILE__")); definedlist.del(_T("__FILEDIR__")); } - const TCHAR *p = _tcsrchr(filename,_T('\\')); - if(p) { - p++; - } - else { - p = filename; - } + const TCHAR *p = _tcsrchr(filename,_T('\\')), *p2 = _tcsrchr(filename,_T('/')); + if(p2 > p) p = p2; + if(p) p++; else p = filename; definedlist.add(_T("__FILE__"),p); - TCHAR dir[MAX_PATH]; + TCHAR dir[260]; // BUGBUG: MAX_PATH outside #ifdef _WIN32, should be PATH/NAME_MAX on POSIX? #ifdef _WIN32 LPTSTR lpFilePart; GetFullPathName(filename, COUNTOF(dir), dir, &lpFilePart); PathRemoveFileSpec(dir); #else - if (p == filename) + if(p == filename) _tcscpy(dir, _T(".")); else _tcsncpy(dir, filename, p-filename-1); @@ -116,7 +112,6 @@ TCHAR *CEXEBuild::set_file_predefine(const TCHAR *filename) return oldfileinfo; } - void CEXEBuild::restore_file_predefine(TCHAR *oldfilename) { definedlist.del(_T("__FILEDIR__")); @@ -156,19 +151,18 @@ TCHAR *CEXEBuild::set_timestamp_predefine(const TCHAR *filename) GetDateFormat(LOCALE_USER_DEFAULT, DATE_LONGDATE, &stime, NULL, datebuf, COUNTOF(datebuf)); GetTimeFormat(LOCALE_USER_DEFAULT, 0, &stime, NULL, timebuf, COUNTOF(timebuf)); - wsprintf(timestampbuf,_T("%s %s"),datebuf,timebuf); + wsprintf(timestampbuf,_T("%") NPRIs _T(" %") NPRIs,datebuf,timebuf); definedlist.add(_T("__TIMESTAMP__"),timestampbuf); } #else struct stat st; - if (!stat(filename, &st)) - definedlist.add(_T("__TIMESTAMP__"),_tctime(&st.st_mtime)); + if (!_tstat(filename, &st)) + definedlist.add(_T("__TIMESTAMP__"),PosixBug_CtoTString(ctime(&st.st_mtime))); #endif return oldtimestamp; } - void CEXEBuild::restore_timestamp_predefine(TCHAR *oldtimestamp) { definedlist.del(_T("__TIMESTAMP__")); @@ -193,7 +187,7 @@ TCHAR *CEXEBuild::set_line_predefine(int linecnt, BOOL is_macro) } if(is_macro && oldline) { linebuf = (TCHAR *)malloc((_tcslen(oldline)+_tcslen(temp)+2)*sizeof(TCHAR)); - _stprintf(linebuf,_T("%s.%s"),oldline,temp); + _stprintf(linebuf,_T("%") NPRIs _T(".%") NPRIs,oldline,temp); } else { linebuf = _tcsdup(temp); @@ -202,7 +196,6 @@ TCHAR *CEXEBuild::set_line_predefine(int linecnt, BOOL is_macro) return oldline; } - void CEXEBuild::restore_line_predefine(TCHAR *oldline) { definedlist.del(_T("__LINE__")); @@ -241,7 +234,6 @@ void CEXEBuild::set_date_time_predefines() definedlist.add(_T("__TIME__"),(TCHAR *)timebuf); #endif } - void CEXEBuild::del_date_time_predefines() { definedlist.del(_T("__DATE__")); @@ -351,10 +343,11 @@ int CEXEBuild::doParse(const TCHAR *str) } // add new line to line buffer - m_linebuild.add(str,(_tcslen(str)+1)*sizeof(TCHAR)); + const size_t cchstr = _tcslen(str); + m_linebuild.add(str,(cchstr+1)*sizeof(TCHAR)); - // keep waiting for more lines, if this line ends with a backslash - if (str[0] && CharPrev(str,str+_tcslen(str))[0] == _T('\\')) + // keep waiting for more lines if this line ends with a backslash + if (str[0] && CharPrev(str,str+cchstr)[0] == _T('\\')) { return PS_OK; } @@ -383,8 +376,8 @@ int CEXEBuild::doParse(const TCHAR *str) if (res) { - if (res==-2) ERROR_MSG(_T("Error: unterminated string parsing line at %s:%d\n"),curfilename,linecnt); - else ERROR_MSG(_T("Error: error parsing line (%s:%d)\n"),curfilename,linecnt); + if (res==-2) ERROR_MSG(_T("Error: unterminated string parsing line at %") NPRIs _T(":%d\n"),curfilename,linecnt); + else ERROR_MSG(_T("Error: error parsing line (%") NPRIs _T(":%d)\n"),curfilename,linecnt); return PS_ERROR; } @@ -400,7 +393,7 @@ parse_again: { if (p[0] == _T('!') || (p[0] >= _T('0') && p[0] <= _T('9')) || p[0] == _T('$') || p[0] == _T('-') || p[0] == _T('+')) { - ERROR_MSG(_T("Invalid label: %s (labels cannot begin with !, $, -, +, or 0-9)\n"),line.gettoken_str(0)); + ERROR_MSG(_T("Invalid label: %") NPRIs _T(" (labels cannot begin with !, $, -, +, or 0-9)\n"),line.gettoken_str(0)); return PS_ERROR; } if (add_label(line.gettoken_str(0))) return PS_ERROR; @@ -423,7 +416,7 @@ parse_again: else #endif { - ERROR_MSG(_T("Invalid command: %s\n"),line.gettoken_str(0)); + ERROR_MSG(_T("Invalid command: %") NPRIs _T("\n"),line.gettoken_str(0)); return PS_ERROR; } } @@ -434,7 +427,7 @@ parse_again: int v=line.getnumtokens()-(np+1); if (v < 0 || (op >= 0 && v > op)) // opt_parms is -1 for unlimited { - ERROR_MSG(_T("%s expects %d"),line.gettoken_str(0),np); + ERROR_MSG(_T("%") NPRIs _T(" expects %d"),line.gettoken_str(0),np); if (op < 0) ERROR_MSG(_T("+")); if (op > 0) ERROR_MSG(_T("-%d"),op+np); ERROR_MSG(_T(" parameters, got %d.\n"),line.getnumtokens()-1); @@ -480,7 +473,7 @@ parse_again: int v=line.gettoken_enum(0,_T("if\0ifdef\0ifndef\0ifmacrodef\0ifmacrondef\0")); if (v < 0) PRINTHELP() if (line.getnumtokens() == 1) PRINTHELP() - int cmds[] = {TOK_P_IF, TOK_P_IFDEF, TOK_P_IFNDEF, TOK_P_IFMACRODEF, TOK_P_IFMACRONDEF}; + const int cmds[] = {TOK_P_IF, TOK_P_IFDEF, TOK_P_IFNDEF, TOK_P_IFMACRODEF, TOK_P_IFMACRONDEF}; tkid = cmds[v]; if_from_else++; } @@ -577,7 +570,7 @@ parse_again: PRINTHELP() } if (!cnv1 || !cnv2) { - warning_fl(_T("Invalid number: \"%s\""), line.gettoken_str(!cnv1 ? 1 : 3)); + warning_fl(_T("Invalid number: \"%") NPRIs _T("\""), line.gettoken_str(!cnv1 ? 1 : 3)); } } else PRINTHELP() @@ -653,8 +646,7 @@ void CEXEBuild::ps_addtoline(const TCHAR *str, GrowBuf &linedata, StringList &hi while (*in) { int add=1; - TCHAR *t; - TCHAR c=*in; + TCHAR *t, c=*in; t=CharNext(in); if (t-in > 1) // handle multibyte chars (no escape) @@ -687,9 +679,8 @@ void CEXEBuild::ps_addtoline(const TCHAR *str, GrowBuf &linedata, StringList &hi } else if (in[0] == _T('{')) { - TCHAR *s=_tcsdup(in+1); + TCHAR *s=_tcsdup(in+1), *t=s; MANAGE_WITH(s, free); - TCHAR *t=s; unsigned int bn = 0; while (*t) { @@ -885,10 +876,10 @@ int CEXEBuild::includeScript(const TCHAR *f, NStreamEncoding&enc) TCHAR bufcpdisp[20]; incstrm.StreamEncoding().GetCPDisplayName(bufcpdisp); - SCRIPT_MSG(_T("!include: \"%s\" (%s)\n"),f,bufcpdisp); + SCRIPT_MSG(_T("!include: \"%") NPRIs _T("\" (%") NPRIs _T(")\n"),f,bufcpdisp); if (!openok) { - ERROR_MSG(_T("!include: could not open file: \"%s\"\n"),f); + ERROR_MSG(_T("!include: could not open file: \"%") NPRIs _T("\"\n"),f); return PS_ERROR; } @@ -929,10 +920,10 @@ int CEXEBuild::includeScript(const TCHAR *f, NStreamEncoding&enc) build_include_depth--; if (r != PS_EOF && r != PS_OK) { - ERROR_MSG(_T("!include: error in script: \"%s\" on line %d\n"),f,errlinecnt); + ERROR_MSG(_T("!include: error in script: \"%") NPRIs _T("\" on line %d\n"),f,errlinecnt); return PS_ERROR; } - SCRIPT_MSG(_T("!include: closed: \"%s\"\n"),f); + SCRIPT_MSG(_T("!include: closed: \"%") NPRIs _T("\"\n"),f); return PS_OK; } @@ -972,7 +963,7 @@ int CEXEBuild::LoadLicenseFile(const TCHAR *file, TCHAR** pdata, const TCHAR *cm NIStream strm; if (!strm.OpenFileForReading(file)) { - ERROR_MSG(_T("%s: open failed \"%s\"\n"),cmdname,file); + ERROR_MSG(_T("%") NPRIs _T(": open failed \"%") NPRIs _T("\"\n"),cmdname,file); print_help(cmdname); return PS_ERROR; } @@ -983,7 +974,7 @@ int CEXEBuild::LoadLicenseFile(const TCHAR *file, TCHAR** pdata, const TCHAR *cm if (!cbFileData) { - warning_fl(_T("%s: empty license file \"%s\"\n"),cmdname,file); + warning_fl(_T("%") NPRIs _T(": empty license file \"%") NPRIs _T("\"\n"),cmdname,file); } else build_lockedunicodetarget=true; @@ -994,7 +985,7 @@ int CEXEBuild::LoadLicenseFile(const TCHAR *file, TCHAR** pdata, const TCHAR *cm *pdata=data; // memory will be released by caller if (!data) { - ERROR_MSG(_T("Internal compiler error #12345: %s malloc(%d) failed.\n"),cmdname,cbTotalData); + ERROR_MSG(_T("Internal compiler error #12345: %") NPRIs _T(" malloc(%d) failed.\n"),cmdname,cbTotalData); return PS_ERROR; } *((TCHAR*)((char*)data+cbTotalData-sizeof(TCHAR)))=_T('\0'); @@ -1002,7 +993,7 @@ int CEXEBuild::LoadLicenseFile(const TCHAR *file, TCHAR** pdata, const TCHAR *cm TCHAR*ldata=data+1; if (!strm.ReadOctets(ldata,&cbFileData)) { - ERROR_MSG(_T("%s: can't read file.\n"),cmdname); + ERROR_MSG(_T("%") NPRIs _T(": can't read file.\n"),cmdname); return PS_ERROR; } // We have to convert the content of the license file to wchar_t @@ -1011,7 +1002,7 @@ int CEXEBuild::LoadLicenseFile(const TCHAR *file, TCHAR** pdata, const TCHAR *cm if (sizeof(TCHAR) < cbcu) { l_errwcconv: - ERROR_MSG(_T("%s: wchar_t conversion failed!\n"),cmdname); + ERROR_MSG(_T("%") NPRIs _T(": wchar_t conversion failed!\n"),cmdname); return PS_ERROR; } // Create a fake character in the "header" part of the buffer (For DupWCFromBytes) @@ -1140,7 +1131,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) TCHAR *t=GetMacro(macroname); if (t) { - ERROR_MSG(_T("!macro: macro named \"%s\" already found!\n"),macroname); + ERROR_MSG(_T("!macro: macro named \"%") NPRIs _T("\" already found!\n"),macroname); return PS_ERROR; } m_macros.add(macroname,(_tcslen(macroname)+1)*sizeof(TCHAR)); @@ -1158,7 +1149,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) { if (!_tcsicmp(line.gettoken_str(pc),line.gettoken_str(a))) { - ERROR_MSG(_T("!macro: macro parameter named %s is used multiple times!\n"), + ERROR_MSG(_T("!macro: macro parameter named %") NPRIs _T(" is used multiple times!\n"), line.gettoken_str(pc)); return PS_ERROR; } @@ -1177,7 +1168,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) { if (!str[0]) { - ERROR_MSG(_T("!macro \"%s\": unterminated (no !macroend found in file)!\n"),macroname); + ERROR_MSG(_T("!macro \"%") NPRIs _T("\": unterminated (no !macroend found in file)!\n"),macroname); return PS_ERROR; } } @@ -1187,7 +1178,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) return PS_ERROR; } } - //SCRIPT_MSG(_T("%s%s"), str, str[_tcslen(str)-1]==_T('\n')?_T(""):_T("\n")); + //SCRIPT_MSG(_T("%") NPRIs _T("%") NPRIs, str, str[_tcslen(str)-1]==_T('\n')?_T(""):_T("\n")); // remove trailing whitespace while (*p) p++; if (p > str) p--; @@ -1225,15 +1216,14 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) mbeg=GetMacro(mname,&mend); if (!mbeg) { - ERROR_MSG(_T("!macroundef: \"%s\" does not exist!\n"),mname); + ERROR_MSG(_T("!macroundef: \"%") NPRIs _T("\" does not exist!\n"),mname); return PS_ERROR; } TCHAR *mbufb=(TCHAR*)m_macros.get(); - const unsigned int mcb=mend-mbeg, mbufcb=m_macros.getlen(); - memmove(mbeg,mend+1,mbufcb-(mcb+(mbeg-mbufb))); - m_macros.resize(mbufcb-(mcb+1)); - - SCRIPT_MSG(_T("!macroundef: %s\n"),mname); + const unsigned int mcb=(mend-mbeg)*sizeof(TCHAR), mbufcb=m_macros.getlen(); + memmove(mbeg,mend+sizeof(TCHAR),mbufcb-(mcb+(mbeg-mbufb))); + m_macros.resize(mbufcb-(mcb+sizeof(TCHAR))); + SCRIPT_MSG(_T("!macroundef: %") NPRIs _T("\n"),mname); } return PS_OK; case TOK_P_INSERTMACRO: @@ -1241,10 +1231,10 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) const TCHAR*const macroname=line.gettoken_str(1); if (!macroname[0]) PRINTHELP() TCHAR *t=GetMacro(macroname), *m=(TCHAR *)m_macros.get(); - SCRIPT_MSG(_T("!insertmacro: %s\n"),macroname); + SCRIPT_MSG(_T("!insertmacro: %") NPRIs _T("\n"),macroname); if (!t) { - ERROR_MSG(_T("!insertmacro: macro named \"%s\" not found!\n"),macroname); + ERROR_MSG(_T("!insertmacro: macro named \"%") NPRIs _T("\" not found!\n"),macroname); return PS_ERROR; } t+=_tcslen(t)+1; @@ -1271,7 +1261,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) t++; if (npr != line.getnumtokens()-2) { - ERROR_MSG(_T("!insertmacro: macro \"%s\" requires %d parameter(s), passed %d!\n"), + ERROR_MSG(_T("!insertmacro: macro \"%") NPRIs _T("\" requires %d parameter(s), passed %d!\n"), macroname,npr,line.getnumtokens()-2); return PS_ERROR; } @@ -1280,14 +1270,14 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) TCHAR str[1024]; if (m_macro_entry.find(macroname,0)>=0) { - ERROR_MSG(_T("!insertmacro: macro \"%s\" already being inserted!\n"),macroname); + ERROR_MSG(_T("!insertmacro: macro \"%") NPRIs _T("\" already being inserted!\n"),macroname); return PS_ERROR; } int npos=m_macro_entry.add(macroname,0); const bool oldparserinsidecomment=inside_comment; inside_comment=false; // "!insertmacro foo /*" does not mean that the macro body is a comment - wsprintf(str,_T("macro:%s"),macroname); + wsprintf(str,_T("macro:%") NPRIs,macroname); const TCHAR* oldmacroname=m_currentmacroname; m_currentmacroname=macroname; definedlist.del(_T("__MACRO__")); @@ -1300,7 +1290,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) int ret=process_oneline(t,str,lp); if (ret != PS_OK) { - ERROR_MSG(_T("Error in macro %s on macroline %d\n"),macroname,lp); + ERROR_MSG(_T("Error in macro %") NPRIs _T(" on macroline %d\n"),macroname,lp); return ret; } } @@ -1326,7 +1316,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) m_currentmacroname=oldmacroname; inside_comment=oldparserinsidecomment; if (oldmacroname) definedlist.add(_T("__MACRO__"),oldmacroname); - SCRIPT_MSG(_T("!insertmacro: end of %s\n"),macroname); + SCRIPT_MSG(_T("!insertmacro: end of %") NPRIs _T("\n"),macroname); } return PS_OK; @@ -1336,43 +1326,42 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) case TOK_P_TEMPFILE: { TCHAR *symbol = line.gettoken_str(1); - TCHAR *fpath; - + const TCHAR *fpath; #ifdef _WIN32 TCHAR buf[MAX_PATH], buf2[MAX_PATH]; - GetTempPath(MAX_PATH, buf); if (!GetTempFileName(buf, _T("nst"), 0, buf2)) { ERROR_MSG(_T("!tempfile: unable to create temporary file.\n")); return PS_ERROR; } - fpath = buf2; -#else - TCHAR t[] = _T("/tmp/makensisXXXXXX"); - - mode_t old_umask = umask(0077); - +#else // !_WIN32 + char t[] = ("/tmp/makensisXXXXXX"); + const mode_t old_umask = umask(0077); int fd = mkstemp(t); - if (fd == -1) { + umask(old_umask); + if (fd == -1) { L_tok_p_tempfile_oom: ERROR_MSG(_T("!tempfile: unable to create temporary file.\n")); return PS_ERROR; } close(fd); - - umask(old_umask); - +#ifdef _UNICODE + if (!(fpath = NSISRT_mbtowc(t))) goto L_tok_p_tempfile_oom; +#else fpath = t; #endif +#endif // ~_WIN32 if (definedlist.add(symbol, fpath)) { - ERROR_MSG(_T("!tempfile: \"%s\" already defined!\n"), symbol); + ERROR_MSG(_T("!tempfile: \"%") NPRIs _T("\" already defined!\n"), symbol); return PS_ERROR; } - - SCRIPT_MSG(_T("!tempfile: \"%s\"=\"%s\"\n"), symbol, fpath); + SCRIPT_MSG(_T("!tempfile: \"%") NPRIs _T("\"=\"%") NPRIs _T("\"\n"), symbol, fpath); +#if !defined(_WIN32) && defined(_UNICODE) + NSISRT_free(fpath); +#endif } return PS_OK; @@ -1391,7 +1380,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) else PRINTHELP(); } - SCRIPT_MSG(_T("!delfile: \"%s\"\n"), line.gettoken_str(a)); + SCRIPT_MSG(_T("!delfile: \"%") NPRIs _T("\"\n"), line.gettoken_str(a)); tstring dir = get_dir_name(fc); tstring spec = get_file_name(fc); @@ -1403,7 +1392,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) } boost::scoped_ptr dr( new_dir_reader() ); - dr->read(dir); + dr->read(dir); // BUGBUG: PATH_CONVERT? for (dir_reader::iterator files_itr = dr->files().begin(); files_itr != dr->files().end(); @@ -1412,11 +1401,11 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) if (!dir_reader::matches(*files_itr, spec)) continue; - tstring file = basedir + *files_itr; + tstring file = basedir + *files_itr; // BUGBUG: PATH_CONVERT? int result = _tunlink(file.c_str()); if (result == -1) { - ERROR_MSG(_T("!delfile: \"%s\" couldn't be deleted.\n"), file.c_str()); + ERROR_MSG(_T("!delfile: \"%") NPRIs _T("\" couldn't be deleted.\n"), file.c_str()); if (fatal) { return PS_ERROR; @@ -1424,7 +1413,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) } else { - SCRIPT_MSG(_T("!delfile: deleted \"%s\"\n"), file.c_str()); + SCRIPT_MSG(_T("!delfile: deleted \"%") NPRIs _T("\"\n"), file.c_str()); } } } @@ -1441,7 +1430,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ++tok, ++forceEnc, cp = GetEncodingFromString(param+9, bom); if (NStreamEncoding::UNKNOWN == cp) { - ERROR_MSG(_T("!appendfile: Invalid parameter \"%s\"!\n"), param); + ERROR_MSG(_T("!appendfile: Invalid parameter \"%") NPRIs _T("\"!\n"), param); return PS_ERROR; } } @@ -1449,7 +1438,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) NOStream ostrm; if (!ostrm.CreateFileForAppending(param, NStreamEncoding::ACP)) { - ERROR_MSG(_T("!appendfile: \"%s\" couldn't be opened.\n"), param); + ERROR_MSG(_T("!appendfile: \"%") NPRIs _T("\" couldn't be opened.\n"), param); return PS_ERROR; } if (ostrm.IsUnicode()) bom = false; @@ -1457,10 +1446,10 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) const TCHAR *const text = line.gettoken_str(++tok); if ((bom ? !ostrm.WriteBOM(ostrm.StreamEncoding()) : 0) || !ostrm.WriteString(text)) { - ERROR_MSG(_T("!appendfile: error writing to \"%s\".\n"), param); + ERROR_MSG(_T("!appendfile: error writing to \"%") NPRIs _T("\".\n"), param); return PS_ERROR; } - SCRIPT_MSG(_T("!appendfile: \"%s\" \"%s\"\n"), param, text); + SCRIPT_MSG(_T("!appendfile: \"%") NPRIs _T("\" \"%") NPRIs _T("\"\n"), param, text); } return PS_OK; @@ -1470,16 +1459,16 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) DWORD low, high; if (!GetDLLVersion(line.gettoken_str(1), high, low)) { - ERROR_MSG(_T("%s: error reading version info from \"%s\"\n"), cmdname, line.gettoken_str(1)); + ERROR_MSG(_T("%") NPRIs _T(": error reading version info from \"%") NPRIs _T("\"\n"), cmdname, line.gettoken_str(1)); return PS_ERROR; } TCHAR *symbuf = m_templinebuf, numbuf[30], *basesymname = line.gettoken_str(2); DWORD vals[] = { high>>16, high&0xffff, low>>16, low&0xffff }; - SCRIPT_MSG(_T("%s: %s (%u.%u.%u.%u)->(%s<1..4>)\n"), + SCRIPT_MSG(_T("%") NPRIs _T(": %") NPRIs _T(" (%u.%u.%u.%u)->(%") NPRIs _T("<1..4>)\n"), cmdname, line.gettoken_str(1), vals[0], vals[1], vals[2], vals[3], basesymname); for (UINT i = 0; i < 4; ++i) { - _stprintf(symbuf,_T("%s%u"), basesymname, i+1); + _stprintf(symbuf,_T("%") NPRIs _T("%u"), basesymname, i+1); _stprintf(numbuf,_T("%lu"), vals[i]); definedlist.add(symbuf, numbuf); } @@ -1558,17 +1547,17 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) } #endif//NSIS_SUPPORT_CODECALLBACKS - SCRIPT_MSG(_T("%sPage: %s"), uninstall_mode?_T("Uninst"):_T(""), line.gettoken_str(1)); + SCRIPT_MSG(_T("%") NPRIs _T("Page: %") NPRIs, uninstall_mode?_T("Uninst"):_T(""), line.gettoken_str(1)); #ifdef NSIS_SUPPORT_CODECALLBACKS if (cur_page->prefunc>=0) - SCRIPT_MSG(_T(" (%s:%s)"), k?_T("pre"):_T("creator"), line.gettoken_str(2)); + SCRIPT_MSG(_T(" (%") NPRIs _T(":%") NPRIs _T(")"), k?_T("pre"):_T("creator"), line.gettoken_str(2)); if (cur_page->showfunc>=0 && k) - SCRIPT_MSG(_T(" (show:%s)"), line.gettoken_str(3)); + SCRIPT_MSG(_T(" (show:%") NPRIs _T(")"), line.gettoken_str(3)); if (cur_page->leavefunc>=0) - SCRIPT_MSG(_T(" (leave:%s)"), line.gettoken_str(4-!k)); + SCRIPT_MSG(_T(" (leave:%") NPRIs _T(")"), line.gettoken_str(4-!k)); else if (cur_page->caption && !k) - SCRIPT_MSG(_T(" (caption:%s)"), line.gettoken_str(3)); + SCRIPT_MSG(_T(" (caption:%") NPRIs _T(")"), line.gettoken_str(3)); #endif SCRIPT_MSG(_T("\n")); @@ -1593,7 +1582,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) set_uninstall_mode(1); } - SCRIPT_MSG(_T("PageEx: %s\n"), line.gettoken_str(1)); + SCRIPT_MSG(_T("PageEx: %") NPRIs _T("\n"), line.gettoken_str(1)); if (add_page(k) != PS_OK) return PS_ERROR; @@ -1763,17 +1752,17 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) int custom = cur_page_type == PAGE_CUSTOM ? 1 : 0; if (cur_page->prefunc>=0) - SCRIPT_MSG(_T(" %s:%s"), !custom?_T("pre"):_T("creator"), line.gettoken_str(1)); + SCRIPT_MSG(_T(" %") NPRIs _T(":%") NPRIs, !custom?_T("pre"):_T("creator"), line.gettoken_str(1)); if (cur_page->showfunc>=0 && !custom) - SCRIPT_MSG(_T(" show:%s"), line.gettoken_str(2)); + SCRIPT_MSG(_T(" show:%") NPRIs, line.gettoken_str(2)); if (cur_page->leavefunc>=0) - SCRIPT_MSG(_T(" leave:%s"), line.gettoken_str(3-custom)); + SCRIPT_MSG(_T(" leave:%") NPRIs, line.gettoken_str(3-custom)); SCRIPT_MSG(_T("\n")); } return PS_OK; #else - ERROR_MSG(_T("Error: %s specified, NSIS_SUPPORT_CODECALLBACKS not defined.\n"), line.gettoken_str(0)); + ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_CODECALLBACKS not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif//NSIS_SUPPORT_CODECALLBACKS #else @@ -1782,7 +1771,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) case TOK_PAGEEX: case TOK_PAGEEXEND: case TOK_PAGECALLBACKS: - ERROR_MSG(_T("Error: %s specified, NSIS_CONFIG_VISIBLE_SUPPORT not defined.\n"), line.gettoken_str(0)); + ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_CONFIG_VISIBLE_SUPPORT not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif//NSIS_CONFIG_VISIBLE_SUPPORT // header flags @@ -1794,12 +1783,12 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) TCHAR *str = line.gettoken_str(3); const int ret = SetLangString(name, lang, str); if (ret == PS_WARNING) - warning_fl(_T("LangString \"%s\" set multiple times for %d, wasting space"), name, lang); + warning_fl(_T("LangString \"%") NPRIs _T("\" set multiple times for %d, wasting space"), name, lang); else if (ret == PS_ERROR) { - ERROR_MSG(_T("Error: can't set LangString \"%s\"!\n"), name); + ERROR_MSG(_T("Error: can't set LangString \"%") NPRIs _T("\"!\n"), name); return PS_ERROR; } - SCRIPT_MSG(_T("LangString: \"%s\" %d \"%s\"\n"), name, lang, str); + SCRIPT_MSG(_T("LangString: \"%") NPRIs _T("\" %d \"%") NPRIs _T("\"\n"), name, lang, str); } return PS_OK; case TOK_LANGSTRINGUP: @@ -1811,7 +1800,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) #ifdef NSIS_CONFIG_SILENT_SUPPORT if (build_header.flags&(CH_FLAGS_SILENT|CH_FLAGS_SILENT_LOG)) { - warning_fl(_T("%s: SilentInstall enabled, wasting space"), cmdnam); + warning_fl(_T("%") NPRIs _T(": SilentInstall enabled, wasting space"), cmdnam); } #endif TCHAR *name = line.gettoken_str(1); @@ -1831,25 +1820,25 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ret = SetLangString(name, lang, data, true); if (ret == PS_WARNING) - warning_fl(_T("%s \"%s\" set multiple times for %d, wasting space"), cmdnam, name, lang); + warning_fl(_T("%") NPRIs _T(" \"%") NPRIs _T("\" set multiple times for %d, wasting space"), cmdnam, name, lang); else if (ret == PS_ERROR) { - ERROR_MSG(_T("Error: can't set %s \"%s\"!\n"), cmdnam, name); + ERROR_MSG(_T("Error: can't set %") NPRIs _T(" \"%") NPRIs _T("\"!\n"), cmdnam, name); return PS_ERROR; } - SCRIPT_MSG(_T("%s: \"%s\" %d \"%s\"\n"), cmdnam, name, lang, file); + SCRIPT_MSG(_T("%") NPRIs _T(": \"%") NPRIs _T("\" %d \"%") NPRIs _T("\"\n"), cmdnam, name, lang, file); return PS_OK; } return PS_OK; case TOK_NAME: { if (SetInnerString(NLF_NAME,line.gettoken_str(1)) == PS_WARNING) - warning_fl(_T("%s: specified multiple times, wasting space"),line.gettoken_str(0)); + warning_fl(_T("%") NPRIs _T(": specified multiple times, wasting space"),line.gettoken_str(0)); SetInnerString(NLF_NAME_DA,line.gettoken_str(2)); - SCRIPT_MSG(_T("Name: \"%s\""),line.gettoken_str(1)); + SCRIPT_MSG(_T("Name: \"%") NPRIs _T("\""),line.gettoken_str(1)); if (*line.gettoken_str(2)) - SCRIPT_MSG(_T(" \"%s\""),line.gettoken_str(2)); + SCRIPT_MSG(_T(" \"%") NPRIs _T("\""),line.gettoken_str(2)); SCRIPT_MSG(_T("\n")); } return PS_OK; @@ -1858,29 +1847,29 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) if (!cur_page) { if (SetInnerString(NLF_CAPTION,line.gettoken_str(1)) == PS_WARNING) - warning_fl(_T("%s: specified multiple times, wasting space"),line.gettoken_str(0)); + warning_fl(_T("%") NPRIs _T(": specified multiple times, wasting space"),line.gettoken_str(0)); } else { cur_page->caption = add_string(line.gettoken_str(1)); } - SCRIPT_MSG(_T("Caption: \"%s\"\n"),line.gettoken_str(1)); + SCRIPT_MSG(_T("Caption: \"%") NPRIs _T("\"\n"),line.gettoken_str(1)); } return PS_OK; case TOK_ICON: - SCRIPT_MSG(_T("Icon: \"%s\"\n"),line.gettoken_str(1)); + SCRIPT_MSG(_T("Icon: \"%") NPRIs _T("\"\n"),line.gettoken_str(1)); try { free_loaded_icon(installer_icon); installer_icon = load_icon_file(line.gettoken_str(1)); } catch (exception& err) { - ERROR_MSG(_T("Error while loading icon from \"%s\": %s\n"), line.gettoken_str(1), CtoTStrParam(err.what())); + ERROR_MSG(_T("Error while loading icon from \"%") NPRIs _T("\": %") NPRIs _T("\n"), line.gettoken_str(1), CtoTStrParam(err.what())); return PS_ERROR; } return PS_OK; #ifdef NSIS_CONFIG_COMPONENTPAGE case TOK_CHECKBITMAP: - SCRIPT_MSG(_T("CheckBitmap: \"%s\"\n"),line.gettoken_str(1)); + SCRIPT_MSG(_T("CheckBitmap: \"%") NPRIs _T("\"\n"),line.gettoken_str(1)); try { init_res_editor(); int err = update_bitmap(res_editor, IDB_BITMAP1, line.gettoken_str(1), 96, 16, 8); @@ -1903,13 +1892,13 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) } } catch (exception& err) { - ERROR_MSG(_T("Error while replacing bitmap: %s\n"), CtoTStrParam(err.what())); + ERROR_MSG(_T("Error while replacing bitmap: %") NPRIs _T("\n"), CtoTStrParam(err.what())); return PS_ERROR; } return PS_OK; #else//NSIS_CONFIG_COMPONENTPAGE case TOK_CHECKBITMAP: - ERROR_MSG(_T("Error: %s specified, NSIS_CONFIG_COMPONENTPAGE not defined.\n"), line.gettoken_str(0)); + ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_CONFIG_COMPONENTPAGE not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif//!NSIS_CONFIG_COMPONENTPAGE case TOK_DIRTEXT: @@ -1917,7 +1906,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) { if (!cur_page) { if (SetInnerString(NLF_DIR_TEXT, line.gettoken_str(1)) == PS_WARNING) - warning_fl(_T("%s: specified multiple times, wasting space"),line.gettoken_str(0)); + warning_fl(_T("%") NPRIs _T(": specified multiple times, wasting space"),line.gettoken_str(0)); if (line.getnumtokens() > 2) SetInnerString(NLF_DIR_SUBTEXT, line.gettoken_str(2)); if (line.getnumtokens() > 3) @@ -1938,11 +1927,11 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) if (line.getnumtokens() > 4) cur_page->parms[3] = add_string(line.gettoken_str(4)); } - SCRIPT_MSG(_T("DirText: \"%s\" \"%s\" \"%s\" \"%s\"\n"),line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3),line.gettoken_str(4)); + SCRIPT_MSG(_T("DirText: \"%") NPRIs _T("\" \"%") NPRIs _T("\" \"%") NPRIs _T("\" \"%") NPRIs _T("\"\n"),line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3),line.gettoken_str(4)); } return PS_OK; #else//NSIS_CONFIG_VISIBLE_SUPPORT - ERROR_MSG(_T("Error: %s specified, NSIS_CONFIG_VISIBLE_SUPPORT not defined.\n"), line.gettoken_str(0)); + ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_CONFIG_VISIBLE_SUPPORT not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif//!NSIS_CONFIG_VISIBLE_SUPPORT case TOK_DIRVAR: @@ -1953,7 +1942,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) } cur_page->parms[4] = GetUserVarIndex(line, 1) + 1; if (cur_page->parms[4] <= 0) PRINTHELP(); - SCRIPT_MSG(_T("DirVar: %s\n"), line.gettoken_str(1)); + SCRIPT_MSG(_T("DirVar: %") NPRIs _T("\n"), line.gettoken_str(1)); } return PS_OK; case TOK_DIRVERIFY: @@ -1968,7 +1957,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) PRINTHELP(); if (k) cur_page->flags |= PF_DIR_NO_BTN_DISABLE; - SCRIPT_MSG(_T("DirVerify: %s\n"), line.gettoken_str(1)); + SCRIPT_MSG(_T("DirVerify: %") NPRIs _T("\n"), line.gettoken_str(1)); } return PS_OK; case TOK_GETINSTDIRERROR: @@ -1981,7 +1970,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) { if (!cur_page) { if (SetInnerString(NLF_COMP_TEXT, line.gettoken_str(1)) == PS_WARNING) - warning_fl(_T("%s: specified multiple times, wasting space"),line.gettoken_str(0)); + warning_fl(_T("%") NPRIs _T(": specified multiple times, wasting space"),line.gettoken_str(0)); if (line.getnumtokens() > 2) SetInnerString(NLF_COMP_SUBTEXT1, line.gettoken_str(2)); if (line.getnumtokens() > 3) @@ -1998,7 +1987,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) cur_page->parms[3] = cur_page->parms[1]; cur_page->parms[4] = cur_page->parms[2]; } - SCRIPT_MSG(_T("ComponentText: \"%s\" \"%s\" \"%s\"\n"),line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3)); + SCRIPT_MSG(_T("ComponentText: \"%") NPRIs _T("\" \"%") NPRIs _T("\" \"%") NPRIs _T("\"\n"),line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3)); } return PS_OK; case TOK_INSTTYPE: @@ -2017,9 +2006,9 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) } else if (!_tcsnicmp(line.gettoken_str(1),_T("/CUSTOMSTRING="),14)) { - SCRIPT_MSG(_T("InstType: setting custom text to: \"%s\"\n"),line.gettoken_str(1)+14); + SCRIPT_MSG(_T("InstType: setting custom text to: \"%") NPRIs _T("\"\n"),line.gettoken_str(1)+14); if (SetInnerString(NLF_COMP_CUSTOM,line.gettoken_str(1)+14) == PS_WARNING) - warning_fl(_T("%s: specified multiple times, wasting space"),_T("InstType /CUSTOMSTRING")); + warning_fl(_T("%") NPRIs _T(": specified multiple times, wasting space"),_T("InstType /CUSTOMSTRING")); } else if (line.gettoken_str(1)[0]==_T('/')) { @@ -2043,7 +2032,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) else { cur_header->install_types[x] = add_string(itname); - SCRIPT_MSG(_T("InstType: %s%d=\"%s\"\n"), uninstall_mode ? _T("(uninstall) ") : _T(""), x+1, itname); + SCRIPT_MSG(_T("InstType: %") NPRIs _T("%d=\"%") NPRIs _T("\"\n"), uninstall_mode ? _T("(uninstall) ") : _T(""), x+1, itname); } set_uninstall_mode(0); @@ -2053,7 +2042,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) #else//NSIS_CONFIG_COMPONENTPAGE case TOK_COMPTEXT: case TOK_INSTTYPE: - ERROR_MSG(_T("Error: %s specified but NSIS_CONFIG_COMPONENTPAGE not defined\n"),line.gettoken_str(0)); + ERROR_MSG(_T("Error: %") NPRIs _T(" specified but NSIS_CONFIG_COMPONENTPAGE not defined\n"),line.gettoken_str(0)); return PS_ERROR; #endif//!NSIS_CONFIG_COMPONENTPAGE #ifdef NSIS_CONFIG_LICENSEPAGE @@ -2061,7 +2050,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) { if (!cur_page) { if (SetInnerString(NLF_LICENSE_TEXT, line.gettoken_str(1)) == PS_WARNING) - warning_fl(_T("%s: specified multiple times, wasting space"),line.gettoken_str(0)); + warning_fl(_T("%") NPRIs _T(": specified multiple times, wasting space"),line.gettoken_str(0)); SetInnerString(NLF_LICENSE_TEXT_FSRB, line.gettoken_str(1)); SetInnerString(NLF_LICENSE_TEXT_FSCB, line.gettoken_str(1)); if (line.getnumtokens() > 2) @@ -2075,7 +2064,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) cur_page->parms[0] = add_string(line.gettoken_str(1)); cur_page->next = add_string(line.gettoken_str(2)); } - SCRIPT_MSG(_T("LicenseText: \"%s\" \"%s\"\n"),line.gettoken_str(1),line.gettoken_str(2)); + SCRIPT_MSG(_T("LicenseText: \"%") NPRIs _T("\" \"%") NPRIs _T("\"\n"),line.gettoken_str(1),line.gettoken_str(2)); } return PS_OK; case TOK_LICENSEDATA: @@ -2110,7 +2099,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) if (!cur_page) { if (SetInnerString(NLF_LICENSE_DATA,data) == PS_WARNING) - warning_fl(_T("%s: specified multiple times, wasting space"),cmdnam); + warning_fl(_T("%") NPRIs _T(": specified multiple times, wasting space"),cmdnam); } else { if (cur_page_type != PAGE_LICENSE) { @@ -2120,7 +2109,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) cur_page->parms[1] = add_string(data, false, cp); } - SCRIPT_MSG(_T("LicenseData: \"%s\"\n"),file); + SCRIPT_MSG(_T("LicenseData: \"%") NPRIs _T("\"\n"),file); } return PS_OK; case TOK_LICENSEFORCESELECTION: @@ -2181,7 +2170,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) } } - SCRIPT_MSG(_T("LicenseForceSelection: %s \"%s\" \"%s\"\n"), line.gettoken_str(1), line.gettoken_str(2), line.gettoken_str(3)); + SCRIPT_MSG(_T("LicenseForceSelection: %") NPRIs _T(" \"%") NPRIs _T("\" \"%") NPRIs _T("\"\n"), line.gettoken_str(1), line.gettoken_str(2), line.gettoken_str(3)); } return PS_OK; case TOK_LICENSEBKCOLOR: @@ -2210,7 +2199,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) case TOK_LICENSETEXT: case TOK_LICENSEDATA: case TOK_LICENSEBKCOLOR: - ERROR_MSG(_T("Error: %s specified, NSIS_CONFIG_LICENSEPAGE not defined.\n"), line.gettoken_str(0)); + ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_CONFIG_LICENSEPAGE not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif//!NSIS_CONFIG_LICENSEPAGE #ifdef NSIS_CONFIG_SILENT_SUPPORT @@ -2225,7 +2214,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) return PS_ERROR; } #endif//NSIS_CONFIG_LOG - SCRIPT_MSG(_T("SilentInstall: %s\n"),line.gettoken_str(1)); + SCRIPT_MSG(_T("SilentInstall: %") NPRIs _T("\n"),line.gettoken_str(1)); #ifdef NSIS_CONFIG_LICENSEPAGE if (k && HasUserDefined(NLF_LICENSE_DATA)) { @@ -2252,11 +2241,11 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) build_uninst.flags|=CH_FLAGS_SILENT; else build_uninst.flags&=~CH_FLAGS_SILENT; - SCRIPT_MSG(_T("SilentUnInstall: %s\n"),line.gettoken_str(1)); + SCRIPT_MSG(_T("SilentUnInstall: %") NPRIs _T("\n"),line.gettoken_str(1)); } return PS_OK; #else - ERROR_MSG(_T("Error: %s specified, NSIS_CONFIG_UNINSTALL_SUPPORT not defined.\n"), line.gettoken_str(0)); + ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_CONFIG_UNINSTALL_SUPPORT not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif case TOK_IFSILENT: @@ -2265,7 +2254,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) process_jump(line,2,&ent.offsets[1])) PRINTHELP() ent.offsets[2]=FLAG_OFFSET(silent); ent.offsets[3]=~0;//new value mask - keep flag - SCRIPT_MSG(_T("IfSilent ?%s:%s\n"),line.gettoken_str(1),line.gettoken_str(2)); + SCRIPT_MSG(_T("IfSilent ?%") NPRIs _T(":%") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(2)); return add_entry(&ent); case TOK_SETSILENT: { @@ -2274,7 +2263,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) int k=line.gettoken_enum(1,_T("normal\0silent\0")); if (k<0) PRINTHELP() ent.offsets[1]=add_intstring(k); - SCRIPT_MSG(_T("SetSilent: %s\n"),line.gettoken_str(1)); + SCRIPT_MSG(_T("SetSilent: %") NPRIs _T("\n"),line.gettoken_str(1)); } return add_entry(&ent); #else//!NSIS_CONFIG_SILENT_SUPPORT @@ -2282,19 +2271,19 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) case TOK_SILENTUNINST: case TOK_IFSILENT: case TOK_SETSILENT: - ERROR_MSG(_T("Error: %s specified, NSIS_CONFIG_SILENT_SUPPORT not defined.\n"), line.gettoken_str(0)); + ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_CONFIG_SILENT_SUPPORT not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif//NSIS_CONFIG_SILENT_SUPPORT case TOK_OUTFILE: _tcsnccpy(build_output_filename,line.gettoken_str(1),1024-1); - SCRIPT_MSG(_T("OutFile: \"%s\"\n"),build_output_filename); + SCRIPT_MSG(_T("OutFile: \"%") NPRIs _T("\"\n"),build_output_filename); return PS_OK; case TOK_INSTDIR: { TCHAR *p = line.gettoken_str(1); if (build_header.install_directory_ptr) { - warning_fl(_T("%s: specified multiple times. wasting space"),line.gettoken_str(0)); + warning_fl(_T("%") NPRIs _T(": specified multiple times. wasting space"),line.gettoken_str(0)); } build_header.install_directory_ptr = add_string(p); build_header.install_directory_auto_append = 0; @@ -2310,14 +2299,14 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) build_header.install_directory_auto_append = add_string(p2 + 1); } } - SCRIPT_MSG(_T("InstallDir: \"%s\"\n"),line.gettoken_str(1)); + SCRIPT_MSG(_T("InstallDir: \"%") NPRIs _T("\"\n"),line.gettoken_str(1)); } return PS_OK; case TOK_INSTALLDIRREGKEY: // InstallDirRegKey { if (build_header.install_reg_key_ptr) { - warning_fl(_T("%s: specified multiple times, wasting space"),line.gettoken_str(0)); + warning_fl(_T("%") NPRIs _T(": specified multiple times, wasting space"),line.gettoken_str(0)); } int k=line.gettoken_enum(1,rootkeys[0]); if (k == -1) k=line.gettoken_enum(1,rootkeys[1]); @@ -2326,15 +2315,15 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) if (!build_header.install_reg_rootkey) PRINTHELP() // SHCTX is invalid here build_header.install_reg_key_ptr = add_string(line.gettoken_str(2),0); if (line.gettoken_str(2)[0] == _T('\\')) - warning_fl(_T("%s: registry path name begins with \'\\\', may cause problems"),line.gettoken_str(0)); + warning_fl(_T("%") NPRIs _T(": registry path name begins with \'\\\', may cause problems"),line.gettoken_str(0)); build_header.install_reg_value_ptr = add_string(line.gettoken_str(3),0); - SCRIPT_MSG(_T("InstallRegKey: \"%s\\%s\\%s\"\n"),line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3)); + SCRIPT_MSG(_T("InstallRegKey: \"%") NPRIs _T("\\%") NPRIs _T("\\%") NPRIs _T("\"\n"),line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3)); } return PS_OK; case TOK_CRCCHECK: build_crcchk=line.gettoken_enum(1,_T("off\0on\0force\0")); if (build_crcchk==-1) PRINTHELP() - SCRIPT_MSG(_T("CRCCheck: %s\n"),line.gettoken_str(1)); + SCRIPT_MSG(_T("CRCCheck: %") NPRIs _T("\n"),line.gettoken_str(1)); return PS_OK; case TOK_INSTPROGRESSFLAGS: { @@ -2353,7 +2342,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) BYTE* dlg = res_editor->GetResource(RT_DIALOG, IDD_INSTFILES, NSIS_DEFAULT_LANG); if (!dlg) throw runtime_error("IDD_INSTFILES doesn't exist!"); CDialogTemplate dt(dlg,build_unicode,uDefCodePage); - free(dlg); + res_editor->FreeResource(dlg); DialogItemTemplate* progress = dt.GetItem(IDC_PROGRESS); if (!progress) { throw runtime_error("IDC_PROGRESS doesn't exist!"); @@ -2370,7 +2359,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) delete [] dlg; } catch (exception& err) { - ERROR_MSG(_T("Error setting smooth progress bar: %s\n"), CtoTStrParam(err.what())); + ERROR_MSG(_T("Error setting smooth progress bar: %") NPRIs _T("\n"), CtoTStrParam(err.what())); return PS_ERROR; } SCRIPT_MSG(_T("InstProgressFlags: smooth=%d, colored=%d\n"),smooth, @@ -2385,17 +2374,17 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) build_header.flags|=CH_FLAGS_AUTO_CLOSE; else build_header.flags&=~CH_FLAGS_AUTO_CLOSE; - SCRIPT_MSG(_T("AutoCloseWindow: %s\n"),k?_T("true"):_T("false")); + SCRIPT_MSG(_T("AutoCloseWindow: %") NPRIs _T("\n"),k?_T("true"):_T("false")); } return PS_OK; case TOK_WINDOWICON: #ifdef NSIS_CONFIG_VISIBLE_SUPPORT disable_window_icon=line.gettoken_enum(1,_T("on\0off\0")); if (disable_window_icon == -1) PRINTHELP(); - SCRIPT_MSG(_T("WindowIcon: %s\n"),line.gettoken_str(1)); + SCRIPT_MSG(_T("WindowIcon: %") NPRIs _T("\n"),line.gettoken_str(1)); return PS_OK; #else - ERROR_MSG(_T("Error: %s specified, NSIS_CONFIG_VISIBLE_SUPPORT not defined.\n"),line.gettoken_str(0)); + ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_CONFIG_VISIBLE_SUPPORT not defined.\n"),line.gettoken_str(0)); return PS_ERROR; #endif // NSIS_CONFIG_VISIBLE_SUPPORT case TOK_SHOWDETAILSUNINST: @@ -2425,7 +2414,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) else if (k==2) build_header.flags|=CH_FLAGS_DETAILS_NEVERSHOW; } - SCRIPT_MSG(_T("%s: %s\n"),line.gettoken_str(0),line.gettoken_str(1)); + SCRIPT_MSG(_T("%") NPRIs _T(": %") NPRIs _T("\n"),line.gettoken_str(0),line.gettoken_str(1)); } return PS_OK; case TOK_DIRSHOW: @@ -2436,7 +2425,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) build_header.flags|=CH_FLAGS_DIR_NO_SHOW; else build_header.flags&=~CH_FLAGS_DIR_NO_SHOW; - SCRIPT_MSG(_T("DirShow: %s\n"),k?_T("hide"):_T("show")); + SCRIPT_MSG(_T("DirShow: %") NPRIs _T("\n"),k?_T("hide"):_T("show")); }*/ ERROR_MSG(_T("Error: DirShow doesn't currently work\n")); return PS_ERROR; @@ -2448,7 +2437,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) build_header.flags|=CH_FLAGS_NO_ROOT_DIR; else build_header.flags&=~CH_FLAGS_NO_ROOT_DIR; - SCRIPT_MSG(_T("AllowRootDirInstall: %s\n"),k?_T("false"):_T("true")); + SCRIPT_MSG(_T("AllowRootDirInstall: %") NPRIs _T("\n"),k?_T("false"):_T("true")); } return PS_OK; case TOK_BGFONT: @@ -2480,7 +2469,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) _tcsnccpy(newfont.lfFaceName,line.gettoken_str(1),LF_FACESIZE); - SCRIPT_MSG(_T("BGFont: \"%s\""),line.gettoken_str(1)); + SCRIPT_MSG(_T("BGFont: \"%") NPRIs _T("\""),line.gettoken_str(1)); { bool height=false; bool weight=false; @@ -2506,12 +2495,12 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) } else { if (!height) { - SCRIPT_MSG(_T(" height=%s"),tok); + SCRIPT_MSG(_T(" height=%") NPRIs,tok); newfont.lfHeight=line.gettoken_int(i); height=true; } else if (!weight) { - SCRIPT_MSG(_T(" weight=%s"),tok); + SCRIPT_MSG(_T(" weight=%") NPRIs,tok); newfont.lfWeight=line.gettoken_int(i); weight=true; } @@ -2606,7 +2595,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) { int k=line.gettoken_enum(1,_T("on\0off\0")); if (k == -1) PRINTHELP() - SCRIPT_MSG(_T("XPStyle: %s\n"), line.gettoken_str(1)); + SCRIPT_MSG(_T("XPStyle: %") NPRIs _T("\n"), line.gettoken_str(1)); if (!k) manifest_comctl = manifest::comctl_xp; else @@ -2621,7 +2610,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) FILE *fui = FOPEN(line.gettoken_str(2), ("rb")); if (!fui) { - ERROR_MSG(_T("Error: Can't open \"%s\"!\n"), line.gettoken_str(2)); + ERROR_MSG(_T("Error: Can't open \"%") NPRIs _T("\"!\n"), line.gettoken_str(2)); return PS_ERROR; } MANAGE_WITH(fui, fclose); @@ -2636,7 +2625,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) } MANAGE_WITH(ui, free); if (fread(ui, 1, len, fui) != len) { - ERROR_MSG(_T("Error: Can't read \"%s\"!\n"), line.gettoken_str(2)); + ERROR_MSG(_T("Error: Can't read \"%") NPRIs _T("\"!\n"), line.gettoken_str(2)); return PS_ERROR; } @@ -2646,8 +2635,8 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) // Search for required items #define GET(x) dlg = uire->GetResource(RT_DIALOG, x, 0); if (!dlg) return PS_ERROR; CDialogTemplate UIDlg(dlg, build_unicode, uDefCodePage); - #define SEARCH(x) if (!UIDlg.GetItem(x)) {ERROR_MSG(_T("Error: Can't find %s (%u) in the custom UI!\n"), _T(#x), x);delete [] dlg;delete uire;return PS_ERROR;} - #define SAVE(x) delete [] dlg; dlg = UIDlg.Save(dwSize); res_editor->UpdateResource(RT_DIALOG, x, NSIS_DEFAULT_LANG, dlg, dwSize); delete [] dlg; + #define SEARCH(x) if (!UIDlg.GetItem(x)) {ERROR_MSG(_T("Error: Can't find %") NPRIs _T(" (%u) in the custom UI!\n"), _T(#x), x);uire->FreeResource(dlg);delete uire;return PS_ERROR;} + #define SAVE(x) uire->FreeResource(dlg); dlg = UIDlg.Save(dwSize); res_editor->UpdateResource(RT_DIALOG, x, NSIS_DEFAULT_LANG, dlg, dwSize); uire->FreeResource(dlg); LPBYTE dlg = NULL; @@ -2689,11 +2678,11 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) bool check = false; if (IS_INTRESOURCE(dlgItem->szClass)) { - if (dlgItem->szClass == MAKEINTRESOURCEW(0x0082)) { + if (dlgItem->szClass == MAKEINTRESOURCEWINW(0x0082)) { check = true; } } else { - check = _wcsicmp(dlgItem->szClass, L"Static") == 0; + check = WinWStrICmpASCII(dlgItem->szClass, "Static") == 0; } if (check) { @@ -2745,10 +2734,10 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) delete uire; - SCRIPT_MSG(_T("ChangeUI: %s %s%s\n"), line.gettoken_str(1), line.gettoken_str(2), branding_image_found?_T(" (branding image holder found)"):_T("")); + SCRIPT_MSG(_T("ChangeUI: %") NPRIs _T(" %") NPRIs _T("%") NPRIs _T("\n"), line.gettoken_str(1), line.gettoken_str(2), branding_image_found?_T(" (branding image holder found)"):_T("")); } catch (exception& err) { - ERROR_MSG(_T("Error while changing UI: %s\n"), CtoTStrParam(err.what())); + ERROR_MSG(_T("Error while changing UI: %") NPRIs _T("\n"), CtoTStrParam(err.what())); return PS_ERROR; } return PS_OK; @@ -2774,7 +2763,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) brandingCtl.dwStyle = SS_BITMAP | WS_CHILD | WS_VISIBLE; brandingCtl.sX = padding; brandingCtl.sY = padding; - brandingCtl.szClass = MAKEINTRESOURCEW(0x0082); + brandingCtl.szClass = MAKEINTRESOURCEWINW(0x0082); brandingCtl.szTitle = NULL; brandingCtl.wId = IDC_BRANDIMAGE; @@ -2810,19 +2799,17 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) DWORD dwDlgSize; dlg = dt.Save(dwDlgSize); - res_editor->UpdateResource(RT_DIALOG, IDD_INST, NSIS_DEFAULT_LANG, dlg, dwDlgSize); - - delete [] dlg; + res_editor->FreeResource(dlg); dt.DlgUnitsToPixels(brandingCtl.sWidth, brandingCtl.sHeight); - SCRIPT_MSG(_T("AddBrandingImage: %s %ux%u\n"), line.gettoken_str(1), brandingCtl.sWidth, brandingCtl.sHeight); + SCRIPT_MSG(_T("AddBrandingImage: %") NPRIs _T(" %ux%u\n"), line.gettoken_str(1), brandingCtl.sWidth, brandingCtl.sHeight); branding_image_found = true; branding_image_id = IDC_BRANDIMAGE; } catch (exception& err) { - ERROR_MSG(_T("Error while adding image branding support: %s\n"), CtoTStrParam(err.what())); + ERROR_MSG(_T("Error while adding image branding support: %") NPRIs _T("\n"), CtoTStrParam(err.what())); return PS_ERROR; } return PS_OK; @@ -2842,7 +2829,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) table->nlf.m_iFontSize = line.gettoken_int(3); if (table->nlf.m_szFont) - SCRIPT_MSG(_T("SetFont: lang=%d \"%s\" %s\n"), lang_id, facename, line.gettoken_str(3)); + SCRIPT_MSG(_T("SetFont: lang=%d \"%") NPRIs _T("\" %") NPRIs _T("\n"), lang_id, facename, line.gettoken_str(3)); else ++failed; } @@ -2852,7 +2839,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) _tcsnccpy(build_font, facename, COUNTOF(build_font)); build_font_size = line.gettoken_int(2); - if (!failed) SCRIPT_MSG(_T("SetFont: \"%s\" %s\n"), facename, line.gettoken_str(2)); + if (!failed) SCRIPT_MSG(_T("SetFont: \"%") NPRIs _T("\" %") NPRIs _T("\n"), facename, line.gettoken_str(2)); } if (failed) { @@ -2867,7 +2854,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) case TOK_CHANGEUI: case TOK_ADDBRANDINGIMAGE: case TOK_SETFONT: - ERROR_MSG(_T("Error: %s specified, NSIS_CONFIG_VISIBLE_SUPPORT not defined.\n"),line.gettoken_str(0)); + ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_CONFIG_VISIBLE_SUPPORT not defined.\n"),line.gettoken_str(0)); return PS_ERROR; #endif// NSIS_CONFIG_VISIBLE_SUPPORT @@ -2920,7 +2907,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) { int k = line.gettoken_enum(1,_T("false\0true\0")); if (-1==k) PRINTHELP(); - SCRIPT_MSG(_T("Unicode: %s\n"),k?_T("true"):_T("false")); + SCRIPT_MSG(_T("Unicode: %") NPRIs _T("\n"),k?_T("true"):_T("false")); const bool newtargetcs = !!k; if (newtargetcs != build_unicode) { @@ -2975,7 +2962,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) if (a != line.getnumtokens() - 1) { - ERROR_MSG(_T("%s expects %d parameters, got %d.\n"), line.gettoken_str(0), a + 1, line.getnumtokens()); + ERROR_MSG(_T("%") NPRIs _T(" expects %d parameters, got %d.\n"), line.gettoken_str(0), a + 1, line.getnumtokens()); PRINTHELP(); } @@ -3002,20 +2989,20 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) if (set_compressor(compressor_name, build_compress_whole) != PS_OK) { - SCRIPT_MSG(_T("SetCompressor: error loading stub for \"%s\" compressor.\n"), compressor_name.c_str()); + SCRIPT_MSG(_T("SetCompressor: error loading stub for \"%") NPRIs _T("\" compressor.\n"), compressor_name.c_str()); return PS_ERROR; } - SCRIPT_MSG(_T("SetCompressor: %s%s%s\n"), build_compressor_final ? _T("/FINAL ") : _T(""), build_compress_whole ? _T("/SOLID ") : _T(""), line.gettoken_str(a)); + SCRIPT_MSG(_T("SetCompressor: %") NPRIs _T("%") NPRIs _T("%") NPRIs _T("\n"), build_compressor_final ? _T("/FINAL ") : _T(""), build_compress_whole ? _T("/SOLID ") : _T(""), line.gettoken_str(a)); } return PS_OK; #else//NSIS_CONFIG_COMPRESSION_SUPPORT - ERROR_MSG(_T("Error: %s specified, NSIS_CONFIG_COMPRESSION_SUPPORT not defined.\n"), line.gettoken_str(0)); + ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_CONFIG_COMPRESSION_SUPPORT not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif//NSIS_CONFIG_COMPRESSION_SUPPORT case TOK_LOADNLF: { - SCRIPT_MSG(_T("LoadLanguageFile: %s\n"), line.gettoken_str(1)); + SCRIPT_MSG(_T("LoadLanguageFile: %") NPRIs _T("\n"), line.gettoken_str(1)); LanguageTable *table = LoadLangFile(line.gettoken_str(1)); @@ -3034,11 +3021,11 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) TCHAR lang_id[16]; TCHAR lang_cp[16]; TCHAR lang_name[1024]; - wsprintf(lang_name, _T("LANG_%s"), table->nlf.m_szName); + wsprintf(lang_name, _T("LANG_%") NPRIs, table->nlf.m_szName); wsprintf(lang_id, _T("%u"), table->lang_id); wsprintf(lang_cp, _T("%u"), table->nlf.m_uCodePage); definedlist.add(lang_name, lang_id); - wsprintf(lang_name, _T("LANG_%s_CP"), table->nlf.m_szName); + wsprintf(lang_name, _T("LANG_%") NPRIs _T("_CP"), table->nlf.m_szName); definedlist.add(lang_name, lang_cp); } return PS_OK; @@ -3047,14 +3034,11 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) /////////////////////////////////////////////////////////////////////////////// case TOK_P_DEFINE: { - TCHAR *define=line.gettoken_str(1); - TCHAR *value; + TCHAR *define=line.gettoken_str(1), *value; GrowBuf file_buf; - TCHAR datebuf[256]; - TCHAR mathbuf[256]; + TCHAR datebuf[256], mathbuf[256]; int dupemode=0; - if (!_tcsicmp(define,_T("/ifndef"))) dupemode=1; else if (!_tcsicmp(define,_T("/redef"))) @@ -3067,17 +3051,13 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) if (dupemode==1 && definedlist.find(define)) return PS_OK; } - if (!_tcsicmp(define,_T("/date")) || !_tcsicmp(define,_T("/utcdate"))) { if (line.getnumtokens()!=4) PRINTHELP() TCHAR *date_type = define; - - define=line.gettoken_str(2); - value=line.gettoken_str(3); - time_t rawtime; time(&rawtime); + define=line.gettoken_str(2), value=line.gettoken_str(3); if (!_tcsicmp(date_type,_T("/utcdate"))) rawtime = mktime(gmtime(&rawtime)); @@ -3098,7 +3078,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) NIStream filestrm; if (!filestrm.OpenFileForReading(filename)) { if (!swit[5]) { // "/file" vs "/file_noerr" - ERROR_MSG(_T("!define /file: file not found (\"%s\")\n"),filename); + ERROR_MSG(_T("!define /file: file not found (\"%") NPRIs _T("\")\n"),filename); return PS_ERROR; } } else { @@ -3110,7 +3090,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) if (!cch) { if (*str) { tstring lrmsg=lr.GetErrorMessage((UINT)*str,filename,linnum); - ERROR_MSG(_T("!define %s: %s"),swit,lrmsg.c_str()); + ERROR_MSG(_T("!define %") NPRIs _T(": %") NPRIs,swit,lrmsg.c_str()); return PS_ERROR; } break; // EOF @@ -3125,11 +3105,10 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) value = (TCHAR *)file_buf.get(); } else if (!_tcsicmp(define,_T("/math"))) { - - int value1; - int value2; + + int value1, value2; TCHAR *mathop; - + if (line.getnumtokens()!=6) PRINTHELP() define = line.gettoken_str(2); @@ -3179,36 +3158,40 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) if (dupemode==2)definedlist.del(define); if (definedlist.add(define,value)) { - ERROR_MSG(_T("!define: \"%s\" already defined!\n"),define); + ERROR_MSG(_T("!define: \"%") NPRIs _T("\" already defined!\n"),define); return PS_ERROR; } - SCRIPT_MSG(_T("!define: \"%s\"=\"%s\"\n"),define,value); + SCRIPT_MSG(_T("!define: \"%") NPRIs _T("\"=\"%") NPRIs _T("\"\n"),define,value); } return PS_OK; case TOK_P_UNDEF: if (definedlist.del(line.gettoken_str(1))) { - ERROR_MSG(_T("!undef: \"%s\" not defined!\n"),line.gettoken_str(1)); + ERROR_MSG(_T("!undef: \"%") NPRIs _T("\" not defined!\n"),line.gettoken_str(1)); return PS_ERROR; } - SCRIPT_MSG(_T("!undef: \"%s\"\n"),line.gettoken_str(1)); + SCRIPT_MSG(_T("!undef: \"%") NPRIs _T("\"\n"),line.gettoken_str(1)); return PS_OK; case TOK_P_PACKEXEHEADER: - _tcsnccpy(build_packname,line.gettoken_str(1),COUNTOF(build_packname)-1); - _tcsnccpy(build_packcmd,line.gettoken_str(2),COUNTOF(build_packcmd)-1); - SCRIPT_MSG(_T("!packhdr: filename=\"%s\", command=\"%s\"\n"), - build_packname, build_packcmd); + { + TCHAR* packname = line.gettoken_str(1); + PATH_CONVERT(packname); + _tcsnccpy(build_packname,packname,COUNTOF(build_packname)-1); + _tcsnccpy(build_packcmd,line.gettoken_str(2),COUNTOF(build_packcmd)-1); + SCRIPT_MSG(_T("!packhdr: filename=\"%") NPRIs _T("\", command=\"%") NPRIs _T("\"\n"), + build_packname, build_packcmd); + } return PS_OK; case TOK_P_FINALIZE: { TCHAR* cmdstr=line.gettoken_str(1); struct postbuild_cmd *newcmd, *prevcmd; - newcmd = (struct postbuild_cmd*) new BYTE[FIELD_OFFSET(struct postbuild_cmd,cmd[_tcsclen(cmdstr)+1])]; + newcmd = (struct postbuild_cmd*) (new BYTE[FIELD_OFFSET(struct postbuild_cmd,cmd[_tcsclen(cmdstr)+1])]); newcmd->next=NULL; _tcscpy(newcmd->cmd,cmdstr); for (prevcmd=postbuild_cmds; prevcmd && prevcmd->next;) prevcmd = prevcmd->next; if (prevcmd) prevcmd->next = newcmd; else postbuild_cmds = newcmd; - SCRIPT_MSG(_T("!finalize: \"%s\"\n"),cmdstr); + SCRIPT_MSG(_T("!finalize: \"%") NPRIs _T("\"\n"),cmdstr); } return PS_OK; case TOK_P_SYSTEMEXEC: @@ -3221,13 +3204,8 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) int success=0; int cmpv=line.gettoken_int(3,&success); if (!success && comp != 4) PRINTHELP() - SCRIPT_MSG(_T("!system: \"%s\"\n"),exec); -#ifdef _WIN32 + SCRIPT_MSG(_T("!system: \"%") NPRIs _T("\"\n"),exec); int ret=sane_system(exec); -#else - PATH_CONVERT(exec); - int ret=system(exec); -#endif if (comp == 0 && ret < cmpv); else if (comp == 1 && ret > cmpv); else if (comp == 2 && ret != cmpv); @@ -3244,7 +3222,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) case TOK_P_EXECUTE: { TCHAR *exec=line.gettoken_str(1); - SCRIPT_MSG(_T("!execute: \"%s\"\n"),exec); + SCRIPT_MSG(_T("!execute: \"%") NPRIs _T("\"\n"),exec); #ifdef _WIN32 #ifdef _UNICODE RunChildProcessRedirected(0,exec); @@ -3259,9 +3237,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) } #endif #else - TCHAR *execfixed = my_convert(exec); - system(execfixed); - my_convert_free(execfixed); + sane_system(exec); #endif } case TOK_P_ADDINCLUDEDIR: @@ -3366,10 +3342,10 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) if (!included) { if(required) { - ERROR_MSG(_T("!include: could not find: \"%s\"\n"),f); + ERROR_MSG(_T("!include: could not find: \"%") NPRIs _T("\"\n"),f); return PS_ERROR; } else { - warning_fl(_T("!include: could not find: \"%s\""),f); + warning_fl(_T("!include: could not find: \"%") NPRIs _T("\""),f); } } } @@ -3377,18 +3353,18 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) case TOK_P_CD: if (!line.gettoken_str(1)[0] || _tchdir(line.gettoken_str(1))) { - ERROR_MSG(_T("!cd: error changing to: \"%s\"\n"),line.gettoken_str(1)); + ERROR_MSG(_T("!cd: error changing to: \"%") NPRIs _T("\"\n"),line.gettoken_str(1)); return PS_ERROR; } return PS_OK; case TOK_P_ERROR: - ERROR_MSG(_T("!error: %s\n"),line.gettoken_str(1)); + ERROR_MSG(_T("!error: %") NPRIs _T("\n"),line.gettoken_str(1)); return PS_ERROR; case TOK_P_WARNING: - warning_fl(_T("!warning: %s"),line.gettoken_str(1)); + warning_fl(_T("!warning: %") NPRIs,line.gettoken_str(1)); return PS_OK; case TOK_P_ECHO: - SCRIPT_MSG(_T("%s (%s:%d)\n"), line.gettoken_str(1),curfilename,linecnt); + SCRIPT_MSG(_T("%") NPRIs _T(" (%") NPRIs _T(":%d)\n"), line.gettoken_str(1),curfilename,linecnt); return PS_OK; case TOK_P_SEARCHPARSESTRING: { @@ -3415,7 +3391,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) NIStream filestrm; if (!filestrm.OpenFileForReading(filename)) { - ERROR_MSG(_T("!searchparse /file: error opening \"%s\"\n"),filename); + ERROR_MSG(_T("!searchparse /file: error opening \"%") NPRIs _T("\"\n"),filename); return PS_ERROR; } UINT req_parm=(line.getnumtokens() - parmOffs)/2, fail_parm=0; @@ -3435,7 +3411,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) if (*str) { tstring lrmsg=lr.GetErrorMessage((UINT)*str,filename,linnum); - ERROR_MSG(_T("!searchparse: %s"),lrmsg.c_str()); + ERROR_MSG(_T("!searchparse: %") NPRIs,lrmsg.c_str()); return PS_ERROR; } break; // EOF @@ -3481,7 +3457,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) { const TCHAR *msgprefix=!fail_parm ? _T("starting ") : _T(""); TCHAR *p=line.gettoken_str(parmOffs + (fail_parm*2)); - ERROR_MSG(_T("!searchparse: %sstring \"%s\" not found in file!\n"),msgprefix,p?p:_T("(null)")); + ERROR_MSG(_T("!searchparse: %") NPRIs _T("string \"%") NPRIs _T("\" not found in file!\n"),msgprefix,p?p:_T("(null)")); return PS_ERROR; } } @@ -3544,10 +3520,10 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) if (definedlist.add(define,(TCHAR*)valout.get())) { - ERROR_MSG(_T("!searchreplace: error defining \"%s\"!\n"),define); + ERROR_MSG(_T("!searchreplace: error defining \"%") NPRIs _T("\"!\n"),define); return PS_ERROR; } - SCRIPT_MSG(_T("!searchreplace: \"%s\"=\"%s\"\n"),define,(TCHAR*)valout.get()); + SCRIPT_MSG(_T("!searchreplace: \"%") NPRIs _T("\"=\"%") NPRIs _T("\"\n"),define,(TCHAR*)valout.get()); } return PS_OK; @@ -3627,18 +3603,18 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) case TOK_UNINSTCAPTION: { if (SetInnerString(NLF_UCAPTION,line.gettoken_str(1)) == PS_WARNING) - warning_fl(_T("%s: specified multiple times, wasting space"),line.gettoken_str(0)); - SCRIPT_MSG(_T("UninstCaption: \"%s\"\n"),line.gettoken_str(1)); + warning_fl(_T("%") NPRIs _T(": specified multiple times, wasting space"),line.gettoken_str(0)); + SCRIPT_MSG(_T("UninstCaption: \"%") NPRIs _T("\"\n"),line.gettoken_str(1)); } return PS_OK; case TOK_UNINSTICON: - SCRIPT_MSG(_T("UninstallIcon: \"%s\"\n"),line.gettoken_str(1)); + SCRIPT_MSG(_T("UninstallIcon: \"%") NPRIs _T("\"\n"),line.gettoken_str(1)); try { free_loaded_icon(uninstaller_icon); uninstaller_icon = load_icon_file(line.gettoken_str(1)); } catch (exception& err) { - ERROR_MSG(_T("Error while loading icon from \"%s\": %s\n"), line.gettoken_str(1), CtoTStrParam(err.what())); + ERROR_MSG(_T("Error while loading icon from \"%") NPRIs _T("\": %") NPRIs _T("\n"), line.gettoken_str(1), CtoTStrParam(err.what())); return PS_ERROR; } return PS_OK; @@ -3646,7 +3622,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) { if (!cur_page) { if (SetInnerString(NLF_UNINST_TEXT, line.gettoken_str(1)) == PS_WARNING) - warning_fl(_T("%s: specified multiple times, wasting space"),line.gettoken_str(0)); + warning_fl(_T("%") NPRIs _T(": specified multiple times, wasting space"),line.gettoken_str(0)); SetInnerString(NLF_UNINST_SUBTEXT, line.gettoken_str(2)); } else { @@ -3657,7 +3633,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) cur_page->parms[0] = add_string(line.gettoken_str(1)); cur_page->parms[1] = add_string(line.gettoken_str(2)); } - SCRIPT_MSG(_T("UninstallText: \"%s\" \"%s\"\n"),line.gettoken_str(1),line.gettoken_str(2)); + SCRIPT_MSG(_T("UninstallText: \"%") NPRIs _T("\" \"%") NPRIs _T("\"\n"),line.gettoken_str(1),line.gettoken_str(2)); } return PS_OK; case TOK_UNINSTSUBCAPTION: @@ -3666,7 +3642,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) int w=line.gettoken_int(1,&s); if (!s || w < 0 || w > 2) PRINTHELP() SetInnerString(NLF_USUBCAPTION_CONFIRM+w,line.gettoken_str(2)); - SCRIPT_MSG(_T("UninstSubCaption: page:%d, text=%s\n"),w,line.gettoken_str(2)); + SCRIPT_MSG(_T("UninstSubCaption: page:%d, text=%") NPRIs _T("\n"),w,line.gettoken_str(2)); } return PS_OK; case TOK_WRITEUNINSTALLER: @@ -3683,7 +3659,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ent.offsets[3]=add_string(full.c_str()); // ent.offsets[1] and ent.offsets[2] are set in CEXEBuild::uninstall_generate() if (!ent.offsets[0]) PRINTHELP() - SCRIPT_MSG(_T("WriteUninstaller: \"%s\"\n"),line.gettoken_str(1)); + SCRIPT_MSG(_T("WriteUninstaller: \"%") NPRIs _T("\"\n"),line.gettoken_str(1)); DefineInnerLangString(NLF_ERR_CREATING); DefineInnerLangString(NLF_CREATED_UNINST); @@ -3695,7 +3671,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) case TOK_UNINSTICON: case TOK_UNINSTTEXT: case TOK_UNINSTSUBCAPTION: - ERROR_MSG(_T("Error: %s specified, NSIS_CONFIG_UNINSTALL_SUPPORT not defined.\n"), line.gettoken_str(0)); + ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_CONFIG_UNINSTALL_SUPPORT not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif @@ -3714,8 +3690,8 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) } else if (line.getnumtokens() > 3) PRINTHELP(); - SCRIPT_MSG(_T("Section: \"%s\""),line.gettoken_str(a)); - if (line.gettoken_str(a+1)[0]) SCRIPT_MSG(_T(" ->(%s)"),line.gettoken_str(a+1)); + SCRIPT_MSG(_T("Section: \"%") NPRIs _T("\""),line.gettoken_str(a)); + if (line.gettoken_str(a+1)[0]) SCRIPT_MSG(_T(" ->(%") NPRIs _T(")"),line.gettoken_str(a+1)); SCRIPT_MSG(_T("\n")); #ifndef NSIS_CONFIG_UNINSTALL_SUPPORT if (!_tcsicmp(line.gettoken_str(a),_T("uninstall"))) @@ -3785,7 +3761,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ex = 1; a++; } - wsprintf(buf,_T("\x1F%s"),line.gettoken_str(a)); + wsprintf(buf,_T("\x1F%") NPRIs,line.gettoken_str(a)); if (which_token == TOK_SECTIONGROUP || which_token == TOK_SUBSECTION) { TCHAR *s = line.gettoken_str(a); @@ -3793,8 +3769,8 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) PRINTHELP(); } - SCRIPT_MSG(_T("%s %s"),line.gettoken_str(0),line.gettoken_str(a)); - if (line.gettoken_str(a+1)[0]) SCRIPT_MSG(_T(" ->(%s)"),line.gettoken_str(a+1)); + SCRIPT_MSG(_T("%") NPRIs _T(" %") NPRIs,line.gettoken_str(0),line.gettoken_str(a)); + if (line.gettoken_str(a+1)[0]) SCRIPT_MSG(_T(" ->(%") NPRIs _T(")"),line.gettoken_str(a+1)); SCRIPT_MSG(_T("\n")); return add_section(buf,line.gettoken_str(a+1),ex); } @@ -3805,7 +3781,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ERROR_MSG(_T("Function: function name cannot begin with : or /.\n")); PRINTHELP() } - SCRIPT_MSG(_T("Function: \"%s\"\n"),line.gettoken_str(1)); + SCRIPT_MSG(_T("Function: \"%") NPRIs _T("\"\n"),line.gettoken_str(1)); #ifndef NSIS_CONFIG_UNINSTALL_SUPPORT if (!_tcsnicmp(line.gettoken_str(1),_T("un."),3)) { @@ -3825,13 +3801,13 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) case TOK_ALLOWSKIPFILES: build_allowskipfiles=line.gettoken_enum(1,_T("off\0on\0")); if (build_allowskipfiles==-1) PRINTHELP() - SCRIPT_MSG(_T("AllowSkipFiles: %s\n"),line.gettoken_str(1)); + SCRIPT_MSG(_T("AllowSkipFiles: %") NPRIs _T("\n"),line.gettoken_str(1)); return PS_OK; // END - Added by ramon 23 May 2003 case TOK_SETDATESAVE: build_datesave=line.gettoken_enum(1,_T("off\0on\0")); if (build_datesave==-1) PRINTHELP() - SCRIPT_MSG(_T("SetDateSave: %s\n"),line.gettoken_str(1)); + SCRIPT_MSG(_T("SetDateSave: %") NPRIs _T("\n"),line.gettoken_str(1)); return PS_OK; case TOK_SETOVERWRITE: { @@ -3848,14 +3824,14 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) build_last_overwrite=build_overwrite; build_overwrite=k; } - SCRIPT_MSG(_T("SetOverwrite: %s\n"),line.gettoken_str(1)); + SCRIPT_MSG(_T("SetOverwrite: %") NPRIs _T("\n"),line.gettoken_str(1)); } return PS_OK; #ifdef NSIS_CONFIG_PLUGIN_SUPPORT case TOK_SETPLUGINUNLOAD: build_plugin_unload=line.gettoken_enum(1,_T("manual\0alwaysoff\0")); if (build_plugin_unload==-1) PRINTHELP() - SCRIPT_MSG(_T("SetPluginUnload: %s\n"),line.gettoken_str(1)); + SCRIPT_MSG(_T("SetPluginUnload: %") NPRIs _T("\n"),line.gettoken_str(1)); return PS_OK; #endif //NSIS_CONFIG_PLUGIN_SUPPORT case TOK_SETCOMPRESS: @@ -3865,12 +3841,12 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) { warning_fl(_T("'SetCompress off' encountered, and in whole compression mode. Effectively ignored.")); } - SCRIPT_MSG(_T("SetCompress: %s\n"),line.gettoken_str(1)); + SCRIPT_MSG(_T("SetCompress: %") NPRIs _T("\n"),line.gettoken_str(1)); return PS_OK; case TOK_DBOPTIMIZE: build_optimize_datablock=line.gettoken_enum(1,_T("off\0on\0")); if (build_optimize_datablock==-1) PRINTHELP() - SCRIPT_MSG(_T("SetDatablockOptimize: %s\n"),line.gettoken_str(1)); + SCRIPT_MSG(_T("SetDatablockOptimize: %") NPRIs _T("\n"),line.gettoken_str(1)); return PS_OK; case TOK_FILEBUFSIZE: build_filebuflen=line.gettoken_int(1); @@ -3880,7 +3856,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ERROR_MSG(_T("Error: FileBufSize: invalid buffer size -- %d\n"),build_filebuflen); return PS_ERROR; } - SCRIPT_MSG(_T("FileBufSize: %smb (%d bytes)\n"),line.gettoken_str(1),build_filebuflen); + SCRIPT_MSG(_T("FileBufSize: %") NPRIs _T("mb (%d bytes)\n"),line.gettoken_str(1),build_filebuflen); return PS_OK; #ifdef NSIS_CONFIG_COMPRESSION_SUPPORT case TOK_SETCOMPRESSIONLEVEL: @@ -3913,7 +3889,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) #else case TOK_SETCOMPRESSIONLEVEL: case TOK_SETCOMPRESSORDICTSIZE: - ERROR_MSG(_T("Error: %s specified, NSIS_CONFIG_COMPRESSION_SUPPORT not defined.\n"), line.gettoken_str(0)); + ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_CONFIG_COMPRESSION_SUPPORT not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif//NSIS_CONFIG_COMPRESSION_SUPPORT case TOK_ADDSIZE: @@ -3931,7 +3907,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) int w=line.gettoken_int(1,&s); if (!s || w < 0 || w > 4) PRINTHELP() SetInnerString(NLF_SUBCAPTION_LICENSE+w,line.gettoken_str(2)); - SCRIPT_MSG(_T("SubCaption: page:%d, text=%s\n"),w,line.gettoken_str(2)); + SCRIPT_MSG(_T("SubCaption: page:%d, text=%") NPRIs _T("\n"),w,line.gettoken_str(2)); } return PS_OK; case TOK_FILEERRORTEXT: @@ -3939,11 +3915,11 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) { SetInnerString(NLF_FILE_ERROR,line.gettoken_str(1)); SetInnerString(NLF_FILE_ERROR_NOIGNORE,line.gettoken_str(2)); - SCRIPT_MSG(_T("FileErrorText: \"%s\" \"%s\"\n"),line.gettoken_str(1),line.gettoken_str(2)); + SCRIPT_MSG(_T("FileErrorText: \"%") NPRIs _T("\" \"%") NPRIs _T("\"\n"),line.gettoken_str(1),line.gettoken_str(2)); } return PS_OK; #else - ERROR_MSG(_T("Error: %s specified, NSIS_SUPPORT_FILE not defined.\n"), line.gettoken_str(0)); + ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_FILE not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif case TOK_BRANDINGTEXT: @@ -3969,14 +3945,14 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) BYTE* dlg = res_editor->GetResource(RT_DIALOG, IDD_INST, NSIS_DEFAULT_LANG); CDialogTemplate td(dlg,build_unicode,uDefCodePage); - free(dlg); + res_editor->FreeResource(dlg); if (trim) { TCHAR str[512]; if (line.getnumtokens()==a+1 && line.gettoken_str(a)[0]) _tcscpy(str, line.gettoken_str(a)); else - wsprintf(str, _T("Nullsoft Install System %s"), NSIS_VERSION); + wsprintf(str, _T("Nullsoft Install System %") NPRIs, NSIS_VERSION); short old_width = td.GetItem(IDC_VERSTR)->sWidth; @@ -3988,7 +3964,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) if (td.GetItem(IDC_VERSTR)->sWidth > old_width) { - warning_fl(_T("BrandingText: \"%s\" is too long, trimming has expanded the label"), str); + warning_fl(_T("BrandingText: \"%") NPRIs _T("\" is too long, trimming has expanded the label"), str); } } @@ -3998,7 +3974,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) res_editor->FreeResource(dlg); } catch (exception& err) { - ERROR_MSG(_T("Error while triming branding text control: %s\n"), CtoTStrParam(err.what())); + ERROR_MSG(_T("Error while triming branding text control: %") NPRIs _T("\n"), CtoTStrParam(err.what())); return PS_ERROR; } #else @@ -4008,7 +3984,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) return PS_ERROR; } #endif - SCRIPT_MSG(_T("BrandingText: \"%s\"\n"),line.gettoken_str(a)); + SCRIPT_MSG(_T("BrandingText: \"%") NPRIs _T("\"\n"),line.gettoken_str(a)); } return PS_OK; case TOK_MISCBUTTONTEXT: @@ -4017,7 +3993,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) SetInnerString(NLF_BTN_NEXT,line.gettoken_str(2)); SetInnerString(NLF_BTN_CANCEL,line.gettoken_str(3)); SetInnerString(NLF_BTN_CLOSE,line.gettoken_str(4)); - SCRIPT_MSG(_T("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)); + SCRIPT_MSG(_T("MiscButtonText: back=\"%") NPRIs _T("\" next=\"%") NPRIs _T("\" cancel=\"%") NPRIs _T("\" close=\"%") NPRIs _T("\"\n"),line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3),line.gettoken_str(4)); } return PS_OK; case TOK_SPACETEXTS: @@ -4030,21 +4006,21 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) no_space_texts=false; SetInnerString(NLF_SPACE_REQ,line.gettoken_str(1)); SetInnerString(NLF_SPACE_AVAIL,line.gettoken_str(2)); - SCRIPT_MSG(_T("SpaceTexts: required=\"%s\" available=\"%s\"\n"),line.gettoken_str(1),line.gettoken_str(2)); + SCRIPT_MSG(_T("SpaceTexts: required=\"%") NPRIs _T("\" available=\"%") NPRIs _T("\"\n"),line.gettoken_str(1),line.gettoken_str(2)); } } return PS_OK; case TOK_INSTBUTTONTEXT: { SetInnerString(NLF_BTN_INSTALL,line.gettoken_str(1)); - SCRIPT_MSG(_T("InstallButtonText: \"%s\"\n"),line.gettoken_str(1)); + SCRIPT_MSG(_T("InstallButtonText: \"%") NPRIs _T("\"\n"),line.gettoken_str(1)); } return PS_OK; case TOK_DETAILSBUTTONTEXT: { if (!cur_page) { if (SetInnerString(NLF_BTN_DETAILS,line.gettoken_str(1)) == PS_WARNING) - warning_fl(_T("%s: specified multiple times, wasting space"),line.gettoken_str(0)); + warning_fl(_T("%") NPRIs _T(": specified multiple times, wasting space"),line.gettoken_str(0)); } else { if (cur_page_type != PAGE_INSTFILES) { @@ -4053,14 +4029,14 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) } cur_page->parms[1] = add_string(line.gettoken_str(1)); } - SCRIPT_MSG(_T("DetailsButtonText: \"%s\"\n"),line.gettoken_str(1)); + SCRIPT_MSG(_T("DetailsButtonText: \"%") NPRIs _T("\"\n"),line.gettoken_str(1)); } return PS_OK; case TOK_COMPLETEDTEXT: { if (!cur_page) { if (SetInnerString(NLF_COMPLETED,line.gettoken_str(1)) == PS_WARNING) - warning_fl(_T("%s: specified multiple times, wasting space"),line.gettoken_str(0)); + warning_fl(_T("%") NPRIs _T(": specified multiple times, wasting space"),line.gettoken_str(0)); } else { if (cur_page_type != PAGE_INSTFILES) { @@ -4069,18 +4045,18 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) } cur_page->parms[2] = add_string(line.gettoken_str(1)); } - SCRIPT_MSG(_T("CompletedText: \"%s\"\n"),line.gettoken_str(1)); + SCRIPT_MSG(_T("CompletedText: \"%") NPRIs _T("\"\n"),line.gettoken_str(1)); } return PS_OK; case TOK_UNINSTBUTTONTEXT: #ifdef NSIS_CONFIG_UNINSTALL_SUPPORT { SetInnerString(NLF_BTN_UNINSTALL,line.gettoken_str(1)); - SCRIPT_MSG(_T("UninstButtonText: \"%s\"\n"),line.gettoken_str(1)); + SCRIPT_MSG(_T("UninstButtonText: \"%") NPRIs _T("\"\n"),line.gettoken_str(1)); } return PS_OK; #else - ERROR_MSG(_T("Error: %s specified, NSIS_CONFIG_UNINSTALL_SUPPORT not defined.\n"), line.gettoken_str(0)); + ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_CONFIG_UNINSTALL_SUPPORT not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif @@ -4093,7 +4069,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) case TOK_GOTO: ent.which=EW_NOP; if (process_jump(line,1,&ent.offsets[0])) PRINTHELP() - SCRIPT_MSG(_T("Goto: %s\n"),line.gettoken_str(1)); + SCRIPT_MSG(_T("Goto: %") NPRIs _T("\n"),line.gettoken_str(1)); return add_entry(&ent); case TOK_SETREGVIEW: { @@ -4108,7 +4084,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ent.offsets[1]=add_intstring(KEY_WOW64_64KEY); else if (k == 2) // last used ent.offsets[2]=1; - SCRIPT_MSG(_T("SetRegView: %s\n"),line.gettoken_str(1)); + SCRIPT_MSG(_T("SetRegView: %") NPRIs _T("\n"),line.gettoken_str(1)); } return add_entry(&ent); case TOK_SETSHELLVARCONTEXT: @@ -4118,7 +4094,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) int k=line.gettoken_enum(1,_T("current\0all\0")); if (k<0) PRINTHELP() ent.offsets[1]=add_intstring(k); - SCRIPT_MSG(_T("SetShellVarContext: %s\n"),line.gettoken_str(1)); + SCRIPT_MSG(_T("SetShellVarContext: %") NPRIs _T("\n"),line.gettoken_str(1)); } return add_entry(&ent); case TOK_RET: @@ -4158,16 +4134,14 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) else ent.offsets[0]=ns_func.add(line.gettoken_str(1),0); } } - SCRIPT_MSG(_T("Call \"%s\"\n"),line.gettoken_str(1)); + SCRIPT_MSG(_T("Call \"%") NPRIs _T("\"\n"),line.gettoken_str(1)); return add_entry(&ent); case TOK_SETOUTPATH: { const TCHAR *op=line.gettoken_str(1); - if (!_tcscmp(op,_T("-"))) - { - op=_T("$INSTDIR"); - } - SCRIPT_MSG(_T("SetOutPath: \"%s\"\n"),op); + if (!_tcscmp(op,_T("-"))) op=_T("$INSTDIR"); + + SCRIPT_MSG(_T("SetOutPath: \"%") NPRIs _T("\"\n"),op); ent.which=EW_CREATEDIR; ent.offsets[0]=add_string(op); ent.offsets[1]=1; @@ -4188,7 +4162,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) *CharPrev(out_path,out_path+_tcslen(out_path))=0; // remove trailing slash } if (!*out_path) PRINTHELP() - SCRIPT_MSG(_T("CreateDirectory: \"%s\"\n"),out_path); + SCRIPT_MSG(_T("CreateDirectory: \"%") NPRIs _T("\"\n"),out_path); ent.which=EW_CREATEDIR; ent.offsets[0]=add_string(out_path); @@ -4207,12 +4181,12 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ent.offsets[1]=GetUserVarIndex(line, 2); if (line.gettoken_str(2)[0] && ent.offsets[1]<0) PRINTHELP() } - SCRIPT_MSG(_T("%s: \"%s\" (->%s)\n"),ent.offsets[2]?_T("ExecWait"):_T("Exec"),line.gettoken_str(1),line.gettoken_str(2)); + SCRIPT_MSG(_T("%") NPRIs _T(": \"%") NPRIs _T("\" (->%") NPRIs _T(")\n"),ent.offsets[2]?_T("ExecWait"):_T("Exec"),line.gettoken_str(1),line.gettoken_str(2)); DefineInnerLangString(NLF_EXEC); return add_entry(&ent); #else//!NSIS_SUPPORT_EXECUTE - ERROR_MSG(_T("Error: %s specified, NSIS_SUPPORT_EXECUTE not defined.\n"), line.gettoken_str(0)); + ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_EXECUTE not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif//!NSIS_SUPPORT_EXECUTE case TOK_EXECSHELL: // this uses improvements of Andras Varga @@ -4232,21 +4206,21 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) } tstring detail=tstring(line.gettoken_str(1))+_T(" ")+tstring(line.gettoken_str(2)); ent.offsets[5]=add_string(detail.c_str()); - SCRIPT_MSG(_T("ExecShell: %s: \"%s\" \"%s\" %s\n"),line.gettoken_str(1),line.gettoken_str(2), + SCRIPT_MSG(_T("ExecShell: %") NPRIs _T(": \"%") NPRIs _T("\" \"%") NPRIs _T("\" %") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(2), line.gettoken_str(3),line.gettoken_str(4)); DefineInnerLangString(NLF_EXEC_SHELL); } return add_entry(&ent); #else//!NSIS_SUPPORT_SHELLEXECUTE - ERROR_MSG(_T("Error: %s specified, NSIS_SUPPORT_SHELLEXECUTE not defined.\n"), line.gettoken_str(0)); + ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_SHELLEXECUTE not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif//!NSIS_SUPPORT_SHELLEXECUTE case TOK_CALLINSTDLL: case TOK_REGDLL: case TOK_UNREGDLL: #ifndef NSIS_SUPPORT_ACTIVEXREG - ERROR_MSG(_T("%s: support not compiled in (NSIS_SUPPORT_ACTIVEXREG)\n"),line.gettoken_str(0)); + ERROR_MSG(_T("%") NPRIs _T(": support not compiled in (NSIS_SUPPORT_ACTIVEXREG)\n"),line.gettoken_str(0)); return PS_ERROR; #else//NSIS_SUPPORT_ACTIVEXREG ent.which=EW_REGISTERDLL; @@ -4275,7 +4249,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ent.offsets[2]=DefineInnerLangString(NLF_REGISTERING); } - SCRIPT_MSG(_T("%s: \"%s\" %s\n"),line.gettoken_str(0),line.gettoken_str(1), line.gettoken_str(ent.offsets[3]?3:2)); + SCRIPT_MSG(_T("%") NPRIs _T(": \"%") NPRIs _T("\" %") NPRIs _T("\n"),line.gettoken_str(0),line.gettoken_str(1), line.gettoken_str(ent.offsets[3]?3:2)); DefineInnerLangString(NLF_SYMBOL_NOT_FOUND); DefineInnerLangString(NLF_COULD_NOT_LOAD); @@ -4306,7 +4280,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ent.offsets[1]=add_string(line.gettoken_str(a+1)); tstring print = tstring(line.gettoken_str(a)) + _T("->") + tstring(line.gettoken_str(a+1)); ent.offsets[3]=add_string(print.c_str()); - SCRIPT_MSG(_T("Rename: %s%s->%s\n"),ent.offsets[2]?_T("/REBOOTOK "):_T(""),line.gettoken_str(a),line.gettoken_str(a+1)); + SCRIPT_MSG(_T("Rename: %") NPRIs _T("%") NPRIs _T("->%") NPRIs _T("\n"),ent.offsets[2]?_T("/REBOOTOK "):_T(""),line.gettoken_str(a),line.gettoken_str(a+1)); DefineInnerLangString(NLF_RENAME); #ifdef NSIS_SUPPORT_MOVEONREBOOT @@ -4315,7 +4289,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) } return add_entry(&ent); #else//!NSIS_SUPPORT_RENAME - ERROR_MSG(_T("Error: %s specified, NSIS_SUPPORT_RENAME not defined.\n"), line.gettoken_str(0)); + ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_RENAME not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif//!NSIS_SUPPORT_RENAME case TOK_MESSAGEBOX: @@ -4406,13 +4380,13 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) } } } - SCRIPT_MSG(_T("MessageBox: %d: \"%s\""),r,line.gettoken_str(2)); - if (line.getnumtokens()>a+1) SCRIPT_MSG(_T(" (on %s goto %s)"),line.gettoken_str(a),line.gettoken_str(a+1)); + SCRIPT_MSG(_T("MessageBox: %d: \"%") NPRIs _T("\""),r,line.gettoken_str(2)); + if (line.getnumtokens()>a+1) SCRIPT_MSG(_T(" (on %") NPRIs _T(" goto %") NPRIs _T(")"),line.gettoken_str(a),line.gettoken_str(a+1)); SCRIPT_MSG(_T("\n")); } return add_entry(&ent); #else//!NSIS_SUPPORT_MESSAGEBOX - ERROR_MSG(_T("Error: %s specified, NSIS_SUPPORT_MESSAGEBOX not defined.\n"), line.gettoken_str(0)); + ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_MESSAGEBOX not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif//!NSIS_SUPPORT_MESSAGEBOX case TOK_CREATESHORTCUT: @@ -4440,7 +4414,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) int a=line.gettoken_enum(6,_T("SW_SHOWNORMAL\0SW_SHOWMAXIMIZED\0SW_SHOWMINIMIZED\0")); if (a < 0) { - ERROR_MSG(_T("CreateShortCut: unknown show mode \"%s\"\n"),line.gettoken_str(6)); + ERROR_MSG(_T("CreateShortCut: unknown show mode \"%") NPRIs _T("\"\n"),line.gettoken_str(6)); PRINTHELP() } ent.offsets[4]|=tab[a]<<8; @@ -4470,7 +4444,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) c=VK_F1-1+_ttoi(s+1); if (_ttoi(s+1) < 1 || _ttoi(s+1) > 24) { - warning_fl(_T("CreateShortCut: F-key \"%s\" out of range"),s); + warning_fl(_T("CreateShortCut: F-key \"%") NPRIs _T("\" out of range"),s); } } else if (((s[0] >= _T('A') && s[0] <= _T('Z')) || (s[0] >= _T('0') && s[0] <= _T('9'))) && !s[1]) @@ -4478,12 +4452,12 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) else { c=s[0]; - warning_fl(_T("CreateShortCut: unrecognized hotkey \"%s\""),s); + warning_fl(_T("CreateShortCut: unrecognized hotkey \"%") NPRIs _T("\""),s); } ent.offsets[4] |= (c) << 16; } } - SCRIPT_MSG(_T("CreateShortCut: \"%s\"->\"%s\" %s icon:%s,%d, showmode=0x%X, hotkey=0x%X, comment=%s\n"), + SCRIPT_MSG(_T("CreateShortCut: \"%") NPRIs _T("\"->\"%") NPRIs _T("\" %") NPRIs _T(" icon:%") NPRIs _T(",%d, showmode=0x%X, hotkey=0x%X, comment=%") NPRIs _T("\n"), line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3), line.gettoken_str(4),ent.offsets[4]&0xff,(ent.offsets[4]>>8)&0xff,ent.offsets[4]>>16,line.gettoken_str(8)); @@ -4491,7 +4465,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) DefineInnerLangString(NLF_ERR_CREATING_SHORTCUT); return add_entry(&ent); #else//!NSIS_SUPPORT_CREATESHORTCUT - ERROR_MSG(_T("Error: %s specified, NSIS_SUPPORT_CREATESHORTCUT not defined.\n"), line.gettoken_str(0)); + ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_CREATESHORTCUT not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif//NSIS_SUPPORT_CREATESHORTCUT #ifdef NSIS_SUPPORT_HWNDS @@ -4503,7 +4477,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ent.offsets[2]=add_string(line.gettoken_str(3)); ent.offsets[3]=add_string(line.gettoken_str(4)); ent.offsets[4]=add_string(line.gettoken_str(5)); - SCRIPT_MSG(_T("FindWindow: output=%s, class=\"%s\", text=\"%s\" hwndparent=\"%s\" hwndafter=\"%s\"\n"), + SCRIPT_MSG(_T("FindWindow: output=%") NPRIs _T(", class=\"%") NPRIs _T("\", text=\"%") NPRIs _T("\" hwndparent=\"%") NPRIs _T("\" hwndafter=\"%") NPRIs _T("\"\n"), line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3),line.gettoken_str(4),line.gettoken_str(5)); return add_entry(&ent); case TOK_SENDMESSAGE: @@ -4521,7 +4495,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ent.offsets[0]=GetUserVarIndex(line, 5); if (ent.offsets[0]>=0) { - SCRIPT_MSG(_T("(->%s)"),line.gettoken_str(5)); + SCRIPT_MSG(_T("(->%") NPRIs _T(")"),line.gettoken_str(5)); a++; } @@ -4554,14 +4528,14 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ent.offsets[1]=add_string(line.gettoken_str(1)); ent.offsets[2]=add_string(line.gettoken_str(2)); - SCRIPT_MSG(_T("(%s,%s,%s,%s)\n"),line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3),line.gettoken_str(4)); + SCRIPT_MSG(_T("(%") NPRIs _T(",%") NPRIs _T(",%") NPRIs _T(",%") NPRIs _T(")\n"),line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3),line.gettoken_str(4)); return add_entry(&ent); case TOK_ISWINDOW: ent.which=EW_ISWINDOW; ent.offsets[0]=add_string(line.gettoken_str(1)); if (process_jump(line,2,&ent.offsets[1])|| process_jump(line,3,&ent.offsets[2])) PRINTHELP() - SCRIPT_MSG(_T("IsWindow(%s): %s:%s\n"),line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3)); + SCRIPT_MSG(_T("IsWindow(%") NPRIs _T("): %") NPRIs _T(":%") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3)); return add_entry(&ent); #ifdef NSIS_CONFIG_ENHANCEDUI_SUPPORT case TOK_GETDLGITEM: @@ -4570,7 +4544,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) if (ent.offsets[0]<0) PRINTHELP(); ent.offsets[1]=add_string(line.gettoken_str(2)); ent.offsets[2]=add_string(line.gettoken_str(3)); - SCRIPT_MSG(_T("GetDlgItem: output=%s dialog=%s item=%s\n"),line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3)); + SCRIPT_MSG(_T("GetDlgItem: output=%") NPRIs _T(" dialog=%") NPRIs _T(" item=%") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3)); return add_entry(&ent); case TOK_SETCTLCOLORS: { @@ -4647,7 +4621,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ent.offsets[1]=cur_ctlcolors->add(&c,sizeof(ctlcolors)); } - SCRIPT_MSG(_T("SetCtlColors: hwnd=%s %stext=%s background=%s\n"),line.gettoken_str(1),a==2?_T(""):_T("/BRANDING "),line.gettoken_str(a),line.gettoken_str(a+1)); + SCRIPT_MSG(_T("SetCtlColors: hwnd=%") NPRIs _T(" %") NPRIs _T("text=%") NPRIs _T(" background=%") NPRIs _T("\n"),line.gettoken_str(1),a==2?_T(""):_T("/BRANDING "),line.gettoken_str(a),line.gettoken_str(a+1)); } return add_entry(&ent); case TOK_CREATEFONT: @@ -4655,7 +4629,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ent.offsets[0]=GetUserVarIndex(line, 1); if (ent.offsets[0] < 0) PRINTHELP() ent.offsets[1]=add_string(line.gettoken_str(2)); - SCRIPT_MSG(_T("CreateFont: output=%s \"%s\""),line.gettoken_str(1),line.gettoken_str(2)); + SCRIPT_MSG(_T("CreateFont: output=%") NPRIs _T(" \"%") NPRIs _T("\""),line.gettoken_str(1),line.gettoken_str(2)); { int height=0; int weight=0; @@ -4682,11 +4656,11 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) } else { if (!height) { - SCRIPT_MSG(_T(" height=%s"),tok); + SCRIPT_MSG(_T(" height=%") NPRIs,tok); height=add_string(tok); } else if (!weight) { - SCRIPT_MSG(_T(" weight=%s"),tok); + SCRIPT_MSG(_T(" weight=%") NPRIs,tok); weight=add_string(tok); } else { @@ -4706,13 +4680,13 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ent.offsets[0]=add_string(line.gettoken_str(1)); ent.offsets[1]=add_string(line.gettoken_str(2)); ent.offsets[3]=1; - SCRIPT_MSG(_T("EnableWindow: handle=%s enable=%s\n"),line.gettoken_str(1),line.gettoken_str(2)); + SCRIPT_MSG(_T("EnableWindow: handle=%") NPRIs _T(" enable=%") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(2)); return add_entry(&ent); case TOK_SHOWWINDOW: ent.which=EW_SHOWWINDOW; ent.offsets[0]=add_string(line.gettoken_str(1)); ent.offsets[1]=add_string(line.gettoken_str(2)); - SCRIPT_MSG(_T("ShowWindow: handle=%s show state=%s\n"),line.gettoken_str(1),line.gettoken_str(2)); + SCRIPT_MSG(_T("ShowWindow: handle=%") NPRIs _T(" show state=%") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(2)); return add_entry(&ent); case TOK_HIDEWINDOW: ent.which=EW_SHOWWINDOW; @@ -4743,7 +4717,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) case TOK_CREATEFONT: case TOK_HIDEWINDOW: case TOK_ENABLEWINDOW: - ERROR_MSG(_T("Error: %s specified, NSIS_CONFIG_ENHANCEDUI_SUPPORT not defined.\n"), line.gettoken_str(0)); + ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_CONFIG_ENHANCEDUI_SUPPORT not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif//NSIS_CONFIG_ENHANCEDUI_SUPPORT #else//!NSIS_SUPPORT_HWNDS @@ -4757,7 +4731,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) case TOK_CREATEFONT: case TOK_HIDEWINDOW: case TOK_BRINGTOFRONT: - ERROR_MSG(_T("Error: %s specified, NSIS_SUPPORT_HWNDS not defined.\n"), line.gettoken_str(0)); + ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_HWNDS not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif//!NSIS_SUPPORT_HWNDS case TOK_DELETE: @@ -4780,7 +4754,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) } if (line.getnumtokens() != a+1) PRINTHELP() ent.offsets[0]=add_string(line.gettoken_str(a)); - SCRIPT_MSG(_T("Delete: %s\"%s\"\n"),ent.offsets[1]?_T("/REBOOTOK "):_T(""),line.gettoken_str(a)); + SCRIPT_MSG(_T("Delete: %") NPRIs _T("\"%") NPRIs _T("\"\n"),ent.offsets[1]?_T("/REBOOTOK "):_T(""),line.gettoken_str(a)); DefineInnerLangString(NLF_DEL_FILE); #ifdef NSIS_SUPPORT_MOVEONREBOOT @@ -4789,7 +4763,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) } return add_entry(&ent); #else//!NSIS_SUPPORT_DELETE - ERROR_MSG(_T("Error: %s specified, NSIS_SUPPORT_DELETE not defined.\n"), line.gettoken_str(0)); + ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_DELETE not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif//!NSIS_SUPPORT_DELETE case TOK_RMDIR: @@ -4818,10 +4792,10 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ent.offsets[0]=add_string(line.gettoken_str(a)); SCRIPT_MSG(_T("RMDir: ")); if (a>1) - SCRIPT_MSG(_T("%s "),line.gettoken_str(1)); + SCRIPT_MSG(_T("%") NPRIs _T(" "),line.gettoken_str(1)); if (a>2) - SCRIPT_MSG(_T("%s "),line.gettoken_str(2)); - SCRIPT_MSG(_T("\"%s\"\n"),line.gettoken_str(a)); + SCRIPT_MSG(_T("%") NPRIs _T(" "),line.gettoken_str(2)); + SCRIPT_MSG(_T("\"%") NPRIs _T("\"\n"),line.gettoken_str(a)); DefineInnerLangString(NLF_REMOVE_DIR); DefineInnerLangString(NLF_DEL_FILE); @@ -4831,7 +4805,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) } return add_entry(&ent); #else//!NSIS_SUPPORT_RMDIR - ERROR_MSG(_T("Error: %s specified, NSIS_SUPPORT_RMDIR not defined.\n"), line.gettoken_str(0)); + ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_RMDIR not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif//!NSIS_SUPPORT_RMDIR case TOK_RESERVEFILE: @@ -4842,19 +4816,17 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) int a=1,attrib=0; bool fatal=true,rec=false,reserveplugin=false; if (!_tcsicmp(line.gettoken_str(a),_T("/nonfatal"))) - { fatal=false, a++; - } + if (which_token == TOK_RESERVEFILE && !_tcsicmp(line.gettoken_str(a),_T("/plugin"))) - { reserveplugin=true, a++; - } + if (which_token == TOK_FILE && !_tcsicmp(line.gettoken_str(a),_T("/a"))) { #ifdef _WIN32 attrib=1; #else - warning_fl(_T("%sFile /a is disabled for non Win32 platforms."),(which_token == TOK_FILE)?_T(""):_T("Reserve")); + warning_fl(_T("%") NPRIs _T("File /a is disabled for non Win32 platforms."),(which_token == TOK_FILE)?_T(""):_T("Reserve")); #endif a++; } @@ -4870,7 +4842,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) if (on[0]==_T('"')) { - ERROR_MSG(_T("%sFile: output name must not begin with a quote, use \"/oname=name with spaces\".\n"),(which_token == TOK_FILE)?_T(""):_T("Reserve"),line.gettoken_str(a)); + ERROR_MSG(_T("%") NPRIs _T("File: output name must not begin with a quote, use \"/oname=name with spaces\".\n"),(which_token == TOK_FILE)?_T(""):_T("Reserve"),line.gettoken_str(a)); PRINTHELP(); } @@ -4884,12 +4856,12 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) { if (fatal) { - ERROR_MSG(_T("%sFile: \"%s\" -> no files found.\n"),(which_token == TOK_FILE)?_T(""):_T("Reserve"),line.gettoken_str(a)); + ERROR_MSG(_T("%") NPRIs _T("File: \"%") NPRIs _T("\" -> no files found.\n"),(which_token == TOK_FILE)?_T(""):_T("Reserve"),line.gettoken_str(a)); PRINTHELP() } else { - warning_fl(_T("%sFile: \"%s\" -> no files found"),(which_token == TOK_FILE)?_T(""):_T("Reserve"),line.gettoken_str(a)); + warning_fl(_T("%") NPRIs _T("File: \"%") NPRIs _T("\" -> no files found"),(which_token == TOK_FILE)?_T(""):_T("Reserve"),line.gettoken_str(a)); // workaround for bug #1299100 // add a nop opcode so relative jumps will work as expected @@ -4946,19 +4918,19 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) { if (fatal) { - ERROR_MSG(_T("%sFile: \"%s\" -> no files found.\n"),(which_token == TOK_FILE)?_T(""):_T("Reserve"),t); + ERROR_MSG(_T("%") NPRIs _T("File: \"%") NPRIs _T("\" -> no files found.\n"),(which_token == TOK_FILE)?_T(""):_T("Reserve"),t); PRINTHELP(); } else { - warning_fl(_T("%sFile: \"%s\" -> no files found."),(which_token == TOK_FILE)?_T(""):_T("Reserve"),t); + warning_fl(_T("%") NPRIs _T("File: \"%") NPRIs _T("\" -> no files found."),(which_token == TOK_FILE)?_T(""):_T("Reserve"),t); } } } } return PS_OK; #else//!NSIS_SUPPORT_FILE - ERROR_MSG(_T("Error: %s specified, NSIS_SUPPORT_FILE not defined.\n"), line.gettoken_str(0)); + ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_FILE not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif//!NSIS_SUPPORT_FILE #ifdef NSIS_SUPPORT_COPYFILES @@ -4994,7 +4966,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) int size_kb=line.gettoken_int(a+2,&s); if (!s && line.gettoken_str(a+2)[0]) PRINTHELP() section_add_size_kb(size_kb); - SCRIPT_MSG(_T("CopyFiles: %s\"%s\" -> \"%s\", size=%iKB\n"),ent.offsets[2]&FOF_SILENT?_T("(silent) "):_T(""), line.gettoken_str(a),line.gettoken_str(a+1),size_kb); + SCRIPT_MSG(_T("CopyFiles: %") NPRIs _T("\"%") NPRIs _T("\" -> \"%") NPRIs _T("\", size=%iKB\n"),ent.offsets[2]&FOF_SILENT?_T("(silent) "):_T(""), line.gettoken_str(a),line.gettoken_str(a+1),size_kb); DefineInnerLangString(NLF_COPY_FAILED); DefineInnerLangString(NLF_COPY_TO); @@ -5002,7 +4974,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) return add_entry(&ent); #else//!NSIS_SUPPORT_COPYFILES case TOK_COPYFILES: - ERROR_MSG(_T("Error: %s specified, NSIS_SUPPORT_COPYFILES not defined.\n"), line.gettoken_str(0)); + ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_COPYFILES not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif//!NSIS_SUPPORT_COPYFILES @@ -5059,7 +5031,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) { ent.which=EW_SLEEP; ent.offsets[0]=add_string(line.gettoken_str(1)); - SCRIPT_MSG(_T("Sleep: %s ms\n"),line.gettoken_str(1)); + SCRIPT_MSG(_T("Sleep: %") NPRIs _T(" ms\n"),line.gettoken_str(1)); } return add_entry(&ent); case TOK_IFFILEEXISTS: @@ -5067,7 +5039,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ent.offsets[0] = add_string(line.gettoken_str(1)); if (process_jump(line,2,&ent.offsets[1]) || process_jump(line,3,&ent.offsets[2])) PRINTHELP() - SCRIPT_MSG(_T("IfFileExists: \"%s\" ? %s : %s\n"),line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3)); + SCRIPT_MSG(_T("IfFileExists: \"%") NPRIs _T("\" ? %") NPRIs _T(" : %") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3)); return add_entry(&ent); case TOK_QUIT: ent.which=EW_QUIT; @@ -5076,7 +5048,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) case TOK_ABORT: ent.which=EW_ABORT; ent.offsets[0] = add_string(line.gettoken_str(1)); - SCRIPT_MSG(_T("Abort: \"%s\"\n"),line.gettoken_str(1)); + SCRIPT_MSG(_T("Abort: \"%") NPRIs _T("\"\n"),line.gettoken_str(1)); return add_entry(&ent); case TOK_SETDETAILSVIEW: { @@ -5085,7 +5057,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) if (v < 0) PRINTHELP() ent.offsets[0] = v?SW_SHOWNA:SW_HIDE; ent.offsets[1] = v?SW_HIDE:SW_SHOWNA; - SCRIPT_MSG(_T("SetDetailsView: %s\n"),line.gettoken_str(1)); + SCRIPT_MSG(_T("SetDetailsView: %") NPRIs _T("\n"),line.gettoken_str(1)); } return add_entry(&ent); case TOK_SETDETAILSPRINT: @@ -5106,7 +5078,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) // none 6 ent.offsets[1]=add_intstring(k*2); } - SCRIPT_MSG(_T("SetDetailsPrint: %s\n"),line.gettoken_str(1)); + SCRIPT_MSG(_T("SetDetailsPrint: %") NPRIs _T("\n"),line.gettoken_str(1)); } return add_entry(&ent); case TOK_SETAUTOCLOSE: @@ -5116,7 +5088,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) int k=line.gettoken_enum(1,_T("false\0true\0")); if (k < 0) PRINTHELP() ent.offsets[1]=add_intstring(k); - SCRIPT_MSG(_T("SetAutoClose: %s\n"),line.gettoken_str(1)); + SCRIPT_MSG(_T("SetAutoClose: %") NPRIs _T("\n"),line.gettoken_str(1)); } return add_entry(&ent); case TOK_IFERRORS: @@ -5125,7 +5097,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) process_jump(line,2,&ent.offsets[1])) PRINTHELP() ent.offsets[2]=FLAG_OFFSET(exec_error); ent.offsets[3]=0;//new value mask - clean error - SCRIPT_MSG(_T("IfErrors ?%s:%s\n"),line.gettoken_str(1),line.gettoken_str(2)); + SCRIPT_MSG(_T("IfErrors ?%") NPRIs _T(":%") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(2)); return add_entry(&ent); case TOK_IFABORT: ent.which=EW_IFFLAG; @@ -5133,7 +5105,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) process_jump(line,2,&ent.offsets[1])) PRINTHELP() ent.offsets[2]=FLAG_OFFSET(abort); ent.offsets[3]=~0;//new value mask - keep flag - SCRIPT_MSG(_T("IfAbort ?%s:%s\n"),line.gettoken_str(1),line.gettoken_str(2)); + SCRIPT_MSG(_T("IfAbort ?%") NPRIs _T(":%") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(2)); return add_entry(&ent); case TOK_CLEARERRORS: ent.which=EW_SETFLAG; @@ -5151,14 +5123,14 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ent.which=EW_SETFLAG; ent.offsets[0]=FLAG_OFFSET(errlvl); ent.offsets[1]=add_string(line.gettoken_str(1)); - SCRIPT_MSG(_T("SetErrorLevel: %s\n"),line.gettoken_str(1)); + SCRIPT_MSG(_T("SetErrorLevel: %") NPRIs _T("\n"),line.gettoken_str(1)); return add_entry(&ent); case TOK_GETERRORLEVEL: ent.which=EW_GETFLAG; ent.offsets[0]=GetUserVarIndex(line, 1); ent.offsets[1]=FLAG_OFFSET(errlvl); if (line.gettoken_str(1)[0] && ent.offsets[0]<0) PRINTHELP() - SCRIPT_MSG(_T("GetErrorLevel: %s\n"),line.gettoken_str(1)); + SCRIPT_MSG(_T("GetErrorLevel: %") NPRIs _T("\n"),line.gettoken_str(1)); return add_entry(&ent); #ifdef NSIS_SUPPORT_STROPTS case TOK_STRLEN: @@ -5166,7 +5138,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ent.offsets[0]=GetUserVarIndex(line, 1); ent.offsets[1]=add_string(line.gettoken_str(2)); if (ent.offsets[0] < 0) PRINTHELP() - SCRIPT_MSG(_T("StrLen %s \"%s\"\n"),line.gettoken_str(1),line.gettoken_str(2)); + SCRIPT_MSG(_T("StrLen %") NPRIs _T(" \"%") NPRIs _T("\"\n"),line.gettoken_str(1),line.gettoken_str(2)); return add_entry(&ent); case TOK_STRCPY: case TOK_UNSAFESTRCPY: @@ -5191,7 +5163,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ent.offsets[2]=add_string(line.gettoken_str(3)); ent.offsets[3]=add_string(line.gettoken_str(4)); - SCRIPT_MSG(_T("%sStrCpy %s \"%s\" (%s) (%s)\n"), + SCRIPT_MSG(_T("%") NPRIs _T("StrCpy %") NPRIs _T(" \"%") NPRIs _T("\" (%") NPRIs _T(") (%") NPRIs _T(")\n"), msgprefix,line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3),line.gettoken_str(4)); return add_entry(&ent); } @@ -5202,7 +5174,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ent.offsets[2]=0; ent.offsets[3]=0; if (ent.offsets[0] < 0) PRINTHELP() - SCRIPT_MSG(_T("GetFunctionAddress: %s %s"),line.gettoken_str(1),line.gettoken_str(2)); + SCRIPT_MSG(_T("GetFunctionAddress: %") NPRIs _T(" %") NPRIs,line.gettoken_str(1),line.gettoken_str(2)); return add_entry(&ent); case TOK_GETLABELADDR: ent.which=EW_GETLABELADDR; @@ -5210,7 +5182,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) if (ent.offsets[0] < 0 || process_jump(line,2,&ent.offsets[1])) PRINTHELP() ent.offsets[2]=0; ent.offsets[3]=0; - SCRIPT_MSG(_T("GetLabelAddress: %s %s"),line.gettoken_str(1),line.gettoken_str(2)); + SCRIPT_MSG(_T("GetLabelAddress: %") NPRIs _T(" %") NPRIs,line.gettoken_str(1),line.gettoken_str(2)); return add_entry(&ent); case TOK_GETCURRENTADDR: ent.which=EW_ASSIGNVAR; @@ -5219,7 +5191,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) if (ent.offsets[0] < 0) PRINTHELP() ent.offsets[2]=0; ent.offsets[3]=0; - SCRIPT_MSG(_T("GetCurrentAddress: %s"),line.gettoken_str(1)); + SCRIPT_MSG(_T("GetCurrentAddress: %") NPRIs,line.gettoken_str(1)); return add_entry(&ent); case TOK_STRCMP: case TOK_STRCMPS: @@ -5229,7 +5201,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ent.offsets[4]=which_token == TOK_STRCMPS; if (process_jump(line,3,&ent.offsets[2]) || process_jump(line,4,&ent.offsets[3])) PRINTHELP() - SCRIPT_MSG(_T("%s \"%s\" \"%s\" equal=%s, nonequal=%s\n"),line.gettoken_str(0),line.gettoken_str(1),line.gettoken_str(2), line.gettoken_str(3),line.gettoken_str(4)); + SCRIPT_MSG(_T("%") NPRIs _T(" \"%") NPRIs _T("\" \"%") NPRIs _T("\" equal=%") NPRIs _T(", nonequal=%") NPRIs _T("\n"),line.gettoken_str(0),line.gettoken_str(1),line.gettoken_str(2), line.gettoken_str(3),line.gettoken_str(4)); return add_entry(&ent); case TOK_GETDLLVERSIONLOCAL: { @@ -5237,7 +5209,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) DWORD low, high; if (!GetDLLVersion(line.gettoken_str(1),high,low)) { - ERROR_MSG(_T("%s: error reading version info from \"%s\"\n"),cmdname,line.gettoken_str(1)); + ERROR_MSG(_T("%") NPRIs _T(": error reading version info from \"%") NPRIs _T("\"\n"),cmdname,line.gettoken_str(1)); return PS_ERROR; } ent.which=EW_ASSIGNVAR; @@ -5253,7 +5225,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ent.offsets[2]=0; ent.offsets[3]=0; if (ent.offsets[0]<0) PRINTHELP() - SCRIPT_MSG(_T("%s: %s (%u,%u)->(%s,%s)\n"), + SCRIPT_MSG(_T("%") NPRIs _T(": %") NPRIs _T(" (%u,%u)->(%") NPRIs _T(",%") NPRIs _T(")\n"), cmdname,line.gettoken_str(1),high,low,line.gettoken_str(2),line.gettoken_str(3)); } return add_entry(&ent); @@ -5268,31 +5240,23 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) { FILETIME ft; if (GetFileTime(hFile,NULL,NULL,&ft)) - { - high=ft.dwHighDateTime; - low=ft.dwLowDateTime; - flag=1; - } + flag=1, high=ft.dwHighDateTime, low=ft.dwLowDateTime; CloseHandle(hFile); } if (!flag) { - ERROR_MSG(_T("GetFileTimeLocal: error reading date from \"%s\"\n"),line.gettoken_str(1)); + ERROR_MSG(_T("GetFileTimeLocal: error reading date from \"%") NPRIs _T("\"\n"),line.gettoken_str(1)); return PS_ERROR; } #else struct stat st; - if (!stat(line.gettoken_str(1), &st)) + if (_tstat(line.gettoken_str(1), &st)) { - unsigned long long ll = (st.st_mtime * 10000000LL) + 116444736000000000LL; - high = (DWORD) (ll >> 32); - low = (DWORD) ll; - } - else - { - ERROR_MSG(_T("GetFileTimeLocal: error reading date from \"%s\"\n"),line.gettoken_str(1)); + ERROR_MSG(_T("GetFileTimeLocal: error reading date from \"%") NPRIs _T("\"\n"),line.gettoken_str(1)); return PS_ERROR; } + unsigned long long ll = (st.st_mtime * 10000000LL) + 116444736000000000LL; + high = (DWORD) (ll >> 32), low = (DWORD) ll; #endif ent.which=EW_ASSIGNVAR; @@ -5310,7 +5274,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ent.offsets[2]=0; ent.offsets[3]=0; if (ent.offsets[0]<0) PRINTHELP() - SCRIPT_MSG(_T("GetFileTimeLocal: %s (%u,%u)->(%s,%s)\n"), + SCRIPT_MSG(_T("GetFileTimeLocal: %") NPRIs _T(" (%u,%u)->(%") NPRIs _T(",%") NPRIs _T(")\n"), line.gettoken_str(1),high,low,line.gettoken_str(2),line.gettoken_str(3)); } return add_entry(&ent); @@ -5325,7 +5289,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) case TOK_STRCPY: case TOK_STRCMP: case TOK_STRCMPS: - ERROR_MSG(_T("Error: %s specified, NSIS_SUPPORT_STROPTS not defined.\n"), line.gettoken_str(0)); + ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_STROPTS not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif//!NSIS_SUPPORT_STROPTS #ifdef NSIS_SUPPORT_INIFILES @@ -5345,14 +5309,14 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) else ent.offsets[1]=0; ent.offsets[2]=0; ent.offsets[3]=add_string(line.gettoken_str(1)); - SCRIPT_MSG(_T("DeleteINI%s: [%s] %s%sin %s\n"),*vname?_T("Str"):_T("Sec"), + SCRIPT_MSG(_T("DeleteINI%") NPRIs _T(": [%") NPRIs _T("] %") NPRIs _T("%") NPRIs _T("in %") NPRIs _T("\n"),*vname?_T("Str"):_T("Sec"), line.gettoken_str(2),vname,space,line.gettoken_str(1)); } return add_entry(&ent); case TOK_FLUSHINI: ent.which=EW_WRITEINI; ent.offsets[3]=add_string(line.gettoken_str(1)); - SCRIPT_MSG(_T("FlushINI: %s\n"),line.gettoken_str(1)); + SCRIPT_MSG(_T("FlushINI: %") NPRIs _T("\n"),line.gettoken_str(1)); return add_entry(&ent); case TOK_WRITEINISTR: ent.which=EW_WRITEINI; @@ -5361,7 +5325,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ent.offsets[2]=add_string(line.gettoken_str(4)); ent.offsets[3]=add_string(line.gettoken_str(1)); ent.offsets[4]=1; // write - SCRIPT_MSG(_T("WriteINIStr: [%s] %s=%s in %s\n"), + SCRIPT_MSG(_T("WriteINIStr: [%") NPRIs _T("] %") NPRIs _T("=%") NPRIs _T(" in %") NPRIs _T("\n"), line.gettoken_str(2),line.gettoken_str(3),line.gettoken_str(4),line.gettoken_str(1)); return add_entry(&ent); case TOK_READINISTR: @@ -5371,7 +5335,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ent.offsets[1]=add_string(line.gettoken_str(3)); ent.offsets[2]=add_string(line.gettoken_str(4)); ent.offsets[3]=add_string(line.gettoken_str(2)); - SCRIPT_MSG(_T("ReadINIStr %s [%s]:%s from %s\n"),line.gettoken_str(1),line.gettoken_str(3),line.gettoken_str(4),line.gettoken_str(2)); + SCRIPT_MSG(_T("ReadINIStr %") NPRIs _T(" [%") NPRIs _T("]:%") NPRIs _T(" from %") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(3),line.gettoken_str(4),line.gettoken_str(2)); return add_entry(&ent); #else//!NSIS_SUPPORT_INIFILES case TOK_DELETEINISEC: @@ -5379,14 +5343,14 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) case TOK_FLUSHINI: case TOK_WRITEINISTR: case TOK_READINISTR: - ERROR_MSG(_T("Error: %s specified, NSIS_SUPPORT_INIFILES not defined.\n"), line.gettoken_str(0)); + ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_INIFILES not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif//!NSIS_SUPPORT_INIFILES case TOK_DETAILPRINT: ent.which=EW_UPDATETEXT; ent.offsets[0]=add_string(line.gettoken_str(1)); ent.offsets[1]=0; - SCRIPT_MSG(_T("DetailPrint: \"%s\"\n"),line.gettoken_str(1)); + SCRIPT_MSG(_T("DetailPrint: \"%") NPRIs _T("\"\n"),line.gettoken_str(1)); return add_entry(&ent); #ifdef NSIS_SUPPORT_FNUTIL case TOK_GETTEMPFILENAME: @@ -5397,7 +5361,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) else ent.offsets[1]=add_asciistring(_T("$TEMP")); if (ent.offsets[0]<0) PRINTHELP() - SCRIPT_MSG(_T("GetTempFileName -> %s\n"),line.gettoken_str(1)); + SCRIPT_MSG(_T("GetTempFileName -> %") NPRIs _T("\n"),line.gettoken_str(1)); return add_entry(&ent); case TOK_GETFULLPATHNAME: { @@ -5409,7 +5373,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ent.offsets[1]=GetUserVarIndex(line, 1+a); ent.offsets[2]=!a; if (ent.offsets[1]<0) PRINTHELP() - SCRIPT_MSG(_T("GetFullPathName: %s->%s (%d)\n"), + SCRIPT_MSG(_T("GetFullPathName: %") NPRIs _T("->%") NPRIs _T(" (%d)\n"), line.gettoken_str(2+a),line.gettoken_str(1+a),a?_T("sfn"):_T("lfn")); } return add_entry(&ent); @@ -5418,13 +5382,13 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ent.offsets[0]=GetUserVarIndex(line, 1); if (ent.offsets[0] < 0) PRINTHELP() ent.offsets[1]=add_string(line.gettoken_str(2)); - SCRIPT_MSG(_T("SearchPath %s %s\n"),line.gettoken_str(1),line.gettoken_str(2)); + SCRIPT_MSG(_T("SearchPath %") NPRIs _T(" %") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(2)); return add_entry(&ent); #else case TOK_SEARCHPATH: case TOK_GETTEMPFILENAME: case TOK_GETFULLPATHNAME: - ERROR_MSG(_T("Error: %s specified, NSIS_SUPPORT_FNUTIL not defined.\n"), line.gettoken_str(0)); + ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_FNUTIL not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif case TOK_GETDLLVERSION: @@ -5434,11 +5398,11 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ent.offsets[1]=GetUserVarIndex(line, 3); ent.offsets[2]=add_string(line.gettoken_str(1)); if (ent.offsets[0]<0 || ent.offsets[1]<0) PRINTHELP() - SCRIPT_MSG(_T("GetDLLVersion: %s->%s,%s\n"), + SCRIPT_MSG(_T("GetDLLVersion: %") NPRIs _T("->%") NPRIs _T(",%") NPRIs _T("\n"), line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3)); return add_entry(&ent); #else//!NSIS_SUPPORT_GETDLLVERSION - ERROR_MSG(_T("Error: %s specified, NSIS_SUPPORT_GETDLLVERSION not defined.\n"), line.gettoken_str(0)); + ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_GETDLLVERSION not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif//!NSIS_SUPPORT_GETDLLVERSION case TOK_GETFILETIME: @@ -5448,11 +5412,11 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ent.offsets[1]=GetUserVarIndex(line, 3); ent.offsets[2]=add_string(line.gettoken_str(1)); if (ent.offsets[0]<0 || ent.offsets[1]<0) PRINTHELP() - SCRIPT_MSG(_T("GetFileTime: %s->%s,%s\n"), + SCRIPT_MSG(_T("GetFileTime: %") NPRIs _T("->%") NPRIs _T(",%") NPRIs _T("\n"), line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3)); return add_entry(&ent); #else//!NSIS_SUPPORT_GETFILETIME - ERROR_MSG(_T("Error: %s specified, NSIS_SUPPORT_GETFILETIME not defined.\n"), line.gettoken_str(0)); + ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_GETFILETIME not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif//!NSIS_SUPPORT_GETFILETIME #ifdef NSIS_SUPPORT_INTOPTS @@ -5469,7 +5433,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ent.offsets[3]=6; ent.offsets[2]=add_asciistring(_T("0xFFFFFFFF")); } - SCRIPT_MSG(_T("IntOp: %s=%s%s%s\n"),line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3),line.gettoken_str(4)); + SCRIPT_MSG(_T("IntOp: %") NPRIs _T("=%") NPRIs _T("%") NPRIs _T("%") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3),line.gettoken_str(4)); return add_entry(&ent); case TOK_INTFMT: ent.which=EW_INTFMT; @@ -5477,7 +5441,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) if (ent.offsets[0]<0) PRINTHELP() ent.offsets[1]=add_string(line.gettoken_str(2)); ent.offsets[2]=add_string(line.gettoken_str(3)); - SCRIPT_MSG(_T("IntFmt: %s->%s (fmt:%s)\n"),line.gettoken_str(3),line.gettoken_str(1),line.gettoken_str(2)); + SCRIPT_MSG(_T("IntFmt: %") NPRIs _T("->%") NPRIs _T(" (fmt:%") NPRIs _T(")\n"),line.gettoken_str(3),line.gettoken_str(1),line.gettoken_str(2)); return add_entry(&ent); case TOK_INTCMP: case TOK_INTCMPU: @@ -5488,7 +5452,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) if (process_jump(line,3,&ent.offsets[2]) || process_jump(line,4,&ent.offsets[3]) || process_jump(line,5,&ent.offsets[4])) PRINTHELP() - SCRIPT_MSG(_T("%s %s:%s equal=%s, < %s, > %s\n"),line.gettoken_str(0), + SCRIPT_MSG(_T("%") NPRIs _T(" %") NPRIs _T(":%") NPRIs _T(" equal=%") NPRIs _T(", < %") NPRIs _T(", > %") NPRIs _T("\n"),line.gettoken_str(0), line.gettoken_str(1),line.gettoken_str(2), line.gettoken_str(3),line.gettoken_str(4),line.gettoken_str(5)); return add_entry(&ent); #else//!NSIS_SUPPORT_INTOPTS @@ -5496,7 +5460,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) case TOK_INTCMP: case TOK_INTFMT: case TOK_INTCMPU: - ERROR_MSG(_T("Error: %s specified, NSIS_SUPPORT_INTOPTS not defined.\n"), line.gettoken_str(0)); + ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_INTOPTS not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif//!NSIS_SUPPORT_INTOPTS #ifdef NSIS_SUPPORT_REGISTRYFUNCTIONS @@ -5514,9 +5478,9 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) if (which_token == TOK_READREGDWORD) ent.offsets[4]=1; else ent.offsets[4]=0; if (line.gettoken_str(3)[0] == _T('\\')) - warning_fl(_T("%s: registry path name begins with \'\\\', may cause problems"),line.gettoken_str(0)); + warning_fl(_T("%") NPRIs _T(": registry path name begins with \'\\\', may cause problems"),line.gettoken_str(0)); - SCRIPT_MSG(_T("%s %s %s\\%s\\%s\n"),line.gettoken_str(0), + SCRIPT_MSG(_T("%") NPRIs _T(" %") NPRIs _T(" %") NPRIs _T("\\%") NPRIs _T("\\%") NPRIs _T("\n"),line.gettoken_str(0), line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3),line.gettoken_str(4)); } return add_entry(&ent); @@ -5544,11 +5508,11 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ent.offsets[2]=add_string(line.gettoken_str(a+1)); ent.offsets[3]=(which_token==TOK_DELETEREGKEY)?0:add_string(line.gettoken_str(a+2)); if (line.gettoken_str(a+1)[0] == _T('\\')) - warning_fl(_T("%s: registry path name begins with \'\\\', may cause problems"),line.gettoken_str(0)); + warning_fl(_T("%") NPRIs _T(": registry path name begins with \'\\\', may cause problems"),line.gettoken_str(0)); if (which_token==TOK_DELETEREGKEY) - SCRIPT_MSG(_T("DeleteRegKey: %s\\%s\n"),line.gettoken_str(a),line.gettoken_str(a+1)); + SCRIPT_MSG(_T("DeleteRegKey: %") NPRIs _T("\\%") NPRIs _T("\n"),line.gettoken_str(a),line.gettoken_str(a+1)); else - SCRIPT_MSG(_T("DeleteRegValue: %s\\%s\\%s\n"),line.gettoken_str(a),line.gettoken_str(a+1),line.gettoken_str(a+2)); + SCRIPT_MSG(_T("DeleteRegValue: %") NPRIs _T("\\%") NPRIs _T("\\%") NPRIs _T("\n"),line.gettoken_str(a),line.gettoken_str(a+1),line.gettoken_str(a+2)); } return add_entry(&ent); case TOK_WRITEREGSTR: @@ -5563,11 +5527,11 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ent.offsets[0]=(INT_PTR)rootkey_tab[k]; ent.offsets[1]=add_string(line.gettoken_str(2)); if (line.gettoken_str(2)[0] == _T('\\')) - warning_fl(_T("%s: registry path name begins with \'\\\', may cause problems"),line.gettoken_str(0)); + warning_fl(_T("%") NPRIs _T(": registry path name begins with \'\\\', may cause problems"),line.gettoken_str(0)); ent.offsets[2]=add_string(line.gettoken_str(3)); if (which_token == TOK_WRITEREGSTR || which_token == TOK_WRITEREGEXPANDSTR) { - SCRIPT_MSG(_T("%s: %s\\%s\\%s=%s\n"), + SCRIPT_MSG(_T("%") NPRIs _T(": %") NPRIs _T("\\%") NPRIs _T("\\%") NPRIs _T("=%") NPRIs _T("\n"), line.gettoken_str(0),line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3),line.gettoken_str(4)); ent.offsets[3]=add_string(line.gettoken_str(4)); ent.offsets[4]=ent.offsets[5]=REG_SZ; @@ -5606,7 +5570,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) data[data_len++]=c; } if (*p) PRINTHELP() - SCRIPT_MSG(_T("WriteRegBin: %s\\%s\\%s=%s\n"), + SCRIPT_MSG(_T("WriteRegBin: %") NPRIs _T("\\%") NPRIs _T("\\%") NPRIs _T("=%") NPRIs _T("\n"), line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3),line.gettoken_str(4)); ent.offsets[3]=add_db_data(data,data_len); if (ent.offsets[3] < 0) return PS_ERROR; @@ -5617,7 +5581,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ent.offsets[3]=add_string(line.gettoken_str(4)); ent.offsets[4]=ent.offsets[5]=REG_DWORD; - SCRIPT_MSG(_T("WriteRegDWORD: %s\\%s\\%s=%s\n"), + SCRIPT_MSG(_T("WriteRegDWORD: %") NPRIs _T("\\%") NPRIs _T("\\%") NPRIs _T("=%") NPRIs _T("\n"), line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3),line.gettoken_str(4)); } } @@ -5634,8 +5598,8 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ent.offsets[2]=add_string(line.gettoken_str(3)); ent.offsets[3]=add_string(line.gettoken_str(4)); ent.offsets[4]=which_token == TOK_ENUMREGKEY; - if (line.gettoken_str(3)[0] == _T('\\')) warning_fl(_T("%s: registry path name begins with \'\\\', may cause problems"),line.gettoken_str(0)); - SCRIPT_MSG(_T("%s %s %s\\%s\\%s\n"),which_token == TOK_ENUMREGKEY ? _T("EnumRegKey") : _T("EnumRegValue"), + if (line.gettoken_str(3)[0] == _T('\\')) warning_fl(_T("%") NPRIs _T(": registry path name begins with \'\\\', may cause problems"),line.gettoken_str(0)); + SCRIPT_MSG(_T("%") NPRIs _T(" %") NPRIs _T(" %") NPRIs _T("\\%") NPRIs _T("\\%") NPRIs _T("\n"),which_token == TOK_ENUMREGKEY ? _T("EnumRegKey") : _T("EnumRegValue"), line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3),line.gettoken_str(4)); } return add_entry(&ent); @@ -5650,7 +5614,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) case TOK_WRITEREGDWORD: case TOK_ENUMREGKEY: case TOK_ENUMREGVAL: - ERROR_MSG(_T("Error: %s specified, NSIS_SUPPORT_REGISTRYFUNCTIONS not defined.\n"), line.gettoken_str(0)); + ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_REGISTRYFUNCTIONS not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif//!NSIS_SUPPORT_REGISTRYFUNCTIONS #ifdef NSIS_SUPPORT_STACK @@ -5667,7 +5631,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) } if (save>=0) { - SCRIPT_MSG(_T("Exch(%s,0)\n"),line.gettoken_str(1)); + SCRIPT_MSG(_T("Exch(%") NPRIs _T(",0)\n"),line.gettoken_str(1)); ent.offsets[0]=add_string(line.gettoken_str(1)); ent.offsets[1]=0; ent.offsets[2]=0; @@ -5694,20 +5658,20 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ent.which=EW_PUSHPOP; ent.offsets[0]=add_string(line.gettoken_str(1)); ent.offsets[1]=0; - SCRIPT_MSG(_T("Push: %s\n"),line.gettoken_str(1)); + SCRIPT_MSG(_T("Push: %") NPRIs _T("\n"),line.gettoken_str(1)); return add_entry(&ent); case TOK_POP: ent.which=EW_PUSHPOP; ent.offsets[0]=GetUserVarIndex(line, 1); ent.offsets[1]=1; if (ent.offsets[0] < 0) PRINTHELP() - SCRIPT_MSG(_T("Pop: %s\n"),line.gettoken_str(1)); + SCRIPT_MSG(_T("Pop: %") NPRIs _T("\n"),line.gettoken_str(1)); return add_entry(&ent); #else//!NSIS_SUPPORT_STACK case TOK_POP: case TOK_PUSH: case TOK_EXCH: - ERROR_MSG(_T("Error: %s specified, NSIS_SUPPORT_STACK not defined.\n"), line.gettoken_str(0)); + ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_STACK not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif//!NSIS_SUPPORT_STACK #ifdef NSIS_SUPPORT_ENVIRONMENT @@ -5723,7 +5687,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) if (ent.offsets[0] < 0 || _tcslen(line.gettoken_str(2))<1) PRINTHELP() } ent.offsets[2]=1; - SCRIPT_MSG(_T("ReadEnvStr: %s->%s\n"),line.gettoken_str(2),line.gettoken_str(1)); + SCRIPT_MSG(_T("ReadEnvStr: %") NPRIs _T("->%") NPRIs _T("\n"),line.gettoken_str(2),line.gettoken_str(1)); return add_entry(&ent); case TOK_EXPANDENVSTRS: ent.which=EW_READENVSTR; @@ -5731,12 +5695,12 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ent.offsets[1]=add_string(line.gettoken_str(2)); ent.offsets[2]=0; if (ent.offsets[0] < 0) PRINTHELP() - SCRIPT_MSG(_T("ExpandEnvStrings: %s->%s\n"),line.gettoken_str(2),line.gettoken_str(1)); + SCRIPT_MSG(_T("ExpandEnvStrings: %") NPRIs _T("->%") NPRIs _T("\n"),line.gettoken_str(2),line.gettoken_str(1)); return add_entry(&ent); #else//!NSIS_SUPPORT_ENVIRONMENT case TOK_EXPANDENVSTRS: case TOK_READENVSTR: - ERROR_MSG(_T("Error: %s specified, NSIS_SUPPORT_ENVIRONMENT not defined.\n"), line.gettoken_str(0)); + ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_ENVIRONMENT not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif//!NSIS_SUPPORT_ENVIRONMENT #ifdef NSIS_SUPPORT_FINDFIRST @@ -5746,26 +5710,26 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ent.offsets[1]=GetUserVarIndex(line, 1); // handleout ent.offsets[2]=add_string(line.gettoken_str(3)); // filespec if (ent.offsets[0] < 0 || ent.offsets[1] < 0) PRINTHELP() - SCRIPT_MSG(_T("FindFirst: spec=\"%s\" handle=%s output=%s\n"),line.gettoken_str(3),line.gettoken_str(1),line.gettoken_str(2)); + SCRIPT_MSG(_T("FindFirst: spec=\"%") NPRIs _T("\" handle=%") NPRIs _T(" output=%") NPRIs _T("\n"),line.gettoken_str(3),line.gettoken_str(1),line.gettoken_str(2)); return add_entry(&ent); case TOK_FINDNEXT: ent.which=EW_FINDNEXT; ent.offsets[0]=GetUserVarIndex(line, 2); ent.offsets[1]=GetUserVarIndex(line, 1); if (ent.offsets[0] < 0 || ent.offsets[1] < 0) PRINTHELP() - SCRIPT_MSG(_T("FindNext: handle=%s output=%s\n"),line.gettoken_str(1),line.gettoken_str(2)); + SCRIPT_MSG(_T("FindNext: handle=%") NPRIs _T(" output=%") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(2)); return add_entry(&ent); case TOK_FINDCLOSE: ent.which=EW_FINDCLOSE; ent.offsets[0]=GetUserVarIndex(line, 1); if (ent.offsets[0] < 0) PRINTHELP() - SCRIPT_MSG(_T("FindClose: %s\n"),line.gettoken_str(1)); + SCRIPT_MSG(_T("FindClose: %") NPRIs _T("\n"),line.gettoken_str(1)); return add_entry(&ent); #else//!NSIS_SUPPORT_FINDFIRST case TOK_FINDCLOSE: case TOK_FINDNEXT: case TOK_FINDFIRST: - ERROR_MSG(_T("Error: %s specified, NSIS_SUPPORT_FINDFIRST not defined.\n"), line.gettoken_str(0)); + ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_FINDFIRST not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif//!NSIS_SUPPORT_FINDFIRST @@ -5796,13 +5760,13 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) if (ent.offsets[0] < 0 || !ent.offsets[1]) PRINTHELP() } - SCRIPT_MSG(_T("FileOpen: %s as %s -> %s\n"),line.gettoken_str(2),line.gettoken_str(3),line.gettoken_str(1)); + SCRIPT_MSG(_T("FileOpen: %") NPRIs _T(" as %") NPRIs _T(" -> %") NPRIs _T("\n"),line.gettoken_str(2),line.gettoken_str(3),line.gettoken_str(1)); return add_entry(&ent); case TOK_FILECLOSE: ent.which=EW_FCLOSE; ent.offsets[0]=GetUserVarIndex(line, 1); // file handle if (ent.offsets[0] < 0) PRINTHELP() - SCRIPT_MSG(_T("FileClose: %s\n"),line.gettoken_str(1)); + SCRIPT_MSG(_T("FileClose: %") NPRIs _T("\n"),line.gettoken_str(1)); return add_entry(&ent); case TOK_FILEREAD: ent.which=EW_FGETS; @@ -5813,14 +5777,14 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) else ent.offsets[2]=add_intstring(NSIS_MAX_STRLEN-1); if (ent.offsets[0]<0 || ent.offsets[1]<0) PRINTHELP() - SCRIPT_MSG(_T("FileRead: %s->%s (max:%s)\n"),line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3)); + SCRIPT_MSG(_T("FileRead: %") NPRIs _T("->%") NPRIs _T(" (max:%") NPRIs _T(")\n"),line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3)); return add_entry(&ent); case TOK_FILEWRITE: ent.which=EW_FPUTS; 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("FileWrite: %s->%s\n"),line.gettoken_str(2),line.gettoken_str(1)); + SCRIPT_MSG(_T("FileWrite: %") NPRIs _T("->%") NPRIs _T("\n"),line.gettoken_str(2),line.gettoken_str(1)); return add_entry(&ent); case TOK_FILEREADBYTE: ent.which=EW_FGETS; @@ -5829,7 +5793,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ent.offsets[2]=add_asciistring(_T("1")); ent.offsets[3]=1; if (ent.offsets[0]<0 || ent.offsets[1]<0) PRINTHELP() - SCRIPT_MSG(_T("FileReadByte: %s->%s\n"),line.gettoken_str(1),line.gettoken_str(2)); + SCRIPT_MSG(_T("FileReadByte: %") NPRIs _T("->%") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(2)); return add_entry(&ent); case TOK_FILEWRITEBYTE: ent.which=EW_FPUTS; @@ -5837,13 +5801,13 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ent.offsets[1]=add_string(line.gettoken_str(2)); ent.offsets[2]=1; if (ent.offsets[0]<0) PRINTHELP() - SCRIPT_MSG(_T("FileWriteByte: %s->%s\n"),line.gettoken_str(2),line.gettoken_str(1)); + SCRIPT_MSG(_T("FileWriteByte: %") NPRIs _T("->%") NPRIs _T("\n"),line.gettoken_str(2),line.gettoken_str(1)); return add_entry(&ent); #ifdef _UNICODE case TOK_FILEREADUTF16LE: if (!build_unicode) { - ERROR_MSG(_T("Error: %s is only available when building a Unicode installer\n"), line.gettoken_str(0)); + ERROR_MSG(_T("Error: %") NPRIs _T(" is only available when building a Unicode installer\n"), line.gettoken_str(0)); return PS_ERROR; } ent.which=EW_FGETWS; @@ -5854,24 +5818,24 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) 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)); + SCRIPT_MSG(_T("FileReadUTF16LE: %") NPRIs _T("->%") NPRIs _T(" (max:%") NPRIs _T(")\n"),line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3)); return add_entry(&ent); case TOK_FILEWRITEUTF16LE: if (!build_unicode) { - ERROR_MSG(_T("Error: %s is only available when building a Unicode installer\n"), line.gettoken_str(0)); + ERROR_MSG(_T("Error: %") NPRIs _T(" is only available when building a Unicode installer\n"), line.gettoken_str(0)); return PS_ERROR; } 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)); + SCRIPT_MSG(_T("FileWriteUTF16LE: %") NPRIs _T("->%") NPRIs _T("\n"),line.gettoken_str(2),line.gettoken_str(1)); return add_entry(&ent); case TOK_FILEREADWORD: if (!build_unicode) { - ERROR_MSG(_T("Error: %s is only available when building a Unicode installer\n"), line.gettoken_str(0)); + ERROR_MSG(_T("Error: %") NPRIs _T(" is only available when building a Unicode installer\n"), line.gettoken_str(0)); return PS_ERROR; } ent.which=EW_FGETWS; @@ -5880,12 +5844,12 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ent.offsets[2]=add_asciistring(_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)); + SCRIPT_MSG(_T("FileReadWord: %") NPRIs _T("->%") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(2)); return add_entry(&ent); case TOK_FILEWRITEWORD: if (!build_unicode) { - ERROR_MSG(_T("Error: %s is only available when building a Unicode installer\n"), line.gettoken_str(0)); + ERROR_MSG(_T("Error: %") NPRIs _T(" is only available when building a Unicode installer\n"), line.gettoken_str(0)); return PS_ERROR; } ent.which=EW_FPUTWS; @@ -5893,7 +5857,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) 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)); + SCRIPT_MSG(_T("FileWriteWord: %") NPRIs _T("->%") NPRIs _T("\n"),line.gettoken_str(2),line.gettoken_str(1)); return add_entry(&ent); #endif case TOK_FILESEEK: @@ -5915,7 +5879,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) if (mode<0 || ent.offsets[0] < 0 || (ent.offsets[1]<0 && line.gettoken_str(4)[0])) PRINTHELP() ent.offsets[3]=tab[mode]; - SCRIPT_MSG(_T("FileSeek: fp=%s, ofs=%s, mode=%s, output=%s\n"), + SCRIPT_MSG(_T("FileSeek: fp=%") NPRIs _T(", ofs=%") NPRIs _T(", mode=%") NPRIs _T(", output=%") NPRIs _T("\n"), line.gettoken_str(1), line.gettoken_str(2), modestr, @@ -5937,7 +5901,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) case TOK_FILEREADWORD: case TOK_FILEWRITEWORD: #endif - ERROR_MSG(_T("Error: %s specified, NSIS_SUPPORT_FILEFUNCTIONS not defined.\n"), line.gettoken_str(0)); + ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_FILEFUNCTIONS not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif//!NSIS_SUPPORT_FILEFUNCTIONS @@ -5961,7 +5925,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) process_jump(line,2,&ent.offsets[1])) PRINTHELP() ent.offsets[2]=FLAG_OFFSET(exec_reboot); ent.offsets[3]=~0;//new value mask - keep flag - SCRIPT_MSG(_T("IfRebootFlag ?%s:%s\n"),line.gettoken_str(1),line.gettoken_str(2)); + SCRIPT_MSG(_T("IfRebootFlag ?%") NPRIs _T(":%") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(2)); return add_entry(&ent); case TOK_SETREBOOTFLAG: { @@ -5976,7 +5940,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) case TOK_REBOOT: case TOK_IFREBOOTFLAG: case TOK_SETREBOOTFLAG: - ERROR_MSG(_T("Error: %s specified, NSIS_SUPPORT_REBOOT not defined.\n"), line.gettoken_str(0)); + ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_REBOOT not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif//!NSIS_SUPPORT_REBOOT #ifdef NSIS_CONFIG_LOG @@ -5986,19 +5950,19 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ent.offsets[1]=line.gettoken_enum(1,_T("off\0on\0")); if (ent.offsets[1]<0) PRINTHELP() - SCRIPT_MSG(_T("LogSet: %s\n"),line.gettoken_str(1)); + SCRIPT_MSG(_T("LogSet: %") NPRIs _T("\n"),line.gettoken_str(1)); return add_entry(&ent); case TOK_LOGTEXT: ent.which=EW_LOG; ent.offsets[0]=0; ent.offsets[1]=add_string(line.gettoken_str(1)); - SCRIPT_MSG(_T("LogText \"%s\"\n"),line.gettoken_str(1)); + SCRIPT_MSG(_T("LogText \"%") NPRIs _T("\"\n"),line.gettoken_str(1)); return add_entry(&ent); #else//!NSIS_CONFIG_LOG case TOK_LOGSET: case TOK_LOGTEXT: - ERROR_MSG(_T("Error: %s specified, NSIS_CONFIG_LOG not defined.\n"), line.gettoken_str(0)); + ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_CONFIG_LOG not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif//!NSIS_CONFIG_LOG #ifdef NSIS_CONFIG_COMPONENTPAGE @@ -6007,7 +5971,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ent.offsets[0]=add_string(line.gettoken_str(1)); ent.offsets[2]=SECTION_FIELD_SET(name_ptr); ent.offsets[4]=add_string(line.gettoken_str(2)); - SCRIPT_MSG(_T("SectionSetText: %s->%s\n"),line.gettoken_str(1),line.gettoken_str(2)); + SCRIPT_MSG(_T("SectionSetText: %") NPRIs _T("->%") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(2)); return add_entry(&ent); case TOK_SECTIONGETTEXT: ent.which=EW_SECTIONSET; @@ -6015,7 +5979,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ent.offsets[1]=GetUserVarIndex(line, 2); ent.offsets[2]=SECTION_FIELD_GET(name_ptr); if (line.gettoken_str(2)[0] && ent.offsets[1]<0) PRINTHELP() - SCRIPT_MSG(_T("SectionGetText: %s->%s\n"),line.gettoken_str(1),line.gettoken_str(2)); + SCRIPT_MSG(_T("SectionGetText: %") NPRIs _T("->%") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(2)); return add_entry(&ent); case TOK_SECTIONSETFLAGS: ent.which=EW_SECTIONSET; @@ -6023,7 +5987,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ent.offsets[1]=add_string(line.gettoken_str(2)); ent.offsets[2]=SECTION_FIELD_SET(flags); ent.offsets[3]=1; - SCRIPT_MSG(_T("SectionSetFlags: %s->%s\n"),line.gettoken_str(1),line.gettoken_str(2)); + SCRIPT_MSG(_T("SectionSetFlags: %") NPRIs _T("->%") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(2)); return add_entry(&ent); case TOK_SECTIONGETFLAGS: ent.which=EW_SECTIONSET; @@ -6031,14 +5995,14 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ent.offsets[1]=GetUserVarIndex(line, 2); ent.offsets[2]=SECTION_FIELD_GET(flags); if (line.gettoken_str(2)[0] && ent.offsets[1]<0) PRINTHELP() - SCRIPT_MSG(_T("SectionGetFlags: %s->%s\n"),line.gettoken_str(1),line.gettoken_str(2)); + SCRIPT_MSG(_T("SectionGetFlags: %") NPRIs _T("->%") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(2)); return add_entry(&ent); case TOK_INSTTYPESETTEXT: ent.which=EW_INSTTYPESET; ent.offsets[0]=add_string(line.gettoken_str(1)); ent.offsets[1]=add_string(line.gettoken_str(2)); ent.offsets[2]=1; - SCRIPT_MSG(_T("InstTypeSetText: %s->%s\n"),line.gettoken_str(1),line.gettoken_str(2)); + SCRIPT_MSG(_T("InstTypeSetText: %") NPRIs _T("->%") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(2)); return add_entry(&ent); case TOK_INSTTYPEGETTEXT: ent.which=EW_INSTTYPESET; @@ -6046,14 +6010,14 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ent.offsets[1]=GetUserVarIndex(line, 2); ent.offsets[2]=0; if (line.gettoken_str(1)[0] && ent.offsets[1]<0) PRINTHELP() - SCRIPT_MSG(_T("InstTypeGetText: %s->%s\n"),line.gettoken_str(1),line.gettoken_str(2)); + SCRIPT_MSG(_T("InstTypeGetText: %") NPRIs _T("->%") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(2)); return add_entry(&ent); case TOK_SECTIONSETINSTTYPES: ent.which=EW_SECTIONSET; ent.offsets[0]=add_string(line.gettoken_str(1)); ent.offsets[1]=add_string(line.gettoken_str(2)); ent.offsets[2]=SECTION_FIELD_SET(install_types); - SCRIPT_MSG(_T("SectionSetInstTypes: %s->%s\n"),line.gettoken_str(1),line.gettoken_str(2)); + SCRIPT_MSG(_T("SectionSetInstTypes: %") NPRIs _T("->%") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(2)); return add_entry(&ent); case TOK_SECTIONGETINSTTYPES: ent.which=EW_SECTIONSET; @@ -6061,14 +6025,14 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ent.offsets[1]=GetUserVarIndex(line, 2); ent.offsets[2]=SECTION_FIELD_GET(install_types); if (line.gettoken_str(2)[0] && ent.offsets[1]<0) PRINTHELP() - SCRIPT_MSG(_T("SectionGetInstTypes: %s->%s\n"),line.gettoken_str(1),line.gettoken_str(2)); + SCRIPT_MSG(_T("SectionGetInstTypes: %") NPRIs _T("->%") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(2)); return add_entry(&ent); case TOK_SECTIONSETSIZE: ent.which=EW_SECTIONSET; ent.offsets[0]=add_string(line.gettoken_str(1)); ent.offsets[1]=add_string(line.gettoken_str(2)); ent.offsets[2]=SECTION_FIELD_SET(size_kb); - SCRIPT_MSG(_T("SectionSetSize: %s->%s\n"),line.gettoken_str(1),line.gettoken_str(2)); + SCRIPT_MSG(_T("SectionSetSize: %") NPRIs _T("->%") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(2)); return add_entry(&ent); case TOK_SECTIONGETSIZE: ent.which=EW_SECTIONSET; @@ -6076,7 +6040,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ent.offsets[1]=GetUserVarIndex(line, 2); ent.offsets[2]=SECTION_FIELD_GET(size_kb); if (line.gettoken_str(2)[0] && ent.offsets[1]<0) PRINTHELP() - SCRIPT_MSG(_T("SectionGetSize: %s->%s\n"),line.gettoken_str(1),line.gettoken_str(2)); + SCRIPT_MSG(_T("SectionGetSize: %") NPRIs _T("->%") NPRIs _T("\n"),line.gettoken_str(1),line.gettoken_str(2)); return add_entry(&ent); case TOK_SETCURINSTTYPE: ent.which=EW_INSTTYPESET; @@ -6084,7 +6048,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ent.offsets[1]=0; ent.offsets[2]=1; ent.offsets[3]=1; - SCRIPT_MSG(_T("SetCurInstType: %s\n"),line.gettoken_str(1)); + SCRIPT_MSG(_T("SetCurInstType: %") NPRIs _T("\n"),line.gettoken_str(1)); return add_entry(&ent); case TOK_GETCURINSTTYPE: ent.which=EW_INSTTYPESET; @@ -6093,7 +6057,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ent.offsets[2]=0; ent.offsets[3]=1; if (line.gettoken_str(1)[0] && ent.offsets[1]<0) PRINTHELP() - SCRIPT_MSG(_T("GetCurInstType: %s\n"),line.gettoken_str(1)); + SCRIPT_MSG(_T("GetCurInstType: %") NPRIs _T("\n"),line.gettoken_str(1)); return add_entry(&ent); #else//!NSIS_CONFIG_COMPONENTPAGE case TOK_SECTIONSETTEXT: @@ -6106,7 +6070,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) case TOK_SECTIONGETINSTTYPES: case TOK_SETCURINSTTYPE: case TOK_GETCURINSTTYPE: - ERROR_MSG(_T("Error: %s specified, NSIS_CONFIG_COMPONENTPAGE not defined.\n"), line.gettoken_str(0)); + ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_CONFIG_COMPONENTPAGE not defined.\n"), line.gettoken_str(0)); return PS_ERROR; #endif//!NSIS_CONFIG_COMPONENTPAGE #ifdef NSIS_CONFIG_ENHANCEDUI_SUPPORT @@ -6129,7 +6093,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) } else if (!ent.offsets[0]) { ent.offsets[0]=add_string(line.gettoken_str(i)); - SCRIPT_MSG(_T("\"%s\" "), line.gettoken_str(i)); + SCRIPT_MSG(_T("\"%") NPRIs _T("\" "), line.gettoken_str(i)); } else { SCRIPT_MSG(_T("\n")); @@ -6143,7 +6107,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) return add_entry(&ent); #else//NSIS_CONFIG_ENHANCEDUI_SUPPORT case TOK_SETBRANDINGIMAGE: - ERROR_MSG(_T("Error: %s specified, NSIS_CONFIG_ENHANCEDUI_SUPPORT not defined.\n"),line.gettoken_str(0)); + ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_CONFIG_ENHANCEDUI_SUPPORT not defined.\n"),line.gettoken_str(0)); return PS_ERROR; #endif//!NSIS_SUPPORT_CREATEFONT @@ -6170,7 +6134,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) } } - SCRIPT_MSG(_T("Var: \"%s\"\n"),line.gettoken_str(a)); + SCRIPT_MSG(_T("Var: \"%") NPRIs _T("\"\n"),line.gettoken_str(a)); int res = DeclaredUserVar(line.gettoken_str(a)); if (res != PS_OK) @@ -6200,11 +6164,11 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) } else { - SCRIPT_MSG(_T("%s: \"%s\" \"%s\"\n"), line.gettoken_str(0), line.gettoken_str(a), line.gettoken_str(a+1)); + SCRIPT_MSG(_T("%") NPRIs _T(": \"%") NPRIs _T("\" \"%") NPRIs _T("\"\n"), line.gettoken_str(0), line.gettoken_str(a), line.gettoken_str(a+1)); const bool allowdeflangfallback = a <= 1 && !forceneutrallang; if ( a > 1 && 0 == LangID && !forceneutrallang) { - ERROR_MSG(_T("%s: \"%s\" is not a valid language code!\n"),line.gettoken_str(0), line.gettoken_str(1)); + ERROR_MSG(_T("%") NPRIs _T(": \"%") NPRIs _T("\" is not a valid language code!\n"),line.gettoken_str(0), line.gettoken_str(1)); return PS_ERROR; } @@ -6214,7 +6178,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) if ( rVersionInfo.SetKeyValue(LangID, codepage, pKey, pValue) ) { - ERROR_MSG(_T("%s: \"%s\" \"%04d-%s\" already defined!\n"),line.gettoken_str(0), line.gettoken_str(2), LangID, lang_name); + ERROR_MSG(_T("%") NPRIs _T(": \"%") NPRIs _T("\" \"%04d-%") NPRIs _T("\" already defined!\n"),line.gettoken_str(0), line.gettoken_str(2), LangID, lang_name); return PS_ERROR; } @@ -6232,7 +6196,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) const unsigned int reuseFlag = settingFileVer ? 4 : 1; if (reuseFlag & version_fixedflags) { - ERROR_MSG(_T("Error: %s already defined!\n"), line.gettoken_str(0)); + ERROR_MSG(_T("Error: %") NPRIs _T(" already defined!\n"), line.gettoken_str(0)); return PS_ERROR; } version_fixedflags |= reuseFlag; @@ -6242,7 +6206,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) { if (!validInput) { - ERROR_MSG(_T("Error: invalid %s format, should be X.X.X.X\n"),line.gettoken_str(0)); + ERROR_MSG(_T("Error: invalid %") NPRIs _T(" format, should be X.X.X.X\n"),line.gettoken_str(0)); return PS_ERROR; } rVersionInfo.SetFileVersion(MAKELONG(iml, imm),MAKELONG(ill, ilm)); @@ -6264,7 +6228,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) case TOK_VI_ADDKEY: case TOK_VI_SETPRODUCTVERSION: case TOK_VI_SETFILEVERSION: - ERROR_MSG(_T("Error: %s specified, NSIS_SUPPORT_VERSION_INFO not defined.\n"),line.gettoken_str(0)); + ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_VERSION_INFO not defined.\n"),line.gettoken_str(0)); return PS_ERROR; #endif @@ -6292,13 +6256,13 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) if (CEXEBuild::TARGETFIRST != tt) es += _T(", /"); es += get_target_suffix(tt); } - ERROR_MSG(_T("Error: %s\n"),es.c_str()); + ERROR_MSG(_T("Error: %") NPRIs _T("\n"),es.c_str()); return PS_ERROR; } } if (1 == numtok) { - SCRIPT_MSG(_T("PluginDir: \"%s\"\n"),path); + SCRIPT_MSG(_T("PluginDir: \"%") NPRIs _T("\"\n"),path); PATH_CONVERT(path); m_plugins[tt].AddPluginsDir(path, !!display_script); return PS_OK; @@ -6312,7 +6276,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) if (!m_pPlugins->GetCommandInfo(line.gettoken_str(0), command, dllPath)) { - ERROR_MSG(_T("Plugin command %s conflicts with a plugin in another directory!\n"),command.c_str()); + ERROR_MSG(_T("Plugin command %") NPRIs _T(" conflicts with a plugin in another directory!\n"),command.c_str()); return PS_ERROR; } @@ -6331,7 +6295,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) // DLL name on the user machine TCHAR tempDLL[NSIS_MAX_STRLEN]; - wsprintf(tempDLL, _T("$PLUGINSDIR\\%s"), dllName.c_str()); + wsprintf(tempDLL, _T("$PLUGINSDIR\\%") NPRIs, dllName.c_str()); // Add the DLL to the installer if (data_handle == -1) @@ -6389,7 +6353,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) // Call the DLL tstring funcname = get_string_suffix(command, _T("::")); - SCRIPT_MSG(_T("Plugin Command: %s"),funcname.c_str()); + SCRIPT_MSG(_T("Plugin Command: %") NPRIs,funcname.c_str()); int i = 1; int nounload = 0; @@ -6413,7 +6377,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) if (ret != PS_OK) { return ret; } - SCRIPT_MSG(_T(" %s"),line.gettoken_str(i)); + SCRIPT_MSG(_T(" %") NPRIs,line.gettoken_str(i)); } SCRIPT_MSG(_T("\n")); if (nounloadmisused) @@ -6441,7 +6405,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) case TOK_INITPLUGINSDIR: { int ret; - SCRIPT_MSG(_T("%s\n"),line.gettoken_str(0)); + SCRIPT_MSG(_T("%") NPRIs _T("\n"),line.gettoken_str(0)); if (uninstall_mode) uninst_plugin_used = true; else plugin_used = true; // Call [un.]Initialize_____Plugins @@ -6459,7 +6423,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) case TOK__PLUGINCOMMAND: case TOK_INITPLUGINSDIR: { - ERROR_MSG(_T("Error: %s specified, NSIS_CONFIG_PLUGIN_SUPPORT not defined.\n"),line.gettoken_str(0)); + ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_CONFIG_PLUGIN_SUPPORT not defined.\n"),line.gettoken_str(0)); } return PS_ERROR; #endif// NSIS_CONFIG_PLUGIN_SUPPORT @@ -6475,7 +6439,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) #else case TOK_LOCKWINDOW: { - ERROR_MSG(_T("Error: %s specified, NSIS_LOCKWINDOW_SUPPORT not defined.\n"),line.gettoken_str(0)); + ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_LOCKWINDOW_SUPPORT not defined.\n"),line.gettoken_str(0)); } return PS_ERROR; #endif // NSIS_LOCKWINDOW_SUPPORT @@ -6483,7 +6447,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) default: break; } - ERROR_MSG(_T("Error: doCommand: Invalid token \"%s\".\n"),line.gettoken_str(0)); + ERROR_MSG(_T("Error: doCommand: Invalid token \"%") NPRIs _T("\".\n"),line.gettoken_str(0)); return PS_ERROR; } @@ -6495,20 +6459,15 @@ int CEXEBuild::do_add_file(const TCHAR *lgss, int attrib, int recurse, int *tota tstring dir = get_dir_name(lgss); tstring spec; - if (dir == lgss) { - dir = _T("."); - spec = lgss; - } else { + if (dir == lgss) + dir = _T("."), spec = lgss; + else spec = tstring(lgss).substr(dir.length() + 1, tstring::npos); - } - if (spec == _T("")) { - spec = _T("*"); - } + if (spec == _T("")) spec = _T("*"); if (basedir == _T("")) { dir_created = true; - if (recurse) { // save $OUTDIR into $_OUTDIR [StrCpy $_OUTDIR $OUTDIR] if (add_entry_direct(EW_ASSIGNVAR, m_UserVarNames.get(_T("_OUTDIR")), add_asciistring(_T("$OUTDIR"))) != PS_OK) { @@ -6530,7 +6489,7 @@ int CEXEBuild::do_add_file(const TCHAR *lgss, int attrib, int recurse, int *tota continue; if (!dir_created && generatecode) { - SCRIPT_MSG(_T("%sFile: Descending to: \"%s\"\n"), generatecode ? _T("") : _T("Reserve"), dir.c_str()); + SCRIPT_MSG(_T("%") NPRIs _T("File: Descending to: \"%") NPRIs _T("\"\n"), generatecode ? _T("") : _T("Reserve"), dir.c_str()); if (do_add_file_create_dir(dir, basedir, attrib) != PS_OK) { return PS_ERROR; @@ -6546,10 +6505,7 @@ int CEXEBuild::do_add_file(const TCHAR *lgss, int attrib, int recurse, int *tota (*total_files)++; } - if (!recurse) { - return PS_OK; - } - + if (!recurse) return PS_OK; // recurse into directories for (dir_reader::iterator dirs_itr = dr->dirs().begin(); dirs_itr != dr->dirs().end(); @@ -6571,7 +6527,7 @@ int CEXEBuild::do_add_file(const TCHAR *lgss, int attrib, int recurse, int *tota } else if (generatecode) { // always create directories that match - SCRIPT_MSG(_T("%sFile: Descending to: \"%s\"\n"), generatecode ? _T("") : _T("Reserve"), new_spec.c_str()); + SCRIPT_MSG(_T("%") NPRIs _T("File: Descending to: \"%") NPRIs _T("\"\n"), generatecode ? _T("") : _T("Reserve"), new_spec.c_str()); if (do_add_file_create_dir(dir + _T('\\') + *dirs_itr, new_dir, attrib) != PS_OK) { return PS_ERROR; @@ -6589,7 +6545,7 @@ int CEXEBuild::do_add_file(const TCHAR *lgss, int attrib, int recurse, int *tota } if (basedir == _T("")) { - SCRIPT_MSG(_T("%sFile: Returning to: \"%s\"\n"), generatecode ? _T("") : _T("Reserve"), dir.c_str()); + SCRIPT_MSG(_T("%") NPRIs _T("File: Returning to: \"%") NPRIs _T("\"\n"), generatecode ? _T("") : _T("Reserve"), dir.c_str()); // restore $OUTDIR from $_OUTDIR [SetOutPath $_OUTDIR] if (add_entry_direct(EW_CREATEDIR, add_asciistring(_T("$_OUTDIR")), 1) != PS_OK) { @@ -6604,7 +6560,6 @@ int CEXEBuild::add_file(const tstring& dir, const tstring& file, int attrib, con tstring newfn_s = dir + PLATFORM_PATH_SEPARATOR_C + file; const TCHAR *newfn = newfn_s.c_str(); const TCHAR *filename = file.c_str(); - MMapFile mmap; DWORD len; @@ -6620,49 +6575,43 @@ int CEXEBuild::add_file(const tstring& dir, const tstring& file, int attrib, con ); if (hFile == INVALID_HANDLE_VALUE) { - ERROR_MSG(_T("%sFile: failed opening file \"%s\"\n"),generatecode?_T(""):_T("Reserve"),newfn); + ERROR_MSG(_T("%") NPRIs _T("File: failed opening file \"%") NPRIs _T("\"\n"),generatecode?_T(""):_T("Reserve"),newfn); return PS_ERROR; } - - // Will auto-CloseHandle hFile MANAGE_WITH(hFile, CloseHandle); len = GetFileSize(hFile, NULL); if (len && !mmap.setfile(hFile, len)) { - ERROR_MSG(_T("%sFile: failed creating mmap of \"%s\"\n"),generatecode?_T(""):_T("Reserve"),newfn); + ERROR_MSG(_T("%") NPRIs _T("File: failed creating mmap of \"%") NPRIs _T("\"\n"),generatecode?_T(""):_T("Reserve"),newfn); return PS_ERROR; } -#else - struct stat s; - if (stat(newfn, &s)) { - ERROR_MSG(_T("%sFile: failed stating file \"%s\"\n"),generatecode?_T(""):_T("Reserve"),newfn); - return PS_ERROR; - } - - len = (DWORD) s.st_size; - +#else // !_WIN32 int fd = OPEN(newfn, O_RDONLY); if (fd == -1) { - ERROR_MSG(_T("%sFile: failed opening file \"%s\"\n"),generatecode?_T(""):_T("Reserve"),newfn); + ERROR_MSG(_T("%") NPRIs _T("File: failed opening file \"%") NPRIs _T("\"\n"),generatecode?_T(""):_T("Reserve"),newfn); return PS_ERROR; } + MANAGE_WITH(fd, close); // Will auto-close(2) fd - // Will auto-close(2) fd - MANAGE_WITH(fd, close); - + struct stat s; + if (fstat(fd, &s)) { + ERROR_MSG(_T("%") NPRIs _T("File: failed stating file \"%") NPRIs _T("\"\n"),generatecode?_T(""):_T("Reserve"),newfn); + return PS_ERROR; + } + len = (DWORD) s.st_size; if (len && !mmap.setfile(fd, len)) { - ERROR_MSG(_T("%sFile: failed creating mmap of \"%s\"\n"),generatecode?_T(""):_T("Reserve"),newfn); + ERROR_MSG(_T("%") NPRIs _T("File: failed creating mmap of \"%") NPRIs _T("\"\n"),generatecode?_T(""):_T("Reserve"),newfn); return PS_ERROR; } -#endif +#endif // ~_WIN32 if (generatecode&1) section_add_size_kb((len+1023)/1024); - if (name_override) SCRIPT_MSG(_T("%sFile: \"%s\"->\"%s\""),generatecode?_T(""):_T("Reserve"),filename,name_override); - else SCRIPT_MSG(_T("%sFile: \"%s\""),generatecode?_T(""):_T("Reserve"),filename); + if (name_override) SCRIPT_MSG(_T("%") NPRIs _T("File: \"%") NPRIs _T("\"->\"%") NPRIs _T("\""),generatecode?_T(""):_T("Reserve"),filename,name_override); + else SCRIPT_MSG(_T("%") NPRIs _T("File: \"%") NPRIs _T("\""),generatecode?_T(""):_T("Reserve"),filename); if (!build_compress_whole) if (build_compress) SCRIPT_MSG(_T(" [compress]")); fflush(stdout); @@ -6692,7 +6641,7 @@ int CEXEBuild::add_file(const tstring& dir, const tstring& file, int attrib, con { const TCHAR c=*i++; *o++=c; - if (c == _T('$')) *o++=_T('$'); + if (c == _T('$')) *o++=_T('$'); // BUGBUG: We could overflow buf here } *o=0; ent.offsets[1]=add_string(buf); @@ -6727,36 +6676,28 @@ int CEXEBuild::add_file(const tstring& dir, const tstring& file, int attrib, con FILETIME ft; if (GetFileTime(hFile,NULL,NULL,&ft)) { - // FAT write time has a resolution of 2 seconds PULONGLONG fti = (PULONGLONG) &ft; - *fti -= *fti % 20000000; - - ent.offsets[3]=ft.dwLowDateTime; - ent.offsets[4]=ft.dwHighDateTime; + *fti -= *fti % 20000000; // FAT write time has a resolution of 2 seconds + ent.offsets[3]=ft.dwLowDateTime, ent.offsets[4]=ft.dwHighDateTime; } #else struct stat st; if (!fstat(fd, &st)) { unsigned long long ll = (st.st_mtime * 10000000LL) + 116444736000000000LL; - - // FAT write time has a resolution of 2 seconds - ll -= ll % 20000000; - - ent.offsets[3] = (int) ll; - ent.offsets[4] = (int) (ll >> 32); + ll -= ll % 20000000; // FAT write time has a resolution of 2 seconds + ent.offsets[3] = (int) ll, ent.offsets[4] = (int) (ll >> 32); } #endif else { - ERROR_MSG(_T("%sFile: failed getting file date from \"%s\"\n"),generatecode?_T(""):_T("Reserve"),newfn); + ERROR_MSG(_T("%") NPRIs _T("File: failed getting file date from \"%") NPRIs _T("\"\n"),generatecode?_T(""):_T("Reserve"),newfn); return PS_ERROR; } } else { - ent.offsets[3]=0xffffffff; - ent.offsets[4]=0xffffffff; + ent.offsets[3]=0xffffffff, ent.offsets[4]=0xffffffff; } // overwrite flag can be 0, 1, 2 or 3. in all cases, 2 bits @@ -6774,7 +6715,6 @@ int CEXEBuild::add_file(const tstring& dir, const tstring& file, int attrib, con mb |= IDCANCEL << 21; } ent.offsets[0] |= mb << 3; - ent.offsets[5] = DefineInnerLangString(build_allowskipfiles ? NLF_FILE_ERROR : NLF_FILE_ERROR_NOIGNORE); } @@ -6782,9 +6722,7 @@ int CEXEBuild::add_file(const tstring& dir, const tstring& file, int attrib, con { int a=add_entry(&ent); if (a != PS_OK) - { return a; - } if (attrib) { #ifdef _WIN32 @@ -6801,9 +6739,7 @@ int CEXEBuild::add_file(const tstring& dir, const tstring& file, int attrib, con { a=add_entry(&ent); if (a != PS_OK) - { return a; - } } #endif } @@ -6889,7 +6825,7 @@ DefineList *CEXEBuild::searchParseString(const TCHAR *source_string, LineParser& if (failParam) *failParam = ret ? ret->getnum() : 0; if (noErrors) break; // Caller is OK with a incomplete list of matched strings const TCHAR *msgprefix = src_start ? _T("") : _T("starting "); - ERROR_MSG(_T("!searchparse: %sstring \"%s\" not found, aborted search!\n"),msgprefix,tok?tok:_T("(null)")); + ERROR_MSG(_T("!searchparse: %") NPRIs _T("string \"%") NPRIs _T("\" not found, aborted search!\n"),msgprefix,tok?tok:_T("(null)")); delete ret; return NULL; } diff --git a/Source/strlist.h b/Source/strlist.h index 90ac755b..844521f5 100644 --- a/Source/strlist.h +++ b/Source/strlist.h @@ -308,25 +308,25 @@ class SortedStringListND // no delete - can be placed in GrowBuf SortedStringListND() { } virtual ~SortedStringListND() { } - /** - * Adds name into the list of sorted strings. - * - * @param name String to store. - * @param case_sensitive Look for string case sensitively. Default is 0. - * @param alwaysreturnpos Always return the position regardless of whether - * name was inserted into the list or not. The default is 0. - * - * @return Returns -1 when name already exists, otherwise the T offset - * into which the struct was stored in m_gr. If alwaysreturnpos - * is true, then it will return the byte offset regardless of whether - * the string was found. - */ + /** + * Adds name into the list of sorted strings. + * + * @param name String to store. + * @param case_sensitive Look for string case sensitively. Default is 0. + * @param alwaysreturnpos Always return the position regardless of whether + * name was inserted into the list or not. The default is 0. + * + * @return Returns -1 when name already exists, otherwise the T offset + * into which the struct was stored in m_gr. If alwaysreturnpos + * is true, then it will return the byte offset regardless of whether + * the string was found. + */ int add(const TCHAR *name, int case_sensitive=0, int alwaysreturnpos=0) { int where=0; T newstruct={0,}; - // Find the best position to insert. + // Find the best position to insert. int pos=find(name,-1,case_sensitive,1,&where); if (pos==-1) return alwaysreturnpos ? where : -1; @@ -342,46 +342,46 @@ class SortedStringListND // no delete - can be placed in GrowBuf return pos; } - /** - * This function looks for the string str, in T.name in the buffer m_gr. - * If it finds it, it returns the position found. Otherwise, it returns - * -1. - * - * This behavior changes when returnbestpos == 1. In this case, - * it will do the reverse. It will return -1 when it is found, noting - * that there is no good place to put this duplicate string. If it - * is not found, it returns the position where it ought to be - * placed. - * - * When case_sensitive == -1 and returnbestpos == 1, then when the string - * is found, it returns - * the position of the string so that one can overwrite it. Very strange - * special case behavior that I'm not sure if anyone actually uses. - * - * @param str The key string to search for. - * - * @param n_chars The number of characters to compare. Use -1 to match - * the entire string. - * - * @param case_sensitive 1 = case sensitive, 0 = case insensitive, - * -1 is a special case where it is case sensitive and overrides the - * returnbestpos behavior when the string is found. - * - * @param returnbestpos If 1, then look for the best position to add the - * string. If found in the list, return -1. - * - * @param where When str is found, returns the position of the string. - * - * @return The position of T where T.name == str. If returnbestpos != 0 - * then return the best position to add T if not found, otherwise, -1. - */ + /** + * This function looks for the string str, in T.name in the buffer m_gr. + * If it finds it, it returns the position found. Otherwise, it returns + * -1. + * + * This behavior changes when returnbestpos == 1. In this case, + * it will do the reverse. It will return -1 when it is found, noting + * that there is no good place to put this duplicate string. If it + * is not found, it returns the position where it ought to be + * placed. + * + * When case_sensitive == -1 and returnbestpos == 1, then when the string + * is found, it returns + * the position of the string so that one can overwrite it. Very strange + * special case behavior that I'm not sure if anyone actually uses. + * + * @param str The key string to search for. + * + * @param n_chars The number of characters to compare. Use -1 to match + * the entire string. + * + * @param case_sensitive 1 = case sensitive, 0 = case insensitive, + * -1 is a special case where it is case sensitive and overrides the + * returnbestpos behavior when the string is found. + * + * @param returnbestpos If 1, then look for the best position to add the + * string. If found in the list, return -1. + * + * @param where When str is found, returns the position of the string. + * + * @return The position of T where T.name == str. If returnbestpos != 0 + * then return the best position to add T if not found, otherwise, -1. + */ int find ( - const TCHAR* str, /* key to search for */ - int n_chars=-1, /* if -1, test the entire string, otherwise just n characters */ - int case_sensitive=0, - int returnbestpos=0, /* if not found, return best pos */ - int* where=0 /* */ + const TCHAR* str, /* key to search for */ + int n_chars=-1, /* if -1, test the entire string, otherwise just n characters */ + int case_sensitive=0, + int returnbestpos=0, /* if not found, return best pos */ + int*where=0 ) { T *data=(T *) m_gr.get(); @@ -389,7 +389,7 @@ class SortedStringListND // no delete - can be placed in GrowBuf int ll = 0; int nextpos = (ul+ll)/2; - // Do binary search on m_gr which is sorted. m_strings is NOT sorted. + // Do binary search on m_gr which is sorted. m_strings is NOT sorted. while (ul > ll) { int res; @@ -436,9 +436,8 @@ class SortedStringListND // no delete - can be placed in GrowBuf } protected: - TinyGrowBuf m_gr; // Sorted array of Ts - GrowBuf m_strings; // Unsorted array of TCHAR strings - // (contains the .names) + TinyGrowBuf m_gr; // Sorted array of Ts + GrowBuf m_strings; // Unsorted array of TCHAR strings (contains the .names) }; /** diff --git a/Source/tchar.h b/Source/tchar.h index 09331ec8..74fe212a 100644 --- a/Source/tchar.h +++ b/Source/tchar.h @@ -31,7 +31,7 @@ typedef unsigned short TCHAR, _TUCHAR; // MSVC typedefs TCHAR inside #ifndef _TCHAR_DEFINED // and _TCHAR and _T*CHAR inside #ifndef __TCHAR_DEFINED. // We don't want to break MSVCs _TSCHAR and _TXCHAR so we don't protect our typedef... -#if (_MSC_VER>1 && (_MSC_VER<1400 || !defined(_NATIVE_WCHAR_T_DEFINED))) || !defined(_WCHAR_T_DEFINED) +#if defined(_WIN32) && ((_MSC_VER>1 && (_MSC_VER<1400 || !defined(_NATIVE_WCHAR_T_DEFINED))) || !defined(_WCHAR_T_DEFINED)) // VC6 knows about __wchar_t but does not support it. /Zc:wchar_t is on by default starting with VC8. // VC7.1 supports __wchar_t but using it causes problems with conversions from WCHAR (unsigned short)? typedef unsigned short TCHAR, _TUCHAR; @@ -98,7 +98,7 @@ typedef wchar_t TCHAR, _TUCHAR; #define _tcstoi64 _wcstoi64 #define _tcstol wcstol #define _tcstoul wcstoul -#if defined(_MSC_VER) && (_MSC_VER<=1200) +#if !defined(_WIN32) || (defined(_MSC_VER) && (_MSC_VER<=1200)) # define _tstof my_wtof #else # define _tstof _wtof @@ -120,6 +120,7 @@ typedef wchar_t TCHAR, _TUCHAR; #define _topen _wopen #define _tremove _wremove #define _tunlink _wunlink +#define _tstat _wstat // reading and writing to i/o #define _fgettc fgetwc @@ -216,6 +217,7 @@ typedef unsigned char _TUCHAR; #define _topen _open #define _tremove remove #define _tunlink _unlink +#define _tstat stat // _stat on Windows? // reading and writing to i/o #define _fgettc fgetc diff --git a/Source/tokens.cpp b/Source/tokens.cpp index 08fbbc9a..67ca39d0 100644 --- a/Source/tokens.cpp +++ b/Source/tokens.cpp @@ -315,13 +315,13 @@ void CEXEBuild::print_help(const TCHAR *commandname) { if (!commandname || !_tcsicmp(tokenlist[x].name,commandname)) { - ERROR_MSG(_T("%s%s %s\n"),commandname?_T("Usage: "):_T(""),tokenlist[x].name,tokenlist[x].usage_str); + ERROR_MSG(_T("%") NPRIs _T("%") NPRIs _T(" %") NPRIs _T("\n"),commandname?_T("Usage: "):_T(""),tokenlist[x].name,tokenlist[x].usage_str); if (commandname) break; } } if (x == TOK__LAST && commandname) { - ERROR_MSG(_T("Invalid command \"%s\"\n"),commandname); + ERROR_MSG(_T("Invalid command \"%") NPRIs _T("\"\n"),commandname); } } @@ -381,17 +381,17 @@ int CEXEBuild::IsTokenPlacedRight(int pos, TCHAR *tok) else { TCHAR err[1024]; if (cp == TP_SEC) { - _tcscpy(err, _T("Error: command %s not valid in Section\n")); + _tcscpy(err, _T("Error: command %") NPRIs _T(" not valid in Section\n")); } else if (cp == TP_FUNC) { - _tcscpy(err, _T("Error: command %s not valid in Function\n")); + _tcscpy(err, _T("Error: command %") NPRIs _T(" not valid in Function\n")); } else if (cp == TP_PAGEEX) { - _tcscpy(err, _T("Error: command %s not valid in PageEx\n")); + _tcscpy(err, _T("Error: command %") NPRIs _T(" not valid in PageEx\n")); } else { - _tcscpy(err, _T("Error: command %s not valid outside ")); + _tcscpy(err, _T("Error: command %") NPRIs _T(" not valid outside ")); if (tp & TP_SEC) _tcscat(err, _T("Section")); if (tp & TP_FUNC) diff --git a/Source/tstring.cpp b/Source/tstring.cpp index 78a14c48..ffdf597b 100644 --- a/Source/tstring.cpp +++ b/Source/tstring.cpp @@ -19,51 +19,41 @@ #include #include - -CtoTString::CtoTString(const char* str) +void CtoTString::Init(const char* str, UINT cp) { - int len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0); - m_wStr = (wchar_t*) malloc(len*sizeof(wchar_t)); - MultiByteToWideChar(CP_ACP, 0, str, -1, m_wStr, len); +#if defined(_UNICODE) && !defined(_WIN32) + if (CP_ACP == cp) + { + m_wStr = NSISRT_mbtowc(str); // Should be faster than iconv + return ; + } +#endif + int len = MultiByteToWideChar(cp, 0, str, -1, NULL, 0); + m_wStr = (wchar_t*) malloc(len*sizeof(wchar_t)); + if (m_wStr) MultiByteToWideChar(cp, 0, str, -1, m_wStr, len); } -CtoTString::CtoTString(const char* str, UINT cp) +void CtoTString::Init(const char* str) { - int len = MultiByteToWideChar(cp, 0, str, -1, NULL, 0); - m_wStr = (wchar_t*) malloc(len*sizeof(wchar_t)); - MultiByteToWideChar(cp, 0, str, -1, m_wStr, len); -} - -CtoTString::CtoTString(const std::string& str) -{ - int len = MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.length()+1, NULL, 0); - m_wStr = (wchar_t*) malloc(len*sizeof(wchar_t)); - MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.length()+1, m_wStr, len); + Init(str, CP_ACP); } CtoTString::~CtoTString() { free(m_wStr); m_wStr = 0; } -CtoTString::operator const wchar_t*() const { return GetTStr(); } -inline const wchar_t* CtoTString::GetTStr() const { return m_wStr; } - -TtoCString::TtoCString(const wchar_t* wStr) +void TtoCString::Init(const wchar_t* str) { - int len = WideCharToMultiByte(CP_ACP, 0, wStr, -1, NULL, 0, 0, 0); - m_cStr = (char*) malloc(len); - WideCharToMultiByte(CP_ACP, 0, wStr, -1, m_cStr, len, 0, 0); -} - -TtoCString::TtoCString(const tstring& wStr) -{ - int len = WideCharToMultiByte(CP_ACP, 0, wStr.c_str(), wStr.length()+1, NULL, 0, 0, 0); - m_cStr = (char*) malloc(len); - WideCharToMultiByte(CP_ACP, 0, wStr.c_str(), wStr.length()+1, m_cStr, len, 0, 0); +#if defined(_UNICODE) && !defined(_WIN32) + m_cStr = NSISRT_wctomb(str); // Should be faster than iconv + return ; +#endif + int len = WideCharToMultiByte(CP_ACP, 0, str, -1, NULL, 0, 0, 0); + m_cStr = (char*) malloc(len); + if (m_cStr) WideCharToMultiByte(CP_ACP, 0, str, -1, m_cStr, len, 0, 0); } TtoCString::~TtoCString() { free(m_cStr); m_cStr = 0; } -TtoCString::operator const char*() const { return m_cStr; } #endif diff --git a/Source/tstring.h b/Source/tstring.h index a3530d04..8bc4c497 100644 --- a/Source/tstring.h +++ b/Source/tstring.h @@ -46,18 +46,20 @@ typedef std::ifstream tifstream; // This is a helpful little function for converting exceptions or // other system type things that come back ANSI and must be -// utilized as either ANSI or WCHAR depending on _UNICODE. +// utilized as either ANSI or wchar_t depending on _UNICODE. class CtoTString { + void Init(const char* str, UINT cp); + void Init(const char* str); public: - CtoTString(const char* str); - CtoTString(const char* str, UINT cp); - CtoTString(const std::string& str); + CtoTString(const char* str) { Init(str); } + CtoTString(const char* str, UINT cp) { Init(str, cp); } + CtoTString(const std::string& str) { Init(str.c_str()); } ~CtoTString(); - operator const wchar_t*() const; - inline const wchar_t*GetTStr() const; + operator const wchar_t*() const { return m_wStr; } + inline const wchar_t*GetTStr() const { return m_wStr; } private: wchar_t* m_wStr; @@ -67,17 +69,21 @@ private: // may actually have Unicode strings. class TtoCString { + void Init(const wchar_t* str); public: - TtoCString(const wchar_t* wStr); - TtoCString(const tstring& wStr); + TtoCString(const wchar_t* wStr) { Init(wStr); } + TtoCString(const tstring& wStr) { Init(wStr.c_str()); } ~TtoCString(); - operator const char*() const; + operator const char*() const { return m_cStr; }; private: char* m_cStr; }; #endif // _UNICODE +#define PosixBug_CtoTString CtoTString +#define PosixBug_TtoCString TtoCString + #endif // NSIS_TSTRING___H__ diff --git a/Source/utf.cpp b/Source/utf.cpp index 20a7a2bc..dc141f45 100644 --- a/Source/utf.cpp +++ b/Source/utf.cpp @@ -20,13 +20,6 @@ #define FIX_ENDIAN_INT16LETOHOST_INPLACE FIX_ENDIAN_INT16_INPLACE -void RawTStrToASCII(const TCHAR*in,char*out,UINT maxcch) -{ - const bool empty = !maxcch; - for(; maxcch && *in; --maxcch) *out++ = (char) *in++; - if (!empty) *out = 0; -} - UINT StrLenUTF16(const void*str) { unsigned short *p = (unsigned short *) str; @@ -85,9 +78,9 @@ UINT WCFromCodePoint(wchar_t*Dest,UINT cchDest,UINT32 CodPt) return 0; #else iconvdescriptor iconvd; - if (!iconvd.Open("wchar_t",iconvd::GetHostEndianUCS4Code())) return 0; + if (!iconvd.Open("wchar_t",iconvdescriptor::GetHostEndianUCS4Code())) return 0; size_t inleft = 4; - UINT cchW = iconvd.Convert(&codpt,&inleft,Dest,cchDest*sizeof(wchar_t)) / sizeof(wchar_t); + UINT cchW = iconvd.Convert(&CodPt,&inleft,Dest,cchDest*sizeof(wchar_t)) / sizeof(wchar_t); return !inleft ? cchW : 0; #endif } @@ -110,7 +103,7 @@ BOOL CharEncConv::IsValidCodePage(UINT cp) #ifdef _WIN32 if (cp <= 1 || NStreamEncoding::IsUnicodeCodepage(cp)) return true; // Allow ACP/OEM/UTF* #endif - return cp < (WORD)-1 && ::IsValidCodePage(cp); + return cp < NStreamEncoding::CPCOUNT && ::IsValidCodePage(cp); } bool CharEncConv::Initialize(UINT32 ToEnc, UINT32 FromEnc) { @@ -123,7 +116,7 @@ bool CharEncConv::Initialize(UINT32 ToEnc, UINT32 FromEnc) if (NStreamEncoding::UTF16LE == FromEnc) FromEnc = -1; #endif m_TE = (WORD) ToEnc, m_FE = (WORD) FromEnc; - if ((UTF32LE|1) == (m_FE|1) || (UTF32LE|1) == (m_TE|1)) return false; // UTF32 is a pain to deal with on Windows + if ((UTF32LE|1) == (m_FE|1) || (UTF32LE|1) == (m_TE|1)) return false; // UTF-32 is a pain to deal with on Windows #ifdef _WIN32 return (IsWE(m_FE) || IsValidCodePage(FromEnc)) && (IsWE(m_TE) || IsValidCodePage(ToEnc)); #else @@ -154,7 +147,9 @@ void* CharEncConv::Convert(const void*Src, size_t cbSrc, size_t*cbOut) ** Returns a pointer to the buffer on success or 0 on error. ** The buffer is valid until you call Close() or Convert(). */ +#ifdef _WIN32 m_OptimizedReturn = false; +#endif if ((size_t)-1 == cbSrc) { UINT cus = IsWE(m_FE) ? sizeof(wchar_t) : NStreamEncoding::GetCodeUnitSize(m_FE); @@ -162,7 +157,7 @@ void* CharEncConv::Convert(const void*Src, size_t cbSrc, size_t*cbOut) { case 1: cbSrc = strlen((char*)Src); break; case 2: cbSrc = StrLenUTF16(Src); break; - //case 4: // No UTF32 support... + //case 4: // No UTF-32 support... default: if (sizeof(wchar_t) > 2 && sizeof(wchar_t) == cus) { @@ -212,10 +207,10 @@ void* CharEncConv::Convert(const void*Src, size_t cbSrc, size_t*cbOut) { if (NStreamEncoding::UTF16BE == m_TE) goto l_swapUTF16; cbSrc /= sizeof(wchar_t); - UINT cbDest = WideCharToMultiByte(m_TE, 0, (LPWSTR)Src, cbSrc, 0, 0, 0, 0); + UINT cbDest = WideCharToMultiByte(m_TE, 0, (wchar_t*)Src, cbSrc, 0, 0, 0, 0); char *p = (char*) realloc(m_Result, (cbDest + 1) * sizeof(char)); if (p) m_Result = p; else return 0; - if (!(cbDest = WideCharToMultiByte(m_TE, 0, (LPWSTR)Src, cbSrc, p, cbDest, 0, 0))) return 0; + if (!(cbDest = WideCharToMultiByte(m_TE, 0, (wchar_t*)Src, cbSrc, p, cbDest, 0, 0))) return 0; if (p[--cbDest]) p[++cbDest] = '\0'; // Always \0 terminate if (cbOut) *cbOut = cbDest; // cbOut never includes the \0 terminator } @@ -253,12 +248,12 @@ l_swapUTF16: } #if !defined(_WIN32) || !defined(_UNICODE) -bool WCToUTF16LEHlpr::Create(const TCHAR*in) +bool WCToUTF16LEHlpr::Create(const TCHAR*in, unsigned int codepage) { CharEncConv cec; if (!cec.Initialize(NStreamEncoding::UTF16LE, -1)) return false; if (!cec.Convert(in)) return false; - m_s = cec.Detach(); + m_s = (unsigned short*) cec.Detach(); return true; } #endif @@ -399,7 +394,7 @@ bool NOStream::WriteString(const wchar_t*Str, size_t cch /*= -1*/) CharEncConv cec; if (!cec.Initialize(m_Enc.GetCodepage(), -1)) return false; cec.SetAllowOptimizedReturn(true); - if ((unsigned)-1 != cch) cch *= sizeof(wchar_t); // cec.Convert wants byte count + if ((size_t)-1 != cch) cch *= sizeof(wchar_t); // cec.Convert wants byte count size_t cbConv; char *p = (char*) cec.Convert(Str, cch, &cbConv); return p && WriteOctets(p, cbConv); @@ -453,7 +448,7 @@ tstring NStreamLineReader::GetErrorMessage(UINT Error, const TCHAR*Filename, UIN if (Filename) { const TCHAR *filelinesep = *Filename ? _T(":") : _T(""); - _stprintf(buf,_T("%s%u"),filelinesep,Line); + _stprintf(buf,_T("%") NPRIs _T("%u"),filelinesep,Line); msg = msg + _T(": ") + Filename + buf; } return msg + _T("\n"); @@ -478,7 +473,6 @@ UINT NStreamLineReader::ReadLine(wchar_t*Buffer, UINT cchBuf) #endif l_restart: - // Only supports MBCS and UTF-8 for now... if (StreamEncoding().IsUTF8()) { for(;;) @@ -518,7 +512,7 @@ l_restart: else if (StreamEncoding().IsUTF16()) { #ifndef _WIN32 - if (!iconvd.Open("wchar_t", iconvd::GetHostEndianUCS4Code())) goto ERR_UNSUPPORTEDENCODING; + if (!iconvd.Open("wchar_t", iconvdescriptor::GetHostEndianUCS4Code())) goto l_unsupportedencoding; #endif const bool utf16be = StreamEncoding().IsUTF16BE(); unsigned short lead, trail, cchWC; @@ -557,7 +551,7 @@ l_restart: } else if (StreamEncoding().IsUnicode()) { - goto l_unsupportedencoding; + goto l_unsupportedencoding; } else { diff --git a/Source/utf.h b/Source/utf.h index b5d7a68d..3c5a34ea 100644 --- a/Source/utf.h +++ b/Source/utf.h @@ -77,6 +77,7 @@ inline bool UTF8_GetTrailCount(unsigned char chFirst, unsigned char &cb) #include #include #include "tstring.h" +#include "util.h" // iconvdescriptor & my_fopen #ifdef _WIN32 #include // For _setmode #include // For _O_BINARY @@ -84,8 +85,6 @@ inline bool UTF8_GetTrailCount(unsigned char chFirst, unsigned char &cb) FILE* my_fopen(const TCHAR *path, const char *mode); // from util.h -void RawTStrToASCII(const TCHAR*in,char*out,UINT maxcch); - void UTF16InplaceEndianSwap(void*Buffer, UINT cch); UINT StrLenUTF16(const void*str); bool StrSetUTF16LE(tstring&dest, const void*src); @@ -141,7 +140,7 @@ class WCToUTF16LEHlpr { public: WCToUTF16LEHlpr() : m_s(0) {} - bool Create(const TCHAR*in) + bool Create(const TCHAR*in, unsigned int codepage = CP_ACP) #if !defined(_WIN32) || !defined(_UNICODE) ; #else @@ -159,6 +158,8 @@ public: const unsigned short* Get() const { return m_s; } UINT GetLen() const { return StrLenUTF16(m_s); } UINT GetSize() const { return (GetLen()+1) * 2; } + unsigned short* Detach() { unsigned short *r = m_s; m_s = 0; return r; } + void CopyTo(unsigned short*Dest) const { memcpy(Dest, Get(), GetSize()); } }; class NStreamEncoding { diff --git a/Source/util.cpp b/Source/util.cpp index b22b5f92..c29f3b98 100644 --- a/Source/util.cpp +++ b/Source/util.cpp @@ -34,6 +34,11 @@ # include // for open(2) # include # include +# include +# include +# ifdef _UNICODE +# include +# endif #endif #ifdef __APPLE__ @@ -88,70 +93,73 @@ unsigned int my_strncpy(TCHAR*Dest, const TCHAR*Src, unsigned int cchMax) int update_bitmap(CResourceEditor* re, WORD id, const TCHAR* filename, int width/*=0*/, int height/*=0*/, int maxbpp/*=0*/) { FILE *f = FOPEN(filename, ("rb")); if (!f) return -1; - if (fgetc(f) != 'B' || fgetc(f) != 'M') { fclose(f); return -2; } - if (width != 0) { INT32 biWidth; fseek(f, 18, SEEK_SET); // Seek to the width member of the header - fread(&biWidth, sizeof(INT32), 1, f); + size_t nio = fread(&biWidth, sizeof(INT32), 1, f); FIX_ENDIAN_INT32_INPLACE(biWidth); - if (width != biWidth) { + if (nio != 1 || width != biWidth) { fclose(f); return -3; } } - if (height != 0) { INT32 biHeight; fseek(f, 22, SEEK_SET); // Seek to the height member of the header - fread(&biHeight, sizeof(INT32), 1, f); + size_t nio = fread(&biHeight, sizeof(INT32), 1, f); FIX_ENDIAN_INT32_INPLACE(biHeight); // Bitmap height can be negative too... - if (height != abs(biHeight)) { + if (nio != 1 || height != abs(biHeight)) { fclose(f); return -3; } } - if (maxbpp != 0) { WORD biBitCount; fseek(f, 28, SEEK_SET); // Seek to the height member of the header - fread(&biBitCount, sizeof(WORD), 1, f); + size_t nio = fread(&biBitCount, sizeof(WORD), 1, f); FIX_ENDIAN_INT16_INPLACE(biBitCount); - if (biBitCount > maxbpp) { + if (nio != 1 || biBitCount > maxbpp) { fclose(f); return -4; } } - DWORD dwSize; fseek(f, 2, SEEK_SET); - fread(&dwSize, sizeof(DWORD), 1, f); + size_t nio = fread(&dwSize, sizeof(DWORD), 1, f); + if (nio != 1) { + fclose(f); + return -3; + } FIX_ENDIAN_INT32_INPLACE(dwSize); dwSize -= 14; - unsigned char* bitmap = (unsigned char*)malloc(dwSize); if (!bitmap) { fclose(f); throw bad_alloc(); } - bool gotbmdata = !fseek(f, 14, SEEK_SET) && dwSize == fread(bitmap, 1, dwSize, f); int retval = gotbmdata ? 0 : -2; fclose(f); - if (gotbmdata) re->UpdateResource(RT_BITMAP, id, NSIS_DEFAULT_LANG, bitmap, dwSize); - free(bitmap); return retval; } #ifndef _WIN32 +void PathConvertWinToPosix(char*p); + +BOOL IsDBCSLeadByteEx(unsigned int CodePage, unsigned char TestChar) +{ + if (CP_UTF8 == CodePage) return false; //blogs.msdn.com/b/michkap/archive/2007/04/19/2190207.aspx + const char buf[] = {(char)TestChar, 'a', 'b', '\0'}; // Untested and probably not the best way to do this! + return CharNextExA(CodePage, buf, 0) > &buf[1]; +} TCHAR *CharPrev(const TCHAR *s, const TCHAR *p) { if (!s || !p || p < s) return NULL; @@ -171,36 +179,259 @@ char *CharNextA(const char *s) { return (char *) s + l; } -WCHAR *CharNextW(const WCHAR *s) { - // BUGBUG: Is this the best we can do? - return s + 1; +wchar_t *CharNextW(const wchar_t *s) { + if (sizeof(*s)==2 && IsLeadSurrogateUTF16(*s)) (wchar_t*) ++s; //BUGBUG: This assumes that 16bit wchar_t == UTF16 + // else if(...) BUGBUG: Is this the best we can do? What about combining characters/diacritics etc? + return (wchar_t*) s + 1; } char *CharNextExA(WORD codepage, const char *s, int flags) { - char buf[30]; - snprintf(buf, 30, "CP%d", codepage); - const char* orglocct = setlocale(LC_CTYPE, buf); - - const char* np; + // blogs.msdn.com/b/michkap/archive/2007/04/19/2190207.aspx implies that + // CharNextExA uses IsDBCSLeadByteEx, should we do the same? + const char* orglocct = NSISRT_setlocale_wincp(LC_CTYPE, codepage), *np; int len = mblen(s, strlen(s)); - if (len > 0) - np = s + len; - else - np = s + 1; - + if (len > 0) np = s + len; else np = s + 1; setlocale(LC_CTYPE, orglocct); - return (char *) np; } int wsprintf(TCHAR *s, const TCHAR *format, ...) { va_list val; va_start(val, format); - int res = _vsntprintf(s, 1024, format, val); + int res = _vsntprintf(s, 1024+1, format, val); + if (res >= 0) s[res] = _T('\0'); va_end(val); return res; } +static char g_nrt_iconv_narrowlocbuf[50], *g_nrt_iconv_narrowloc; +#define setlocale_ACP(cat) setlocale((cat), "") +#define iconv_ACP g_nrt_iconv_narrowloc +#define setlocale_OEM(cat) NSISRT_setlocale_wincp((cat), 1252) +#define iconv_OEM "CP1252" + +#ifdef HAVE_LANGINFO_H // BUGBUG: scons needs to check for HAVE_LANGINFO_H and HAVE_NL_LANGINFO support? +#include +#endif +bool NSISRT_Initialize() +{ + iconvdescriptor id; + g_nrt_iconv_narrowloc = const_cast(""); // Use "" and not "char", "char" is a GNU extension? + if (!id.Open("wchar_t", g_nrt_iconv_narrowloc)) + { + unsigned int cchmax = COUNTOF(g_nrt_iconv_narrowlocbuf); + const char *tmp = ""; +#ifdef HAVE_NL_LANGINFO + tmp = nl_langinfo(CODESET); // TODO: Use libcharset or locale_charset if possible + if (strlen(tmp) >= cchmax) tmp = ""; +#endif + strcpy(g_nrt_iconv_narrowloc = g_nrt_iconv_narrowlocbuf, tmp); + if (!id.Open("wchar_t", g_nrt_iconv_narrowloc)) + { + // Unable to determine the iconv narrow string code, UTF-8 is the best we can do + create_code_page_string(g_nrt_iconv_narrowloc, cchmax, CP_UTF8); + } + } + return !!nsis_iconv_get_host_endian_ucs4_code(); +} + +const char* NSISRT_setlocale_wincp(int cat, unsigned int cp) +{ + if (cp <= 1) return CP_ACP == cp ? setlocale_ACP(cat) : setlocale_OEM(cat); + char buf[40]; + const char *p, *p1 = 0, *p2 = 0; + sprintf(buf, ".CP%u", cp); + p = setlocale(cat, &buf[1]); // "CP%u" + if (!p) p = setlocale(cat, buf); // ".CP%u" this is the format used by MSVCRT? + if (!p) + { + switch(cp) // This list is probably incomplete + { + case 932: p1 = "SJIS"; break; // Not an exact match but CP932 already failed, this is the best we can do + case 936: p1 = "EUCCN", p2 = "euc-CN"; break; + case 949: p1 = "EUCKR", p2 = "euc-KR"; break; + case 950: p1 = "Big5"; break; + case 20866: p1 = "KOI8-R"; break; + case 20932: p1 = "EUCJP", p2 = "euc-JP"; break; + case 65001: p1 = "UTF-8", p2 = "utf8"; break; + default: + if (cp >= 28591 && cp <= 28599) sprintf(buf, "ISO-8859-%u", cp - 28590), p1 = buf; + if (cp == 28603 || cp == 28605) sprintf(buf, "ISO-8859-%u", (cp - 28600) + 10), p1 = buf; + } + if (!(p = setlocale(cat, p1))) p = setlocale(cat, p2); + } + return p; +} + +wchar_t* NSISRT_mbtowc(const char *Str) +{ + const char *orglocct = setlocale(LC_CTYPE, ""); + wchar_t *d = 0; + const char *s = Str; + size_t cch = mbsrtowcs(0, &s, 0, 0); + if ((size_t)-1 != cch && (d = (wchar_t*) malloc(++cch * sizeof(wchar_t)))) + { + cch = mbsrtowcs(d, &Str, cch, 0); + if ((size_t) -1 == cch) { NSISRT_free(d); d = 0; } + } + if (!errno) errno = ENOMEM; + setlocale(LC_CTYPE, orglocct); + return d; +} +char* NSISRT_wctomb(const wchar_t *Str) +{ + const char *orglocct = setlocale(LC_CTYPE, ""); + char *d = 0; + const wchar_t *s = Str; + errno = 0; + size_t cb = wcsrtombs(0, &s, 0, 0); + if ((size_t) -1 != cb && (d = (char*) malloc(++cb))) + { + cb = wcsrtombs(d, &Str, cb, 0); + if ((size_t) -1 == cb) { NSISRT_free(d); d = 0; } + } + if (!errno) errno = ENOMEM; + setlocale(LC_CTYPE, orglocct); + return d; +} +char* NSISRT_wctombpath(const wchar_t *Path) +{ + char *p = NSISRT_wctomb(Path); + if (p) PathConvertWinToPosix(p); + return p; +} +char* NSISRT_ttombpath(const TCHAR *Path) +{ +#ifdef _UNICODE + return NSISRT_wctombpath(Path); +#else + char *p = _tcsdup(Path); + if (p) PathConvertWinToPosix(p); else errno = ENOMEM; + return p; +#endif +} + +#include +int _wcsnicmp(const wchar_t *a, const wchar_t *b, size_t n) +{ + // Note: Behavior depends on the LC_CTYPE category of the current locale. +#if _XOPEN_SOURCE >= 700 || _POSIX_C_SOURCE >= 200809L + return wcsncasecmp(a, b, n); +#else + int diff = 0; + for ( ; n--; ++a, ++b ) + if ((diff = (int) towlower(*a) - (int) towlower(*b)) || !*a) break; + return diff; +#endif +} +int _wcsicmp(const wchar_t *a, const wchar_t *b) +{ + return _wcsnicmp(a, b, (size_t)-1); +} + +long _wtol(const wchar_t *s) { return wcstol(s, 0, 10); } +int _wtoi(const wchar_t *s) +{ + errno = 0; + long int r = _wtol(s); + if (errno) r = 0; + if (LONG_MIN == r) r = INT_MIN; + if (LONG_MAX == r) r = INT_MAX; + return (int) r; +} + +int _swprintf(wchar_t *d, const wchar_t *f, ...) +{ + va_list val; + va_start(val, f); + int res = _vsnwprintf(d, INT_MAX / sizeof(*d), f, val); + va_end(val); + return res; +} + +wchar_t* _wcsdup(const wchar_t *s) +{ + wchar_t *d = (wchar_t*) malloc((wcslen(s)+1) * sizeof(wchar_t)); + if (d) wcscpy(d, s); + return d; +} + +wchar_t* _wgetenv(const wchar_t *wname) +{ + mbstate_t mbs; + memset(&mbs,0,sizeof(mbs)); + char *nval, *nval2, nname[200]; // Hopefully this is enough + size_t cbnn = wcsrtombs(nname, &wname, sizeof(nname), &mbs); + if ((size_t)-1 == cbnn || !(nval = getenv(nname))) return NULL; + static wchar_t *g_wval = 0; // Not thread safe! + for ( unsigned int cch = 200;; cch *= 2 ) + { + if (!(g_wval = (wchar_t*) realloc(g_wval, cch * sizeof(wchar_t)))) break; + nval2 = nval; + memset(&mbs,0,sizeof(mbs)); + size_t cchwv = mbsrtowcs(g_wval, const_cast(&nval2), cch, &mbs); + if ((size_t)-1 == cchwv) return NULL; + if (!nval2) return g_wval; + } + errno = ENOMEM; + return 0; +} + +int _wremove(const wchar_t *Path) +{ + const char *path = NSISRT_wctomb(Path); // Caller should have converted to POSIX path + if (!path) return -1; + const int retval = remove(path); + NSISRT_free(path); + return retval; +} + +int _wchdir(const wchar_t *Path) +{ + const char *path = NSISRT_wctomb(Path); // Caller should have converted to POSIX path + if (!path) return -1; + const int retval = chdir(path); + NSISRT_free(path); + return retval; +} + +#include +#include +int _wstat(const wchar_t *Path, struct stat *pS) +{ + const char *path = NSISRT_wctomb(Path); // Caller should have converted to POSIX path + if (!path) return -1; + const int retval = stat(path, pS); + NSISRT_free(path); + return retval; +} + +static int NSISRT_wsystem(const wchar_t *wcmd) +{ + if (!wcmd) return system(NULL); + // NOTE: Only the first drive in the path will be converted to posix style (c:\foo d:\bar > /c/foo d:/bar) + const char *cmd = NSISRT_wctombpath(wcmd); + if (!cmd) return -1; + const int retval = system(cmd); + NSISRT_free(cmd); + return retval; +} + +const char* nsis_iconv_get_host_endian_ucs4_code() +{ + static const char* ucs4 = 0; + if (!ucs4) + { + iconvdescriptor id; +#define NRT_TMP_IGHEUC(s) if (id.Open("wchar_t", (s))) return ucs4 = (s) + NRT_TMP_IGHEUC("UCS-4-INTERNAL"); + NRT_TMP_IGHEUC(Platform_IsBigEndian() ? "UCS-4BE" : "UCS-4LE"); + NRT_TMP_IGHEUC(Platform_IsBigEndian() ? "UTF-32BE" : "UTF-32LE"); +#undef NRT_TMP_IGHEUC + } + return ucs4; +} + bool nsis_iconv_reallociconv(iconv_t CD, char**In, size_t*cbInLeft, char**Mem, size_t&cbConverted) { char *in, *heap = *Mem; @@ -225,50 +456,44 @@ bool nsis_iconv_reallociconv(iconv_t CD, char**In, size_t*cbInLeft, char**Mem, s return false; } -void static create_code_page_string(TCHAR *buf, size_t len, UINT code_page) { +const unsigned short CODEPAGESTR_MAXLEN = 50; // Should be plenty +void create_code_page_string(TCHAR *buf, size_t len, UINT code_page) +{ switch(code_page) { - case CP_ACP: - case 1: // OEMCP - code_page = 1252; - break; - case CP_UTF8: - _sntprintf(buf, len, _T("UTF-8")); - return; + case CP_ACP: _sntprintf(buf, len, _T("%") NPRINs, iconv_ACP); return; + case CP_OEMCP: _sntprintf(buf, len, _T("%") NPRINs, iconv_OEM); return; + case CP_UTF8: _sntprintf(buf, len, _T("UTF-8")); return; case 1200: // UTF16LE case 1201: // UTF16BE - _sntprintf(buf, len, _T("UTF-16%cE"), 1200==code_page ? _T('L') : _T('B')); + _sntprintf(buf, len, _T("UTF-16%cE"), 1200 == code_page ? 'L' : 'B'); return; } _sntprintf(buf, len, _T("CP%d"), code_page); } +#ifdef _UNICODE +void create_code_page_string(char*buf, size_t len, UINT code_page) +{ + TCHAR t[CODEPAGESTR_MAXLEN]; + create_code_page_string(t, COUNTOF(t), code_page); + RawTStrToASCII(t, buf, len); +} +#endif -int WideCharToMultiByte(UINT CodePage, DWORD dwFlags, LPCWSTR lpWideCharStr, +int WideCharToMultiByte(UINT CodePage, DWORD dwFlags, const wchar_t* lpWideCharStr, int cchWideChar, LPSTR lpMultiByteStr, int cbMultiByte, LPCSTR lpDefaultChar, LPBOOL lpUsedDefaultChar) { static char buffer[4096]; // BUGBUG: Should this be 4*NSIS_MAX_STRLEN for large string build? - char cp[128]; - create_code_page_string(cp, sizeof(cp), CodePage); - + char cp[CODEPAGESTR_MAXLEN]; + create_code_page_string(cp, COUNTOF(cp), CodePage); iconv_t cd = iconv_open(cp, "wchar_t"); - if (cd == (iconv_t) -1) { - return 0; - } + if (cd == (iconv_t) -1) return 0; + if (cchWideChar < 0) cchWideChar = (int) wcslen(lpWideCharStr) + 1; + if (cbMultiByte == 0) cbMultiByte = sizeof(buffer), lpMultiByteStr = buffer; - if (cchWideChar < 0) { - cchWideChar = (int) _wcslen(lpWideCharStr) + 1; - } - - if (cbMultiByte == 0) { - cbMultiByte = sizeof(buffer); - lpMultiByteStr = buffer; - } - - char *in = (char *) lpWideCharStr; - char *out = lpMultiByteStr; - size_t inbytes = cchWideChar * sizeof(WCHAR); - size_t outbytes = cbMultiByte; + char *in = (char *) lpWideCharStr, *out = lpMultiByteStr; + size_t inbytes = cchWideChar * sizeof(wchar_t), outbytes = cbMultiByte; if (nsis_iconv_adaptor(iconv, cd, &in, &inbytes, &out, &outbytes) == (size_t) -1) { iconv_close(cd); @@ -276,35 +501,22 @@ int WideCharToMultiByte(UINT CodePage, DWORD dwFlags, LPCWSTR lpWideCharStr, } iconv_close(cd); - return cbMultiByte - outbytes; } int MultiByteToWideChar(UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, - int cbMultiByte, LPWSTR lpWideCharStr, int cchWideChar) { - static WCHAR buffer[4096]; // BUGBUG: Should this be 4*NSIS_MAX_STRLEN for large string build? - - char cp[128]; - create_code_page_string(cp, sizeof(cp), CodePage); + int cbMultiByte, wchar_t* lpWideCharStr, int cchWideChar) { + static wchar_t buffer[4096]; // BUGBUG: Should this be 4*NSIS_MAX_STRLEN for large string build? + char cp[CODEPAGESTR_MAXLEN]; + create_code_page_string(cp, COUNTOF(cp), CodePage); iconv_t cd = iconv_open("wchar_t", cp); - if (cd == (iconv_t) -1) { - return 0; - } + if (cd == (iconv_t) -1) return 0; + if (cbMultiByte < 0) cbMultiByte = strlen(lpMultiByteStr) + 1; + if (cchWideChar == 0) cchWideChar = sizeof(buffer), lpWideCharStr = buffer; - if (cbMultiByte < 0) { - cbMultiByte = strlen(lpMultiByteStr) + 1; - } - - if (cchWideChar == 0) { - cchWideChar = sizeof(buffer); - lpWideCharStr = buffer; - } - - char *in = (char *) lpMultiByteStr; - char *out = (char *) lpWideCharStr; - size_t inbytes = cbMultiByte; - size_t outbytes = cchWideChar * sizeof(WCHAR); + char *in = (char *) lpMultiByteStr, *out = (char *) lpWideCharStr; + size_t inbytes = cbMultiByte, outbytes = cchWideChar * sizeof(wchar_t); if (nsis_iconv_adaptor(iconv, cd, &in, &inbytes, &out, &outbytes) == (size_t) -1) { iconv_close(cd); @@ -312,21 +524,16 @@ int MultiByteToWideChar(UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, } iconv_close(cd); - - return cchWideChar - (outbytes / sizeof (WCHAR)); + return cchWideChar - (outbytes / sizeof (wchar_t)); } BOOL IsValidCodePage(UINT CodePage) { - TCHAR cp[128]; - create_code_page_string(cp, sizeof(cp), CodePage); - - iconv_t cd = iconv_open(_T("wchar_t"), cp); - if (cd == (iconv_t) -1) - return FALSE; - + char cp[CODEPAGESTR_MAXLEN]; + create_code_page_string(cp, COUNTOF(cp), CodePage); + iconv_t cd = iconv_open("wchar_t", cp); + if (cd == (iconv_t) -1) return FALSE; iconv_close(cd); - return TRUE; } @@ -335,43 +542,21 @@ void PathConvertWinToPosix(char*p) { if ('\"' == *p) ++p; // Skip opening quote if any (For !system) size_t len = strlen(p); - - /* Replace drive letter X: by /X */ - if (len >= 2 && ':' == p[1]) - { - p[1] = (char) tolower((int) p[0]); - p[0] = '/'; - } - - do - { - if ('\\' == *p) *p = '/'; - p = CharNextA(p); - } - while (*p); + /* Replace drive letter X: by /x */ + if (len >= 2 && ':' == p[1]) p[1] = (char) tolower((int) p[0]), p[0] = '/'; + do if ('\\' == *p) *p = '/'; while (*(p = CharNextA(p))); } #endif void PathConvertWinToPosix(TCHAR*p) { if (_T('\"') == *p) ++p; // Skip opening quote if any (For !system) size_t len = _tcsclen(p); - - /* Replace drive letter X: by /X */ - if (len >= 2 && _T(':') == p[1]) - { - p[1] = (TCHAR) tolower((int) p[0]); - p[0] = _T('/'); - } - - do - { - if (_T('\\') == *p) *p = _T('/'); - p = CharNext(p); - } - while (*p); + /* Replace drive letter X: by /x */ + if (len >= 2 && _T(':') == p[1]) p[1] = (TCHAR) tolower((int) p[0]), p[0] = _T('/'); + do if (_T('\\') == *p) *p = _T('/'); while (*(p = CharNext(p))); } -#define MY_ERROR_MSG(x) {if (g_display_errors) {PrintColorFmtMsg_ERR(_T("%s"), x);}} +#define MY_ERROR_MSG(x) {if (g_display_errors) {PrintColorFmtMsg_ERR(_T("%") NPRIs, x);}} TCHAR *my_convert(const TCHAR *path) { @@ -392,10 +577,14 @@ void my_convert_free(TCHAR *converted_path) int my_open(const TCHAR *pathname, int flags) { - TCHAR *converted_pathname = my_convert(pathname); - - int result = open(converted_pathname, flags); - my_convert_free(converted_pathname); +#ifndef _UNICODE + int result = open(pathname, flags); +#else + char *nativepath = NSISRT_ttombpath(pathname); + if (!nativepath) return -1; + int result = open(nativepath, flags); + NSISRT_free(nativepath); +#endif return result; } #endif//!_WIN32 @@ -411,98 +600,74 @@ FILE* my_fopen(const TCHAR *path, const char *mode) for (int i=0; ; ++i) if (0 == (tmode[i] = mode[i])) break; f = _wfopen(path, tmode); #else - const char* orglocct = setlocale(LC_CTYPE, ""); - const wchar_t* srcW = path; - size_t cb = wcsrtombs(0,&srcW,0,0); - if (-1 != cb) + char *nativepath = NSISRT_wctombpath(path); + if (nativepath) { - char* nativepath = (char*) malloc(++cb); - if (nativepath) - { - cb = wcsrtombs(nativepath,&path,cb,0); - if (-1 != cb) - { - PathConvertWinToPosix(nativepath); - f = fopen(nativepath, mode); - } - free(nativepath); - } + f = fopen(nativepath, mode); + NSISRT_free(nativepath); } - setlocale(LC_CTYPE, orglocct); #endif #endif return f; } - -void *operator new(size_t size) NSIS_CXX_THROWSPEC(bad_alloc) { - void *p = malloc(size); - if (!p) - throw bad_alloc(); - return p; -} - -void operator delete(void *p) throw() { - if (p) free(p); -} - -void operator delete [](void *p) throw() { - if (p) free(p); -} - size_t my_strftime(TCHAR *s, size_t max, const TCHAR *fmt, const struct tm *tm) { return _tcsftime(s, max, fmt, tm); } tstring get_full_path(const tstring &path) { #ifdef _WIN32 - TCHAR *throwaway; - TCHAR real_path[1024]; - int rc = GetFullPathName(path.c_str(),1024,real_path,&throwaway); + TCHAR real_path[1024], *fnpart; + DWORD rc = GetFullPathName(path.c_str(), COUNTOF(real_path), real_path, &fnpart); assert(rc <= 1024); // path size is limited by MAX_PATH (260) assert(rc != 0); // rc==0 in case of error return tstring(real_path); -#else//_WIN32 +#else // !_WIN32 + tstring result; + char *rpret = 0, *inputpath = NSISRT_ttombpath(path.c_str()); + if (!inputpath) return tstring(path); #ifdef PATH_MAX - static TCHAR buffer[PATH_MAX]; -#else//PATH_MAX - int path_max = pathconf(path.c_str(), _PC_PATH_MAX); - if (path_max <= 0) - path_max = 4096; - TCHAR *buffer = (TCHAR *) malloc(path_max*sizeof(TCHAR)); - if (!buffer) - return tstring(path); -#endif//PATH_MAX - if (!realpath(path.c_str(), buffer)) - _tcscpy(buffer, path.c_str()); - tstring result(buffer); + static char buffer[PATH_MAX]; +#else // !PATH_MAX +#if _POSIX_C_SOURCE >= 200809L + char *buffer = NULL; // realpath can malloc +#else + int path_max = pathconf(inputpath, _PC_PATH_MAX); + if (path_max <= 0) path_max = 4096; + char *buffer = (char *) malloc(path_max * sizeof(char)); + if (buffer) +#endif +#endif // ~PATH_MAX + { + rpret = realpath(inputpath, buffer); + } + result = CtoTString(rpret ? rpret : inputpath); #ifndef PATH_MAX - free(buffer); -#endif//!PATH_MAX + free(rpret ? rpret : buffer); +#endif + NSISRT_free(inputpath); return result; -#endif//_WIN32 +#endif // ~_WIN32 } tstring get_string_prefix(const tstring& str, const tstring& separator) { const tstring::size_type last_separator_pos = str.rfind(separator); - if (last_separator_pos == string::npos) - return str; + if (last_separator_pos == string::npos) return str; return str.substr(0, last_separator_pos); } tstring get_string_suffix(const tstring& str, const tstring& separator) { const tstring::size_type last_separator_pos = str.rfind(separator); - if (last_separator_pos == tstring::npos) - return str; + if (last_separator_pos == tstring::npos) return str; return str.substr(last_separator_pos + separator.size(), tstring::npos); } tstring get_dir_name(const tstring& path) { - return get_string_prefix(path, PLATFORM_PATH_SEPARATOR_STR); + return get_string_prefix(path, PLATFORM_PATH_SEPARATOR_STR); // BUGBUG: Windows should support "\" and "/" } tstring get_file_name(const tstring& path) { - return get_string_suffix(path, PLATFORM_PATH_SEPARATOR_STR); + return get_string_suffix(path, PLATFORM_PATH_SEPARATOR_STR); // BUGBUG: Windows should support "\" and "/" } tstring get_executable_path(const TCHAR* argv0) { @@ -520,27 +685,28 @@ tstring get_executable_path(const TCHAR* argv0) { return tstring(temp_buf); #else /* Linux/BSD/POSIX/etc */ const TCHAR *envpath = _tgetenv(_T("_")); - if( envpath != NULL ) return get_full_path( envpath ); + if( envpath != NULL ) + return get_full_path( envpath ); else { - TCHAR* pathtmp; - TCHAR* path = NULL; + char *path = NULL, *pathtmp; size_t len = 100; int nchars; while(1){ - pathtmp = (TCHAR*)realloc(path,len+1); + pathtmp = (char*)realloc(path,len+1); if( pathtmp == NULL ){ free(path); return get_full_path(argv0); } path = pathtmp; - nchars = readlink(_T("/proc/self/exe"), path, len); + nchars = readlink("/proc/self/exe", path, len); if( nchars == -1 ){ free(path); return get_full_path(argv0); } if( nchars < (int) len ){ - path[nchars] = _T('\0'); - string result(path); + path[nchars] = '\0'; + tstring result; + result = CtoTString(path); free(path); return result; } @@ -569,6 +735,13 @@ tstring lowercase(const tstring &str) { return result; } +void RawTStrToASCII(const TCHAR*in,char*out,UINT maxcch) +{ + const bool empty = !maxcch; + for(; maxcch && *in; --maxcch) *out++ = (char) *in++; + if (!empty) *out = 0; +} + /* * ExpandoStrFmtVaList returns the number of characters written excluding * the \0 terminator or 0 on error. @@ -579,7 +752,7 @@ size_t ExpandoStrFmtVaList(wchar_t*Stack, size_t cchStack, wchar_t**ppMalloc, co { #ifdef _WIN32 // For _vsnwprintf, the \0 terminator is not part of the input size -# if _MSC_VER <= 1310 +# if _MSC_VER < 1310 # define ExpandoStrFmtVaList_vsnwprintf(d,c,f,v) _vsnwprintf((d),(c)?(c)-1:0,(f),(v)) // Allow INT_MAX hack on MinGW and older versions of VC that don't have _vscwprintf # else # define ExpandoStrFmtVaList_vsnwprintf(d,c,f,v) ( INT_MAX==(c) ? _vscwprintf((f),(v)) : _vsnwprintf((d),(c)?(c)-1:0,(f),(v)) ) @@ -726,7 +899,7 @@ switchtoacp:cp = CP_ACP, mbtwcf = 0, utf8 = false; WinStdIO_OStreamWrite(g_osdata_stdout, wbuf, cchwb); // Faster than _ftprintf #else wbuf[cchwb] = L'\0'; - _ftprintf(g_output, _T("%s"), wbuf); + _ftprintf(g_output, _T("%") NPRIs, wbuf); #endif cchwb = 0; } @@ -759,23 +932,25 @@ int sane_system(const TCHAR *command) // which obviously fails... // // to avoid the stripping, a harmless string is prefixed to the command line. - const TCHAR* prefix = _T("IF 1==1 "); + const TCHAR*const prefix = _T("IF 1==1 "); #ifdef _UNICODE - if (!command) return 0; - if (!*command) return 1; + if (!command) return 0; else if (!*command) return 1; tstring fixedcmd = _tgetenv(_T("COMSPEC")); if (!fixedcmd.length()) fixedcmd = _T("CMD.EXE"); - fixedcmd += _T(" /C "); - fixedcmd += prefix; + fixedcmd += _T(" /C "), fixedcmd += prefix; return RunChildProcessRedirected(fixedcmd.c_str(), command); #else tstring fixedcmd = prefix + _T("") + command; return _tsystem(fixedcmd.c_str()); -#endif - -#else +#endif // ~_UNICODE +#else // !_WIN32 +#ifndef _UNICODE + PATH_CONVERT(command); return _tsystem(command); +#else + return NSISRT_wsystem(command); #endif +#endif // ~_WIN32 } #ifdef _WIN32 @@ -812,7 +987,7 @@ bool WINAPI WinStdIO_OStreamInit(WINSIO_OSDATA&osd, FILE*strm, WORD cp, int bom) SetFilePointer(osd.hNative, 0, 0, FILE_END); } osd.mustwritebom = bom > 0 && !cbio, osd.cp = cp; - return succ || (sizeof(TCHAR)-1 && WinStdIO_IsConsole(osd)); // Don't care about BOM for WriteConsoleW + return succ || (sizeof(TCHAR) > 1 && WinStdIO_IsConsole(osd)); // Don't care about BOM for WriteConsoleW } bool WINAPI WinStdIO_OStreamWrite(WINSIO_OSDATA&osd, const wchar_t *Str, UINT cch) { @@ -884,7 +1059,7 @@ void PrintColorFmtMsg(unsigned int type, const TCHAR *fmtstr, va_list args) { CONSOLE_SCREEN_BUFFER_INFO csbi; contxtattrbak = -2; - if ( GetConsoleScreenBufferInfo(hWin32Con, &csbi) ) + if (GetConsoleScreenBufferInfo(hWin32Con, &csbi)) { contxtattrbak = csbi.wAttributes; goto gottxtattrbak; @@ -967,15 +1142,13 @@ static bool GetDLLVersionUsingRE(const tstring& filepath, DWORD& high, DWORD & l if ((size_t) versize > sizeof(WORD) * 3) { // get VS_FIXEDFILEINFO from VS_VERSIONINFO - WCHAR *szKey = (WCHAR *)(ver + sizeof(WORD) * 3); - int len = (wcslen(szKey) + 1) * sizeof(WCHAR) + sizeof(WORD) * 3; + WINWCHAR *szKey = (WINWCHAR *)(ver + sizeof(WORD) * 3); + int len = (WinWStrLen(szKey) + 1) * sizeof(WINWCHAR) + sizeof(WORD) * 3; len = (len + 3) & ~3; // align on DWORD boundry VS_FIXEDFILEINFO *verinfo = (VS_FIXEDFILEINFO *)(ver + len); if (versize > len && verinfo->dwSignature == VS_FFI_SIGNATURE) { - low = verinfo->dwFileVersionLS; - high = verinfo->dwFileVersionMS; - found = true; + found = true, low = verinfo->dwFileVersionLS, high = verinfo->dwFileVersionMS; } } dllre->FreeResource(ver); @@ -1012,9 +1185,7 @@ static bool GetDLLVersionUsingAPI(const tstring& filepath, DWORD& high, DWORD& l VS_FIXEDFILEINFO *pvsf; if (GetFileVersionInfo(path, 0, verSize, buf) && VerQueryValue(buf, _T("\\"), (void**) &pvsf, &uLen)) { - low = pvsf->dwFileVersionLS; - high = pvsf->dwFileVersionMS; - found = true; + found = true, low = pvsf->dwFileVersionLS, high = pvsf->dwFileVersionMS; } GlobalFree(buf); } @@ -1029,9 +1200,9 @@ static bool GetDLLVersionUsingAPI(const tstring& filepath, DWORD& high, DWORD& l // the following structure must be byte-aligned. #pragma pack( push, pre_vxd_ver, 1 ) typedef struct _VXD_VERSION_RESOURCE { - char cType; // Should not be converted to TCHAR (JP) + char cType; // Should not be converted to TCHAR (JP) WORD wID; - char cName; // Should not be converted to TCHAR (JP) + char cName; // Should not be converted to TCHAR (JP) WORD wOrdinal; WORD wFlags; DWORD dwResSize; @@ -1068,10 +1239,7 @@ static BOOL GetVxdVersion( LPCTSTR szFile, LPDWORD lpdwLen, LPVOID lpData ) if ( !hFileMapping ) { dwError = GetLastError(); - - if ( hFile != INVALID_HANDLE_VALUE ) - CloseHandle( hFile ); - + if ( hFile != INVALID_HANDLE_VALUE ) CloseHandle( hFile ); SetLastError( dwError ); return FALSE; } @@ -1081,13 +1249,8 @@ static BOOL GetVxdVersion( LPCTSTR szFile, LPDWORD lpdwLen, LPVOID lpData ) if ( !pView ) { dwError = GetLastError(); - - if ( hFileMapping ) - CloseHandle( hFileMapping ); - - if ( hFile != INVALID_HANDLE_VALUE ) - CloseHandle( hFile ); - + if ( hFileMapping ) CloseHandle( hFileMapping ); + if ( hFile != INVALID_HANDLE_VALUE ) CloseHandle( hFile ); SetLastError( dwError ); return FALSE; } @@ -1098,35 +1261,22 @@ static BOOL GetVxdVersion( LPCTSTR szFile, LPDWORD lpdwLen, LPVOID lpData ) // Check to make sure the file has a DOS EXE header. if ( pDosExeHdr->e_magic != IMAGE_DOS_SIGNATURE ) { - if ( pView ) - UnmapViewOfFile( pView ); - - if ( hFileMapping ) - CloseHandle( hFileMapping ); - - if ( hFile != INVALID_HANDLE_VALUE ) - CloseHandle( hFile ); - + if ( pView ) UnmapViewOfFile( pView ); + if ( hFileMapping ) CloseHandle( hFileMapping ); + if ( hFile != INVALID_HANDLE_VALUE ) CloseHandle( hFile ); SetLastError( ERROR_BAD_FORMAT ); return FALSE; } // Find the beginning of the NT header at offset e_lfanew. - pNtExeHdr = (PIMAGE_NT_HEADERS) ( (ULONG_PTR) pView - + pDosExeHdr->e_lfanew ); + pNtExeHdr = (PIMAGE_NT_HEADERS) ( (ULONG_PTR) pView + pDosExeHdr->e_lfanew ); // Check to make sure the file is a VxD. if ( (DWORD) pNtExeHdr->Signature != IMAGE_VXD_SIGNATURE ) { - if ( pView ) - UnmapViewOfFile( pView ); - - if ( hFileMapping ) - CloseHandle( hFileMapping ); - - if ( hFile != INVALID_HANDLE_VALUE ) - CloseHandle( hFile ); - + if ( pView ) UnmapViewOfFile( pView ); + if ( hFileMapping ) CloseHandle( hFileMapping ); + if ( hFile != INVALID_HANDLE_VALUE ) CloseHandle( hFile ); SetLastError( ERROR_BAD_FORMAT ); return FALSE; } @@ -1137,38 +1287,24 @@ static BOOL GetVxdVersion( LPCTSTR szFile, LPDWORD lpdwLen, LPVOID lpData ) // e32_winreslen contains the size of the VxD's version resource. if ( pLEHdr->e32_winreslen == 0 ) { *lpdwLen = 0; - if ( pView ) - UnmapViewOfFile( pView ); - - if ( hFileMapping ) - CloseHandle( hFileMapping ); - - if ( hFile != INVALID_HANDLE_VALUE ) - CloseHandle( hFile ); - + if ( pView ) UnmapViewOfFile( pView ); + if ( hFileMapping ) CloseHandle( hFileMapping ); + if ( hFile != INVALID_HANDLE_VALUE ) CloseHandle( hFile ); SetLastError( ERROR_RESOURCE_DATA_NOT_FOUND ); return FALSE; } // e32_winresoff contains the offset of the resource in the VxD. - pVerRes = (VXD_VERSION_RESOURCE *) ( (ULONG_PTR) pView - + pLEHdr->e32_winresoff ); + pVerRes = (VXD_VERSION_RESOURCE *) ( (ULONG_PTR) pView + pLEHdr->e32_winresoff ); dwSize = pVerRes->dwResSize; pRawRes = &(pVerRes->bVerData); // Make sure the supplied buffer is large enough for the resource. if ( ( lpData == NULL ) || ( *lpdwLen < dwSize ) ) { *lpdwLen = dwSize; - - if ( pView ) - UnmapViewOfFile( pView ); - - if ( hFileMapping ) - CloseHandle( hFileMapping ); - - if ( hFile != INVALID_HANDLE_VALUE ) - CloseHandle( hFile ); - + if ( pView ) UnmapViewOfFile( pView ); + if ( hFileMapping ) CloseHandle( hFileMapping ); + if ( hFile != INVALID_HANDLE_VALUE ) CloseHandle( hFile ); SetLastError( ERROR_INSUFFICIENT_BUFFER ); return FALSE; } @@ -1179,16 +1315,10 @@ static BOOL GetVxdVersion( LPCTSTR szFile, LPDWORD lpdwLen, LPVOID lpData ) *lpdwLen = dwSize; // Clean up resources. - if ( pView ) - UnmapViewOfFile( pView ); - - if ( hFileMapping ) - CloseHandle( hFileMapping ); - - if ( hFile != INVALID_HANDLE_VALUE ) - CloseHandle( hFile ); - - SetLastError(0); + if ( pView ) UnmapViewOfFile( pView ); + if ( hFileMapping ) CloseHandle( hFileMapping ); + if ( hFile != INVALID_HANDLE_VALUE ) CloseHandle( hFile ); + SetLastError(0); // Why bother? return TRUE; } @@ -1224,7 +1354,6 @@ static BOOL GetVxdVersionInfo( LPCTSTR szFile, DWORD dwLen, LPVOID lpData ) static bool GetDLLVersionFromVXD(const tstring& filepath, DWORD& high, DWORD& low) { bool found = false; - #ifdef _WIN32 DWORD verSize = GetVxdVersionInfoSize(filepath.c_str()); if (verSize) @@ -1236,35 +1365,39 @@ static bool GetDLLVersionFromVXD(const tstring& filepath, DWORD& high, DWORD& lo VS_FIXEDFILEINFO *pvsf; if (GetVxdVersionInfo(filepath.c_str(), verSize, buf) && VerQueryValue(buf, _T("\\"), (void**) &pvsf, &uLen)) { - low = pvsf->dwFileVersionLS; - high = pvsf->dwFileVersionMS; - found = true; + found = true, low = pvsf->dwFileVersionLS, high = pvsf->dwFileVersionMS; } GlobalFree(buf); } } #endif - return found; } bool GetDLLVersion(const tstring& filepath, DWORD& high, DWORD& low) { - if (GetDLLVersionUsingAPI(filepath, high, low)) - return true; - - if (GetDLLVersionUsingRE(filepath, high, low)) - return true; - - if (GetDLLVersionFromVXD(filepath, high, low)) - return true; - + if (GetDLLVersionUsingAPI(filepath, high, low)) return true; + if (GetDLLVersionUsingRE(filepath, high, low)) return true; + if (GetDLLVersionFromVXD(filepath, high, low)) return true; return false; } -bool Platform_SupportsUTF8Conversion() +unsigned char Platform_SupportsUTF8Conversion() { - static unsigned char cached = -1; - if (-1 == cached) cached = !!IsValidCodePage(CP_UTF8); - return cached != 0; -} \ No newline at end of file + static unsigned char cached = 0; + if (0 == cached) cached = 1 + !!IsValidCodePage(CP_UTF8); + return (cached - 1); +} + +void *operator new(size_t size) NSIS_CXX_THROWSPEC(bad_alloc) +{ + void *p = malloc(size); + if (!p) throw bad_alloc(); + return p; +} +void *operator new[](size_t size) NSIS_CXX_THROWSPEC(bad_alloc) +{ + return operator new(size); +} +void operator delete(void *p) throw() { if (p) free(p); } +void operator delete [](void *p) throw() { if (p) free(p); } diff --git a/Source/util.h b/Source/util.h index dd4a38de..d62a6c21 100644 --- a/Source/util.h +++ b/Source/util.h @@ -32,16 +32,14 @@ #include - extern double my_wtof(const wchar_t *str); extern unsigned int my_strncpy(TCHAR*Dest, const TCHAR*Src, unsigned int cchMax); +size_t my_strftime(TCHAR *s, size_t max, const TCHAR *fmt, const struct tm *tm); // Adds the bitmap in filename using resource editor re as id id. // If width or height are specified it will also make sure the bitmap is in that size int update_bitmap(CResourceEditor* re, WORD id, const TCHAR* filename, int width=0, int height=0, int maxbpp=0); -size_t my_strftime(TCHAR *s, size_t max, const TCHAR *fmt, const struct tm *tm); - bool GetDLLVersion(const tstring& filepath, DWORD& high, DWORD& low); tstring get_full_path(const tstring& path); @@ -54,6 +52,7 @@ tstring lowercase(const tstring&); tstring get_string_prefix(const tstring& str, const tstring& separator); tstring get_string_suffix(const tstring& str, const tstring& separator); +void RawTStrToASCII(const TCHAR*in,char*out,UINT maxcch); size_t ExpandoStrFmtVaList(wchar_t*Stack, size_t cchStack, wchar_t**ppMalloc, const wchar_t*FmtStr, va_list Args); template class ExpandoString { @@ -112,7 +111,7 @@ int WinStdIO_wprintf(const wchar_t*Fmt, ...); #define _vftprintf WinStdIO_vfwprintf #endif // ~MAKENSIS #endif // ~_UNICODE -#define ResetPrintColor() FlushOutputAndResetPrintColor() // For reset ONLY use PrintColorFmtMsg(0,NULL ... +#define ResetPrintColor() FlushOutputAndResetPrintColor() // For reset ONLY, use PrintColorFmtMsg(0,NULL ... #define SetPrintColorWARN() PrintColorFmtMsg(1|0x10, NULL, (va_list)NULL) #define SetPrintColorERR() PrintColorFmtMsg(2|0x10, NULL, (va_list)NULL) #else @@ -136,7 +135,6 @@ inline void PrintColorFmtMsg_ERR(const TCHAR *fmtstr, ...) } - #ifndef _WIN32 // iconv const inconsistency workaround by Alexandre Oliva template @@ -148,7 +146,9 @@ inline size_t nsis_iconv_adaptor return iconv_func (cd, (T)inbuf, inbytesleft, outbuf, outbytesleft); } +const char* nsis_iconv_get_host_endian_ucs4_code(); bool nsis_iconv_reallociconv(iconv_t CD, char**In, size_t*cbInLeft, char**Mem, size_t&cbConverted); +void create_code_page_string(char*buf, size_t len, UINT code_page); // Create iconv code from Windows codepage class iconvdescriptor { iconv_t m_cd; @@ -182,25 +182,44 @@ public: iconv_t GetDescriptor() const { return m_cd; } operator iconv_t() const { return m_cd; } - static const char* GetHostEndianUCS4Code() { return "UCS-4-INTERNAL"; } + static const char* GetHostEndianUCS4Code() { return nsis_iconv_get_host_endian_ucs4_code(); } }; +BOOL IsDBCSLeadByteEx(unsigned int CodePage, unsigned char TestChar); TCHAR *CharPrev(const TCHAR *s, const TCHAR *p); char *CharNextA(const char *s); -WCHAR *CharNextW(const WCHAR *s); +wchar_t *CharNextW(const wchar_t *s); char *CharNextExA(WORD codepage, const char *s, int flags); int wsprintf(TCHAR *s, const TCHAR *format, ...); -int WideCharToMultiByte(UINT CodePage, DWORD dwFlags, LPCWSTR lpWideCharStr, +int WideCharToMultiByte(UINT CodePage, DWORD dwFlags, const wchar_t* lpWideCharStr, int cchWideChar, LPSTR lpMultiByteStr, int cbMultiByte, LPCSTR lpDefaultChar, LPBOOL lpUsedDefaultChar); int MultiByteToWideChar(UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, - int cbMultiByte, LPWSTR lpWideCharStr, int cchWideChar); + int cbMultiByte, wchar_t* lpWideCharStr, int cchWideChar); BOOL IsValidCodePage(UINT CodePage); #ifdef _UNICODE #define CharNext CharNextW #else #define CharNext CharNextA #endif +bool NSISRT_Initialize(); +#define NSISRT_free(p) ( free((void*)(p)) ) +wchar_t* NSISRT_mbtowc(const char *Str); +char* NSISRT_wctomb(const wchar_t *Str); +char* NSISRT_wctombpath(const wchar_t *Path); +char* NSISRT_ttombpath(const TCHAR *Path); +const char* NSISRT_setlocale_wincp(int cat, unsigned int cp); +int _wcsicmp(const wchar_t *a, const wchar_t *b); +int _wcsnicmp(const wchar_t *a, const wchar_t *b, size_t n); +long _wtol(const wchar_t *s); +int _wtoi(const wchar_t *s); +int _swprintf(wchar_t *d, const wchar_t *f, ...); +wchar_t* _wcsdup(const wchar_t *s); +wchar_t* _wgetenv(const wchar_t *wname); +int _wremove(const wchar_t *Path); +#define _wunlink _wremove // BUGBUG: This is not 100% correct, _wremove can also call rmdir +int _wchdir(const wchar_t *Path); +int _wstat(const wchar_t *Path, struct stat *pS); TCHAR *my_convert(const TCHAR *path); void my_convert_free(TCHAR *converted_path); @@ -208,14 +227,16 @@ int my_open(const TCHAR *pathname, int flags); #define OPEN(a, b) my_open(a, b) -#else +#else // _WIN32 + +#define NSISRT_Initialize() (true) #define my_convert(x) (x) #define my_convert_free(x) #define OPEN(a, b) _topen(a, b) -#endif +#endif // ~_WIN32 FILE* my_fopen(const TCHAR *path, const char *mode); #define FOPEN(a, b) my_fopen((a), (b)) @@ -240,9 +261,9 @@ inline T align_to_512(const T x) { class BaseResourceManager { protected: - BaseResourceManager() {} + BaseResourceManager() {} public: - virtual ~BaseResourceManager() {} + virtual ~BaseResourceManager() {} }; template @@ -258,25 +279,23 @@ private: // don't copy instances void operator=(const ResourceManager&); }; -#define RM_MANGLE_FREEFUNC(freefunc) \ - __free_with_##freefunc - +#define RM_MANGLE_FREEFUNC(freefunc) __free_with_##freefunc #define RM_DEFINE_FREEFUNC(freefunc) \ -struct RM_MANGLE_FREEFUNC(freefunc) { \ - template void operator()(T& x) { freefunc(x); } \ -} + struct RM_MANGLE_FREEFUNC(freefunc) { \ + template void operator()(T& x) { freefunc(x); } \ + } typedef boost::scoped_ptr ResourceManagerPtr; template void createResourceManager(_RESOURCE& resource, ResourceManagerPtr& ptr) { - ptr.reset(new ResourceManager<_RESOURCE, _FREE_RESOURCE>(resource)); + ptr.reset(new ResourceManager<_RESOURCE, _FREE_RESOURCE>(resource)); } #define RM_MANGLE_RESOURCE(resource) resource##_autoManager #define MANAGE_WITH(resource, freefunc) \ - ResourceManagerPtr RM_MANGLE_RESOURCE(resource); \ - createResourceManager( \ + ResourceManagerPtr RM_MANGLE_RESOURCE(resource); \ + createResourceManager( \ resource, RM_MANGLE_RESOURCE(resource)) // Add more resource-freeing functions here when you need them @@ -294,6 +313,7 @@ RM_DEFINE_FREEFUNC(my_convert_free); #endif // Platform detection -bool Platform_SupportsUTF8Conversion(); +inline bool Platform_IsBigEndian() { return FIX_ENDIAN_INT16(0x00ff) != 0x00ff; } +unsigned char Platform_SupportsUTF8Conversion(); #endif //_UTIL_H_ diff --git a/Source/winchar.cpp b/Source/winchar.cpp index bec662d3..9902114a 100644 --- a/Source/winchar.cpp +++ b/Source/winchar.cpp @@ -12,18 +12,98 @@ * * This software is provided 'as-is', without any express or implied * warranty. - * - * Reviewed for Unicode support by Jim Park -- 08/13/2007 */ #include "Platform.h" #include "winchar.h" #include "util.h" +#include "utf.h" #include +#include using std::runtime_error; +int WinWStrICmpASCII(const WINWCHAR *a, const char *b) +{ + int diff = 0; + do + diff = static_cast(S7ChLwr(*a)) - static_cast(S7ChLwr(*b++)); + while (*a++ && !diff); + return diff; +} +int WinWStrNICmpASCII(const WINWCHAR *a, const char *b, size_t n) +{ + int diff = 0; + for ( ; n--; ++a, ++b ) + { + diff = static_cast(S7ChLwr(*a)) - static_cast(S7ChLwr(*b)); + if (diff || !*a) break; + } + return diff; +} + +#ifndef _WIN32 +size_t WinWStrLen(const WINWCHAR *s) +{ + return StrLenUTF16(s); +} + +WINWCHAR* WinWStrCpy(WINWCHAR *d, const WINWCHAR *s) +{ + WINWCHAR *ret = d; + while (*s) *d++ = *s++; + *d = 0; + return ret; +} + +WINWCHAR* WinWStrNCpy(WINWCHAR *d, const WINWCHAR *s, size_t n) +{ + WINWCHAR *ret = d; + while (n && *s) *d++ = *s++, n--; + while (n--) *d++ = 0; + return ret; +} + +int WinWStrCmp(const WINWCHAR *a, const WINWCHAR *b) +{ + int diff = 0; + do + diff = static_cast(*a) - static_cast(*b++); + while (*a++ && !diff); + return diff; +} + +WINWCHAR* WinWStrDupFromWinWStr(const WINWCHAR *s) +{ + WINWCHAR *d = (WINWCHAR*) malloc((WinWStrLen(s) + 1) * sizeof(WINWCHAR)); + if (d) WinWStrCpy(d, s); + assert(!d || !IS_INTRESOURCE(d)); // DialogTemplate strings can be ATOMs + return d; +} + +WINWCHAR* WinWStrDupFromTChar(const TCHAR *s) +{ + WCToUTF16LEHlpr cnv; + if (!cnv.Create(s)) throw runtime_error("Unicode conversion failed"); + return (WINWCHAR*) cnv.Detach(); +} + +int WinWStrToInt(const WINWCHAR *s) +{ + unsigned int v = 0, base = 10, top = '9'; + int sign = 1; + if (*s == _T('-')) ++s, sign = -1; + for ( unsigned int c;; ) + { + if ((c = *s++) >= '0' && c <= top) c -= '0'; else break; + v *= base, v += c; + } + return ((int)v) * sign; +} +#endif // ~!_WIN32 + +#if 0 WCHAR *wcsdup_fromansi(const char* s, unsigned int codepage/* = CP_ACP*/) { int l = MultiByteToWideChar(codepage, 0, s, -1, 0, 0); @@ -31,75 +111,8 @@ WCHAR *wcsdup_fromansi(const char* s, unsigned int codepage/* = CP_ACP*/) throw runtime_error("Unicode conversion failed"); WCHAR *ws = new WCHAR[l + 1]; - if (MultiByteToWideChar(codepage, 0, s, -1, ws, l + 1) == 0) throw runtime_error("Unicode conversion failed"); - return ws; } - -#if 0 // Needed by some RTL missing wchar string functions ? -WCHAR *wcscpy(WCHAR *ws1, const WCHAR *ws2) -{ - WCHAR *ret = ws1; - - while (*ws2) - { - *ws1++ = *ws2++; - } - - *ws1 = 0; - - return ret; -} - -WCHAR *wcsncpy(WCHAR *ws1, const WCHAR *ws2, size_t n) -{ - WCHAR *ret = ws1; - - while (n && *ws2) - { - *ws1++ = *ws2++; - n--; - } - - while (n--) - { - *ws1++ = 0; - } - - return ret; -} - -size_t wcslen(const WCHAR *ws) -{ - size_t len = 0; - - while (*ws++) - { - len++; - } - - return len; -} - -WCHAR *_wcsdup(const WCHAR *ws) -{ - WCHAR *dup = (WCHAR*) malloc(sizeof(WCHAR)*(wcslen(ws)+1)]; - wcscpy(dup, ws); - return dup; -} - -int wcscmp(const WCHAR *ws1, const WCHAR *ws2) -{ - int diff = 0; - - do - { - diff = static_cast(*ws1) - static_cast(*ws2); - } - while (*ws1++ && *ws2++ && !diff); - - return diff; -} #endif diff --git a/Source/winchar.h b/Source/winchar.h index 09b74f3a..80458baf 100644 --- a/Source/winchar.h +++ b/Source/winchar.h @@ -12,23 +12,45 @@ * * This software is provided 'as-is', without any express or implied * warranty. - * - * Reviewed for Unicode support by Jim Park -- 07/31/2007 */ +#ifndef INC_NSIS_WINCHAR +#define INC_NSIS_WINCHAR #include "Platform.h" +#define MAKEINTRESOURCEWINW(i) ( (WINWCHAR*) MAKEINTRESOURCEW(i) ) + +int WinWStrICmpASCII(const WINWCHAR *a, const char *b); +int WinWStrNICmpASCII(const WINWCHAR *a, const char *b, size_t n); +#ifdef _WIN32 +inline size_t WinWStrLen(const WINWCHAR *s) { return wcslen((wchar_t*)s); } +inline WINWCHAR* WinWStrCpy(WINWCHAR *d, const WINWCHAR *s) { return (WINWCHAR*)wcscpy((wchar_t*)d, (wchar_t*)s); } +inline WINWCHAR* WinWStrNCpy(WINWCHAR *d, const WINWCHAR *s, size_t n) { return (WINWCHAR*)wcsncpy((wchar_t*)d, (wchar_t*)s, n); } +inline int WinWStrCmp(const WINWCHAR *a, const WINWCHAR *b) { return wcscmp((wchar_t*)a, (wchar_t*)b); } +inline WINWCHAR* WinWStrDupFromWinWStr(const WINWCHAR *s) { return (WINWCHAR*)wcsdup((wchar_t*)s); } +inline WINWCHAR* WinWStrDupFromTChar(const wchar_t *s) { return WinWStrDupFromWinWStr((WINWCHAR*)s); } +inline int WinWStrToInt(const WINWCHAR *s) { return _wtoi((wchar_t*)s); } +#else // !_WIN32 +size_t WinWStrLen(const WINWCHAR *s); +WINWCHAR* WinWStrCpy(WINWCHAR *d, const WINWCHAR *s); +WINWCHAR* WinWStrNCpy(WINWCHAR *d, const WINWCHAR *s, size_t n); +int WinWStrCmp(const WINWCHAR *a, const WINWCHAR *b); +WINWCHAR* WinWStrDupFromWinWStr(const WINWCHAR *s); +WINWCHAR* WinWStrDupFromTChar(const TCHAR *s); +int WinWStrToInt(const WINWCHAR *s); +#endif // ~_WIN32 + +#ifdef _UNICODE +inline WINWCHAR* WinWStrDupFromTChar(const TCHAR *s, unsigned int codepage) { return WinWStrDupFromTChar(s); } +#endif + + +#if 0 WCHAR *wcsdup_fromansi(const char* s, unsigned int codepage = CP_ACP); #ifdef _UNICODE #define wcsdup_fromTchar(s, codepage) _wcsdup(s) // codepage is not used in this mode #else #define wcsdup_fromTchar(s, codepage) wcsdup_fromansi(s, codepage) #endif - -#if 0 // Needed by some RTL missing wchar string functions ? -WCHAR *wcscpy(WCHAR *ws1, const WCHAR *ws2); -WCHAR *wcsncpy(WCHAR *ws1, const WCHAR *ws2, size_t n); -size_t wcslen(const WCHAR *ws); -WCHAR *_wcsdup(const WCHAR *ws); -int wcscmp(const WCHAR *ws1, const WCHAR *ws2); #endif +#endif // ~INC_NSIS_WINCHAR