Write error messages to stderr by default
Disabled if -O is used or if -NOTIFYHWND is valid and returns 0 to QUERYHOST:QH_ENABLESTDERR git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@6798 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
parent
9841c101cf
commit
04d6fe9367
6 changed files with 51 additions and 23 deletions
|
@ -2,13 +2,17 @@
|
||||||
|
|
||||||
\H{v3.01} 3.01
|
\H{v3.01} 3.01
|
||||||
|
|
||||||
Released on ? ?th, 201?
|
Released on December ?th, 2016
|
||||||
|
|
||||||
\S1{v3.01-cl} Changelog
|
\S1{v3.01-cl} Changelog
|
||||||
|
|
||||||
|
\S2{} Major Changes
|
||||||
|
|
||||||
|
\b Error messages are now written to stderr by default
|
||||||
|
|
||||||
\S2{} Minor Changes
|
\S2{} Minor Changes
|
||||||
|
|
||||||
\b SetCtlColors now supports Windows color constants
|
\b \R{setctlcolors}{SetCtlColors} now supports Windows color constant values
|
||||||
|
|
||||||
\b Fixed buffer size bug in winchar.cpp (\W{http://sf.net/p/nsis/patches/271}{patch #271})
|
\b Fixed buffer size bug in winchar.cpp (\W{http://sf.net/p/nsis/patches/271}{patch #271})
|
||||||
|
|
||||||
|
|
|
@ -130,7 +130,7 @@ Sets the text and background color of a static control, edit control, button or
|
||||||
\c GetDlgItem $0 $1 1006
|
\c GetDlgItem $0 $1 1006
|
||||||
\c SetCtlColors $0 0xFF0000 0x00FF00 ; Red on Green
|
\c SetCtlColors $0 0xFF0000 0x00FF00 ; Red on Green
|
||||||
\c GetDlgItem $0 $1 1022
|
\c GetDlgItem $0 $1 1022
|
||||||
\c SetCtlColors $0 SYSCLR:23 SYSCLR:24
|
\c SetCtlColors $0 SYSCLR:23 SYSCLR:24 ; COLOR_INFOTEXT on COLOR_INFOBK
|
||||||
\c FunctionEnd
|
\c FunctionEnd
|
||||||
|
|
||||||
\NsisWarnBlockContainerBegin
|
\NsisWarnBlockContainerBegin
|
||||||
|
|
|
@ -82,10 +82,11 @@ namespace MakensisAPI {
|
||||||
};
|
};
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
enum sndmsg_e {
|
enum sndmsg_e {
|
||||||
QUERYHOST = WM_APP // QUERYHOST_e in wParam
|
QUERYHOST = WM_APP // [0x03000000] QUERYHOST_e in wParam. MUST return 0 for unknown QUERYHOST_e values!
|
||||||
};
|
};
|
||||||
enum QUERYHOST_e {
|
enum QUERYHOST_e {
|
||||||
QH_OUTPUTCHARSET = 1 // return (wincodepage+1) or 0 for default (This encoding is used by stdout and the notify messages)
|
QH_OUTPUTCHARSET = 1, // [0x03000000] return (wincodepage+1) or 0 for default (This encoding is used by stdout, stderr and the notify messages)
|
||||||
|
QH_ENABLESTDERR // [0x03001000] return 1 to output error messages to stderr or 0 to output error messages to stdout
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,12 +38,12 @@ using namespace std;
|
||||||
|
|
||||||
bool g_dopause=false, g_warnaserror=false;
|
bool g_dopause=false, g_warnaserror=false;
|
||||||
int g_display_errors=1;
|
int g_display_errors=1;
|
||||||
FILE *g_output;
|
FILE *g_output, *g_errout;
|
||||||
NStreamEncoding g_outputenc;
|
NStreamEncoding g_outputenc;
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
UINT g_wincon_orgoutcp;
|
UINT g_wincon_orgoutcp;
|
||||||
#ifdef _UNICODE
|
#ifdef _UNICODE
|
||||||
WINSIO_OSDATA g_osdata_stdout;
|
WINSIO_OSDATA g_osdata_stdout, g_osdata_stderr;
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
const TCHAR *g_argv0=0;
|
const TCHAR *g_argv0=0;
|
||||||
|
@ -71,7 +71,8 @@ static void myatexit()
|
||||||
{
|
{
|
||||||
dopause();
|
dopause();
|
||||||
ResetPrintColor();
|
ResetPrintColor();
|
||||||
if (g_output != stdout && g_output) fclose(g_output);
|
if (g_output != stdout && g_output) fclose(g_output), g_output = 0;
|
||||||
|
if (g_errout != stderr && g_errout) fclose(g_errout), g_errout = 0;
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
SetConsoleOutputCP(g_wincon_orgoutcp);
|
SetConsoleOutputCP(g_wincon_orgoutcp);
|
||||||
#endif
|
#endif
|
||||||
|
@ -108,7 +109,11 @@ static DWORD WINAPI sigint_event_msg_handler(LPVOID ThreadParam)
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
static UINT_PTR QueryHost(HWND hHost, UINT_PTR wp, UINT_PTR lp=0, UINT_PTR def=0) { return hHost ? SendMessage(hHost, MakensisAPI::QUERYHOST, wp, lp) : def; }
|
||||||
|
#else //! _WIN32
|
||||||
|
static inline UINT_PTR QueryHost(HWND hHost, UINT_PTR wp, UINT_PTR lp=0, UINT_PTR def=0) { return def; }
|
||||||
|
#endif //~ _WIN32
|
||||||
|
|
||||||
static void init_signals(HWND notify_hwnd)
|
static void init_signals(HWND notify_hwnd)
|
||||||
{
|
{
|
||||||
|
@ -291,10 +296,11 @@ static inline int makensismain(int argc, TCHAR **argv)
|
||||||
assert(sizeof(WINWCHAR) == sizeof(WCHAR)); // Not really required but if WCHAR changes we need to know
|
assert(sizeof(WINWCHAR) == sizeof(WCHAR)); // Not really required but if WCHAR changes we need to know
|
||||||
|
|
||||||
g_argv0=argv[0];
|
g_argv0=argv[0];
|
||||||
|
g_output=stdout, g_errout=stderr;
|
||||||
|
|
||||||
if (!NSISRT_Initialize())
|
if (!NSISRT_Initialize())
|
||||||
{
|
{
|
||||||
_ftprintf(stdout,_T("NSISRT_Initialize failed!\n"));
|
_ftprintf(stderr,_T("NSISRT_Initialize failed!\n"));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -302,11 +308,10 @@ static inline int makensismain(int argc, TCHAR **argv)
|
||||||
const TCHAR*stdoutredirname=0;
|
const TCHAR*stdoutredirname=0;
|
||||||
NStreamEncoding inputenc, &outputenc = g_outputenc;
|
NStreamEncoding inputenc, &outputenc = g_outputenc;
|
||||||
int argpos=0;
|
int argpos=0;
|
||||||
bool in_files=false;
|
bool do_cd=true, noconfig=false;
|
||||||
bool do_cd=true;
|
|
||||||
bool no_logo=true;
|
bool no_logo=true;
|
||||||
bool initialparsefail=false;
|
bool initialparsefail=false, in_files=false;
|
||||||
bool noconfig=false;
|
bool oneoutputstream=false;
|
||||||
signed char pponly=0;
|
signed char pponly=0;
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
signed char outputbom=1;
|
signed char outputbom=1;
|
||||||
|
@ -391,17 +396,23 @@ static inline int makensismain(int argc, TCHAR **argv)
|
||||||
FILE*stdoutredir=stdout;
|
FILE*stdoutredir=stdout;
|
||||||
if (stdoutredirname) stdoutredir=my_fopen(stdoutredirname,"w");
|
if (stdoutredirname) stdoutredir=my_fopen(stdoutredirname,"w");
|
||||||
g_output=stdoutredir;
|
g_output=stdoutredir;
|
||||||
if (!g_output) g_output=stdout;
|
if (!g_output)
|
||||||
|
g_output=stdout; // We could not open stdoutredirname, fall back to stdout
|
||||||
|
else if (stdoutredirname)
|
||||||
|
oneoutputstream=true; // -O used, put all output in the same file
|
||||||
|
if (oneoutputstream || !(1 & QueryHost(hostnotifyhandle,MakensisAPI::QH_ENABLESTDERR,0,1)))
|
||||||
|
g_errout=g_output;
|
||||||
#if defined(_WIN32) && defined(_UNICODE)
|
#if defined(_WIN32) && defined(_UNICODE)
|
||||||
if (hostnotifyhandle)
|
if (hostnotifyhandle)
|
||||||
{
|
{
|
||||||
// The host can override the output format if they want to
|
// The host can override the output format if they want to
|
||||||
LPARAM lp=MAKELONG(outputenc.GetCodepage(),outputbom);
|
LPARAM lp=MAKELONG(outputenc.GetCodepage(),outputbom);
|
||||||
LRESULT mr=SendMessage(hostnotifyhandle,MakensisAPI::QUERYHOST,MakensisAPI::QH_OUTPUTCHARSET,lp);
|
LRESULT mr=QueryHost(hostnotifyhandle,MakensisAPI::QH_OUTPUTCHARSET,lp);
|
||||||
if (mr) outputenc.SetCodepage((WORD)(--mr)), outputbom = -1;
|
if (mr) outputenc.SetCodepage((WORD)(--mr)), outputbom = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!WinStdIO_OStreamInit(g_osdata_stdout,g_output,outputenc.GetCodepage(),outputbom))
|
if (( !WinStdIO_OStreamInit(g_osdata_stdout,g_output,outputenc.GetCodepage(),outputbom))
|
||||||
|
|| (g_errout != g_output && !WinStdIO_OStreamInit(g_osdata_stderr,g_errout,outputenc.GetCodepage(),outputbom)))
|
||||||
{
|
{
|
||||||
assert(!"StdIO init failed");
|
assert(!"StdIO init failed");
|
||||||
return 1;
|
return 1;
|
||||||
|
|
|
@ -56,7 +56,7 @@ namespace Apple { // defines struct section
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
extern int g_display_errors;
|
extern int g_display_errors;
|
||||||
extern FILE *g_output;
|
extern FILE *g_output, *g_errout;
|
||||||
|
|
||||||
double my_wtof(const wchar_t *str)
|
double my_wtof(const wchar_t *str)
|
||||||
{
|
{
|
||||||
|
@ -1073,17 +1073,23 @@ end:
|
||||||
strm.Detach();
|
strm.Detach();
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
static WINSIO_OSDATA*WinStdIO_GetNativeStreamData(FILE*strm)
|
||||||
|
{
|
||||||
|
extern WINSIO_OSDATA g_osdata_stdout, g_osdata_stderr;
|
||||||
|
if (g_output == strm) return &g_osdata_stdout;
|
||||||
|
return g_errout == strm ? &g_osdata_stderr : NULL;
|
||||||
|
}
|
||||||
int WINAPI WinStdIO_vfwprintf(FILE*strm, const wchar_t*Fmt, va_list val)
|
int WINAPI WinStdIO_vfwprintf(FILE*strm, const wchar_t*Fmt, va_list val)
|
||||||
{
|
{
|
||||||
if (g_output == strm && Fmt)
|
WINSIO_OSDATA*pOSD;
|
||||||
|
if (Fmt && (pOSD = WinStdIO_GetNativeStreamData(strm)))
|
||||||
{
|
{
|
||||||
extern WINSIO_OSDATA g_osdata_stdout;
|
|
||||||
ExpandoString<wchar_t, NSIS_MAX_STRLEN> buf;
|
ExpandoString<wchar_t, NSIS_MAX_STRLEN> buf;
|
||||||
errno = ENOMEM;
|
errno = ENOMEM;
|
||||||
const size_t cchfmt = buf.StrFmt(Fmt, val, false);
|
const size_t cchfmt = buf.StrFmt(Fmt, val, false);
|
||||||
UINT cch = (UINT) cchfmt;
|
UINT cch = (UINT) cchfmt;
|
||||||
assert(sizeof(size_t) <= 4 || cchfmt == cch);
|
assert(sizeof(size_t) <= 4 || cchfmt == cch);
|
||||||
if (cch && !WinStdIO_OStreamWrite(g_osdata_stdout, buf, cch))
|
if (cch && !WinStdIO_OStreamWrite(*pOSD, buf, cch))
|
||||||
{
|
{
|
||||||
cch = 0, errno = EIO;
|
cch = 0, errno = EIO;
|
||||||
}
|
}
|
||||||
|
@ -1112,7 +1118,9 @@ int WinStdIO_wprintf(const wchar_t*Fmt, ...)
|
||||||
void PrintColorFmtMsg(unsigned int type, const TCHAR *fmtstr, va_list args)
|
void PrintColorFmtMsg(unsigned int type, const TCHAR *fmtstr, va_list args)
|
||||||
{
|
{
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
const HANDLE hWin32Con = GetStdHandle(STD_OUTPUT_HANDLE);
|
DWORD conmode;
|
||||||
|
HANDLE hWin32Con = GetStdHandle(STD_OUTPUT_HANDLE);
|
||||||
|
if (!GetConsoleMode(hWin32Con, &conmode)) hWin32Con = GetStdHandle(STD_ERROR_HANDLE);
|
||||||
static INT32 contxtattrbak = -1;
|
static INT32 contxtattrbak = -1;
|
||||||
WORD txtattr = 0;
|
WORD txtattr = 0;
|
||||||
if (contxtattrbak < 0)
|
if (contxtattrbak < 0)
|
||||||
|
|
|
@ -161,7 +161,11 @@ inline void PrintColorFmtMsg_ERR(const TCHAR *fmtstr, ...)
|
||||||
{
|
{
|
||||||
va_list val;
|
va_list val;
|
||||||
va_start(val,fmtstr);
|
va_start(val,fmtstr);
|
||||||
PrintColorFmtMsg(2, fmtstr, val);
|
PrintColorFmtMsg_WARN(_T("")); // flush g_output
|
||||||
|
SetPrintColorERR();
|
||||||
|
extern FILE *g_errout;
|
||||||
|
_vftprintf(g_errout, fmtstr, val), fflush(g_errout);
|
||||||
|
ResetPrintColor();
|
||||||
va_end(val);
|
va_end(val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue