From 27ed0e502b68dea9ee10ac0a8cdbb8c1ce3a9ecf Mon Sep 17 00:00:00 2001 From: anders_k Date: Wed, 23 Nov 2016 15:42:20 +0000 Subject: [PATCH] Unify g_output and console initialization git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@6802 212acab6-be3b-0410-9dea-997c60f758d6 --- Contrib/Library/LibraryLocal/LibraryLocal.cpp | 1 + Source/Tests/mmap.cpp | 3 +- Source/Tests/textrunner.cpp | 5 ++++ Source/Tests/winchar.cpp | 1 - Source/script.cpp | 12 ++++---- Source/util.cpp | 30 +++++++++++++++---- Source/util.h | 4 +-- 7 files changed, 39 insertions(+), 17 deletions(-) diff --git a/Contrib/Library/LibraryLocal/LibraryLocal.cpp b/Contrib/Library/LibraryLocal/LibraryLocal.cpp index fd41f391..5b4cb7ea 100644 --- a/Contrib/Library/LibraryLocal/LibraryLocal.cpp +++ b/Contrib/Library/LibraryLocal/LibraryLocal.cpp @@ -77,6 +77,7 @@ int GetTLBVersion(tstring& filepath, DWORD& high, DWORD & low) NSIS_ENTRYPOINT_TMAIN int _tmain(int argc, TCHAR* argv[]) { + if (!NSISRT_Initialize()) return 1; // Parse the command line diff --git a/Source/Tests/mmap.cpp b/Source/Tests/mmap.cpp index a8cd5cdb..9ed0e5b1 100644 --- a/Source/Tests/mmap.cpp +++ b/Source/Tests/mmap.cpp @@ -6,13 +6,12 @@ #include #include #include -#include "../util.h" // HACKHACK: for NSISRT_DEFINEGLOBALS using namespace std; // for std::min -NSISRT_DEFINEGLOBALS(); // HACKHACK: This really belongs in textrunner.cpp? void quit() { + extern FILE *g_errout; _ftprintf(g_errout, _T("MMap quit\n")); } diff --git a/Source/Tests/textrunner.cpp b/Source/Tests/textrunner.cpp index 171a5788..9f116fac 100644 --- a/Source/Tests/textrunner.cpp +++ b/Source/Tests/textrunner.cpp @@ -1,9 +1,14 @@ #include #include #include +#include "../util.h" // for NSISRT_* + +NSISRT_DEFINEGLOBALS(); int main(int argc, char* argv[]) { + if (!NSISRT_Initialize()) return 1; + // Get the top level suite from the registry CppUnit::Test *suite = CppUnit::TestFactoryRegistry::getRegistry().makeTest(); diff --git a/Source/Tests/winchar.cpp b/Source/Tests/winchar.cpp index 59c0ab3d..bd6b780d 100644 --- a/Source/Tests/winchar.cpp +++ b/Source/Tests/winchar.cpp @@ -28,7 +28,6 @@ class WinCharTest : public CppUnit::TestFixture { public: void setUp() { - NSISRT_Initialize(); // HACKHACK: This really belongs in textrunner.cpp? } void testFromTchar() { diff --git a/Source/script.cpp b/Source/script.cpp index 34b56033..92b1cbf0 100644 --- a/Source/script.cpp +++ b/Source/script.cpp @@ -81,11 +81,11 @@ static UINT read_line_helper(NStreamLineReader&lr, TCHAR*buf, UINT cch) static bool LookupWinSysColorId(const TCHAR*Str, UINT&Clr) { static const struct { const TCHAR*Name; UINT Id; } map[] = { // Note: This list is incomplete. - { TEXT("WINDOW"), 5 }, { TEXT("WINDOWTEXT"), 8 }, - { TEXT("3DFACE"), 15 }, { TEXT("BTNTEXT"), 18 }, // "Three-dimensional display elements and dialog box" - { TEXT("HIGHLIGHT"), 13 }, { TEXT("HIGHLIGHTTEXT"), 14 }, // "Item(s) selected in a control" - { TEXT("GRAYTEXT"), 17 }, // "Grayed (disabled) text" - { TEXT("HOTLIGHT"), 26 }, // "Color for a hyperlink or hot-tracked item" (Win98+) + { _T("WINDOW"), 5 }, { _T("WINDOWTEXT"), 8 }, + { _T("3DFACE"), 15 }, { _T("BTNTEXT"), 18 }, // "Three-dimensional display elements and dialog box" + { _T("HIGHLIGHT"), 13 }, { _T("HIGHLIGHTTEXT"), 14 }, // "Item(s) selected in a control" + { _T("GRAYTEXT"), 17 }, // "Grayed (disabled) text" + { _T("HOTLIGHT"), 26 }, // "Color for a hyperlink or hot-tracked item" (Win98+) }; for (UINT i = 0; i < COUNTOF(map); ++i) if (!_tcsicmp(map[i].Name, Str)) return (Clr = map[i].Id, true); @@ -3235,7 +3235,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) case 1: comp=4; break; case 2: comp=5, validparams=!!*(define=line.gettoken_str(2)); break; case 3: cmpv=line.gettoken_int(3,&validparams); break; - default: comp=-1; + default: forceutf8=comp=-1; } if (!validparams || comp == -1) PRINTHELP() tstring compile; diff --git a/Source/util.cpp b/Source/util.cpp index eaeb58d6..13c0926c 100644 --- a/Source/util.cpp +++ b/Source/util.cpp @@ -203,7 +203,7 @@ static char g_nrt_iconv_narrowlocbuf[50], *g_nrt_iconv_narrowloc = 0; #ifdef HAVE_LANGINFO_H // BUGBUG: scons needs to check for HAVE_LANGINFO_H and HAVE_NL_LANGINFO support? #include #endif -bool NSISRT_Initialize() +bool NSISRT_Initialize() // Init function for POSIX { iconvdescriptor id; g_nrt_iconv_narrowloc = const_cast(""); // Use "" and not "char", "char" is a GNU extension? @@ -1019,7 +1019,13 @@ bool GetFileSize64(HANDLE hFile, ULARGE_INTEGER &uli) uli.LowPart = GetFileSize(hFile, &uli.HighPart); return INVALID_FILE_SIZE != uli.LowPart || !GetLastError(); } -#endif +static HANDLE NSISRT_GetConsoleScreenHandle() +{ + DWORD cm; + HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE); + return GetConsoleMode(hCon, &cm) ? hCon : GetStdHandle(STD_ERROR_HANDLE); +} +#endif //~ _WIN32 #if defined(_WIN32) && defined(_UNICODE) && defined(MAKENSIS) #include // for _get_osfhandle bool WINAPI WinStdIO_OStreamInit(WINSIO_OSDATA&osd, FILE*strm, WORD cp, int bom) @@ -1113,6 +1119,22 @@ int WinStdIO_wprintf(const wchar_t*Fmt, ...) va_end(val); return rv; } +static HANDLE NSISRT_FastGetConsoleScreenHandle() +{ + extern WINSIO_OSDATA g_osdata_stdout, g_osdata_stderr; + return WinStdIO_IsConsole(g_osdata_stdout) ? g_osdata_stdout.hNative : g_osdata_stderr.hNative; +} +bool NSISRT_Initialize() // Init function for MakeNSIS Win32 +{ + static bool inited = false; + if (inited) return inited; + extern WINSIO_OSDATA g_osdata_stdout, g_osdata_stderr; + g_osdata_stderr.mode = g_osdata_stdout.mode = 0, g_osdata_stderr.hNative = g_osdata_stdout.hNative = 0; + return (inited = true); +} +#elif defined(_WIN32) +#define NSISRT_FastGetConsoleScreenHandle NSISRT_GetConsoleScreenHandle +bool NSISRT_Initialize() { return true; } // Init function for non-MakeNSIS Win32 (NSISRT_DEFINEGLOBALS sets g_output and g_errout) #endif void PrintColorFmtErrMsg(const TCHAR *fmtstr, va_list args) @@ -1126,9 +1148,7 @@ void PrintColorFmtErrMsg(const TCHAR *fmtstr, va_list args) void PrintColorFmtMsg(unsigned int type, const TCHAR *fmtstr, va_list args) { #ifdef _WIN32 - DWORD conmode; - HANDLE hWin32Con = GetStdHandle(STD_OUTPUT_HANDLE); - if (!GetConsoleMode(hWin32Con, &conmode)) hWin32Con = GetStdHandle(STD_ERROR_HANDLE); + HANDLE hWin32Con = NSISRT_FastGetConsoleScreenHandle(); static INT32 contxtattrbak = -1; WORD txtattr = 0; if (contxtattrbak < 0) diff --git a/Source/util.h b/Source/util.h index 66f14b6e..eddd49ee 100644 --- a/Source/util.h +++ b/Source/util.h @@ -168,6 +168,7 @@ inline void PrintColorFmtMsg_ERR(const TCHAR *fmtstr, ...) } +bool NSISRT_Initialize(); #ifndef _WIN32 // iconv const inconsistency workaround by Alexandre Oliva template @@ -235,7 +236,6 @@ BOOL IsValidCodePage(UINT CodePage); #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); @@ -262,8 +262,6 @@ int my_open(const TCHAR *pathname, int flags); #else // _WIN32 -#define NSISRT_Initialize() (true) - #define my_convert(x) (x) #define my_convert_free(x)