MakeNSIS console warn/err colors on Win32
git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@6167 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
parent
ee59b7f723
commit
e918dd8a27
10 changed files with 112 additions and 46 deletions
|
@ -3310,8 +3310,7 @@ void CEXEBuild::warning(const TCHAR *s, ...)
|
|||
notify(MAKENSIS_NOTIFY_WARNING,buf);
|
||||
if (display_warnings)
|
||||
{
|
||||
_ftprintf(g_output,_T("warning: %s\n"),buf);
|
||||
fflush(g_output);
|
||||
PrintColorFmtMsg_WARN(_T("warning: %s\n"),buf);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3332,8 +3331,7 @@ void CEXEBuild::warning_fl(const TCHAR *s, ...)
|
|||
notify(MAKENSIS_NOTIFY_WARNING,buf);
|
||||
if (display_warnings)
|
||||
{
|
||||
_ftprintf(g_output,_T("warning: %s\n"),buf);
|
||||
fflush(g_output);
|
||||
PrintColorFmtMsg_WARN(_T("warning: %s\n"),buf);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3353,8 +3351,7 @@ void CEXEBuild::ERROR_MSG(const TCHAR *s, ...) const
|
|||
notify(MAKENSIS_NOTIFY_ERROR,buf);
|
||||
if (display_errors)
|
||||
{
|
||||
_ftprintf(g_output,_T("%s"),buf);
|
||||
fflush(g_output);
|
||||
PrintColorFmtMsg_ERR(_T("%s"),buf);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3389,13 +3386,14 @@ void CEXEBuild::print_warnings()
|
|||
if (!x || !display_warnings) return;
|
||||
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"));
|
||||
for (x = 0; x < nw; x ++)
|
||||
{
|
||||
_ftprintf(g_output,_T(" %s\n"),p);
|
||||
p+=_tcslen(p)+1;
|
||||
}
|
||||
fflush(g_output);
|
||||
FlushOutputAndResetPrintColor();
|
||||
}
|
||||
|
||||
void CEXEBuild::notify(notify_e code, const TCHAR *data) const
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
#include <cstdio> // for f*
|
||||
#include <algorithm> // for std::min
|
||||
#include "tchar.h"
|
||||
#include "util.h"
|
||||
|
||||
#include "Platform.h"
|
||||
|
||||
|
@ -64,8 +65,7 @@ void GrowBuf::resize(int newlen)
|
|||
extern int g_display_errors;
|
||||
if (g_display_errors)
|
||||
{
|
||||
_ftprintf(g_output,_T("\nack! realloc(%d) failed, trying malloc(%d)!\n"),m_alloc,newlen);
|
||||
fflush(g_output);
|
||||
PrintColorFmtMsg_ERR(_T("\nack! realloc(%d) failed, trying malloc(%d)!\n"),m_alloc,newlen);
|
||||
}
|
||||
m_alloc=newlen; // try to malloc the minimum needed
|
||||
n=malloc(m_alloc);
|
||||
|
@ -74,8 +74,7 @@ void GrowBuf::resize(int newlen)
|
|||
extern void quit();
|
||||
if (g_display_errors)
|
||||
{
|
||||
_ftprintf(g_output,_T("\nInternal compiler error #12345: GrowBuf realloc/malloc(%d) failed.\n"),m_alloc);
|
||||
fflush(g_output);
|
||||
PrintColorFmtMsg_ERR(_T("\nInternal compiler error #12345: GrowBuf realloc/malloc(%d) failed.\n"),m_alloc);
|
||||
}
|
||||
quit();
|
||||
}
|
||||
|
|
|
@ -416,7 +416,7 @@ int generate_unicons_offsets(LPBYTE exeHeader, size_t exeHeaderSize, LPBYTE unin
|
|||
catch (const exception& e)
|
||||
{
|
||||
if (g_display_errors)
|
||||
_ftprintf(g_output, _T("\nError generating uninstaller icon: %s -- failing!\n"), CtoTString(e.what()));
|
||||
PrintColorFmtMsg_ERR(_T("\nError generating uninstaller icon: %s -- failing!\n"), CtoTString(e.what()));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -46,9 +46,8 @@ void quit()
|
|||
{
|
||||
if (g_display_errors)
|
||||
{
|
||||
_ftprintf(g_output,_T("\nNote: you may have one or two (large) stale temporary file(s)\n")
|
||||
PrintColorFmtMsg_WARN(_T("\nNote: you may have one or two (large) stale temporary file(s)\n")
|
||||
_T("left in your temporary directory (Generally this only happens on Windows 9x).\n"));
|
||||
fflush(g_output);
|
||||
}
|
||||
exit(1);
|
||||
}
|
||||
|
@ -56,6 +55,7 @@ void quit()
|
|||
static void myatexit()
|
||||
{
|
||||
dopause();
|
||||
ResetPrintColor();
|
||||
if (g_output != stdout && g_output) fclose(g_output);
|
||||
#ifdef _WIN32
|
||||
#ifdef _UNICODE
|
||||
|
@ -68,8 +68,7 @@ static void sigint(int sig)
|
|||
{
|
||||
if (g_display_errors)
|
||||
{
|
||||
_ftprintf(g_output,_T("\n\nAborting on Ctrl+C...\n"));
|
||||
fflush(g_output);
|
||||
PrintColorFmtMsg_WARN(_T("\n\nAborting on Ctrl+C...\n"));
|
||||
}
|
||||
quit();
|
||||
}
|
||||
|
@ -214,8 +213,7 @@ static int process_config(CEXEBuild& build, tstring& conf)
|
|||
{
|
||||
if (build.display_errors)
|
||||
{
|
||||
_ftprintf(g_output,_T("Error in config on line %d -- aborting creation process\n"),build.linecnt);
|
||||
fflush(g_output);
|
||||
PrintColorFmtMsg_ERR(_T("Error in config on line %d -- aborting creation process\n"),build.linecnt);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
@ -242,8 +240,7 @@ static int change_to_script_dir(CEXEBuild& build, tstring& script)
|
|||
{
|
||||
if (build.display_errors)
|
||||
{
|
||||
_ftprintf(g_output,_T("Error changing directory to \"%s\"\n"),dir.c_str());
|
||||
fflush(g_output);
|
||||
PrintColorFmtMsg_ERR(_T("Error changing directory to \"%s\"\n"),dir.c_str());
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
@ -292,8 +289,7 @@ int _tmain(int argc, TCHAR **argv)
|
|||
}
|
||||
catch (exception& err)
|
||||
{
|
||||
_ftprintf(g_output, _T("Error initalizing CEXEBuild: %s\n"), CtoTString(err.what()));
|
||||
fflush(g_output);
|
||||
PrintColorFmtMsg_ERR(_T("Error initalizing CEXEBuild: %s\n"), CtoTString(err.what()));
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -319,8 +315,8 @@ int _tmain(int argc, TCHAR **argv)
|
|||
g_output=FOPENTEXT(argv[tmpargpos]+2,"w");
|
||||
if (!g_output)
|
||||
{
|
||||
_tprintf(_T("Error opening output log for writing. Using stdout.\n"));
|
||||
g_output=stdout;
|
||||
g_output=stdout; // Needs to be set before calling PrintColorFmtMsg*
|
||||
PrintColorFmtMsg_WARN(_T("Error opening output log for writing. Using stdout.\n"));
|
||||
}
|
||||
outputtried=1;
|
||||
}
|
||||
|
@ -365,8 +361,8 @@ int _tmain(int argc, TCHAR **argv)
|
|||
g_output=FOPENTEXT(argv[argpos]+2,"w");
|
||||
if (!g_output)
|
||||
{
|
||||
if (build.display_errors) _tprintf(_T("Error opening output log for writing. Using stdout.\n"));
|
||||
g_output=stdout;
|
||||
g_output=stdout; // Needs to be set before calling PrintColorFmtMsg*
|
||||
if (build.display_errors) PrintColorFmtMsg_WARN(_T("Error opening output log for writing. Using stdout.\n"));
|
||||
}
|
||||
outputtried=1;
|
||||
}
|
||||
|
@ -508,8 +504,7 @@ int _tmain(int argc, TCHAR **argv)
|
|||
if (build.display_errors)
|
||||
{
|
||||
sfile[_tcslen(sfile)-4]=0;
|
||||
_ftprintf(g_output,_T("Can't open script \"%s\"\n"),sfile);
|
||||
fflush(g_output);
|
||||
PrintColorFmtMsg_ERR(_T("Can't open script \"%s\"\n"),sfile);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
@ -536,8 +531,7 @@ int _tmain(int argc, TCHAR **argv)
|
|||
{
|
||||
if (build.display_errors)
|
||||
{
|
||||
_ftprintf(g_output,_T("Error in script \"%s\" on line %d -- aborting creation process\n"),sfile,build.linecnt);
|
||||
fflush(g_output);
|
||||
PrintColorFmtMsg_ERR(_T("Error in script \"%s\" on line %d -- aborting creation process\n"),sfile,build.linecnt);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
@ -568,8 +562,7 @@ int _tmain(int argc, TCHAR **argv)
|
|||
{
|
||||
if (build.display_errors)
|
||||
{
|
||||
_ftprintf(g_output,_T("Error - aborting creation process\n"));
|
||||
fflush(g_output);
|
||||
PrintColorFmtMsg_ERR(_T("Error - aborting creation process\n"));
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
#include "mmap.h"
|
||||
#include <cstdio> // for f*
|
||||
#include <cassert> // for assert
|
||||
#include "tchar.h"
|
||||
#include "tchar.h"
|
||||
#include <limits.h>
|
||||
#ifndef _WIN32
|
||||
# include <sys/types.h> // for freebsd
|
||||
|
@ -26,6 +26,7 @@
|
|||
# include <fcntl.h>
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
#include "util.h"
|
||||
|
||||
// ========
|
||||
// MMapFile
|
||||
|
@ -220,8 +221,7 @@ void MMapFile::resize(int newsize)
|
|||
extern void quit(); extern int g_display_errors;
|
||||
if (g_display_errors)
|
||||
{
|
||||
_ftprintf(g_output,_T("\nInternal compiler error #12345: error creating mmap the size of %d.\n"), m_iSize);
|
||||
fflush(g_output);
|
||||
PrintColorFmtMsg_ERR(_T("\nInternal compiler error #12345: error creating mmap the size of %d.\n"), m_iSize);
|
||||
}
|
||||
quit();
|
||||
}
|
||||
|
@ -253,8 +253,7 @@ void *MMapFile::get(int offset, int *sizep) const
|
|||
extern void quit(); extern int g_display_errors;
|
||||
if (g_display_errors)
|
||||
{
|
||||
_ftprintf(g_output,_T("\nInternal compiler error #12345: error mmapping file (%d, %d) is out of range.\n"), offset, size);
|
||||
fflush(g_output);
|
||||
PrintColorFmtMsg_ERR(_T("\nInternal compiler error #12345: error mmapping file (%d, %d) is out of range.\n"), offset, size);
|
||||
}
|
||||
quit();
|
||||
}
|
||||
|
@ -280,8 +279,7 @@ void *MMapFile::get(int offset, int *sizep) const
|
|||
extern void quit(); extern int g_display_errors;
|
||||
if (g_display_errors)
|
||||
{
|
||||
_ftprintf(g_output,_T("\nInternal compiler error #12345: error mmapping datablock to %d.\n"), size);
|
||||
fflush(g_output);
|
||||
PrintColorFmtMsg_ERR(_T("\nInternal compiler error #12345: error mmapping datablock to %d.\n"), size);
|
||||
}
|
||||
quit();
|
||||
}
|
||||
|
|
|
@ -233,8 +233,7 @@ int DefineList::add(const TCHAR *name, const TCHAR *value/*=_T("")*/)
|
|||
extern void quit();
|
||||
if (g_display_errors)
|
||||
{
|
||||
_ftprintf(g_output,_T("\nInternal compiler error #12345: GrowBuf realloc/malloc(%lu) failed.\n"), (unsigned long) size_in_bytes);
|
||||
fflush(g_output);
|
||||
PrintColorFmtMsg_ERR(_T("\nInternal compiler error #12345: GrowBuf realloc/malloc(%lu) failed.\n"), (unsigned long) size_in_bytes);
|
||||
}
|
||||
quit();
|
||||
}
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
#include <fstream>
|
||||
#include "tchar.h"
|
||||
#include "growbuf.h"
|
||||
#include "util.h"
|
||||
|
||||
/**
|
||||
* Implements a list of strings mapped into a straight buffer. It is
|
||||
|
@ -188,8 +189,7 @@ class SortedStringList
|
|||
extern void quit();
|
||||
if (g_display_errors)
|
||||
{
|
||||
_ftprintf(g_output,_T("\nInternal compiler error #12345: GrowBuf realloc/malloc(%lu) failed.\n"),(unsigned long)((_tcslen(name)+1)*sizeof(TCHAR)));
|
||||
fflush(g_output);
|
||||
PrintColorFmtMsg_ERR(_T("\nInternal compiler error #12345: GrowBuf realloc/malloc(%lu) failed.\n"),(unsigned long)((_tcslen(name)+1)*sizeof(TCHAR)));
|
||||
}
|
||||
quit();
|
||||
}
|
||||
|
|
|
@ -58,7 +58,7 @@ FILE* FileOpenUnicodeText(const TCHAR* file, const TCHAR* mode, BOOL* unicode)
|
|||
break;
|
||||
case CValidateUnicode::UTF_32LE:
|
||||
case CValidateUnicode::UTF_32BE:
|
||||
_ftprintf(g_output, _T("File '%s' has a BOM marked as %s which is not supported at this time.\n"),
|
||||
PrintColorFmtMsg_ERR(_T("File '%s' has a BOM marked as %s which is not supported at this time.\n"),
|
||||
file, CValidateUnicode::TypeToName(ftype));
|
||||
exit(-1);
|
||||
break;
|
||||
|
@ -72,7 +72,7 @@ FILE* FileOpenUnicodeText(const TCHAR* file, const TCHAR* mode, BOOL* unicode)
|
|||
}
|
||||
break;
|
||||
default:
|
||||
_ftprintf(g_output, _T("CValidateUnicode::CheckBOM() for file '%s' returned an unknown return value: %d\n"),
|
||||
PrintColorFmtMsg_ERR(_T("CValidateUnicode::CheckBOM() for file '%s' returned an unknown return value: %d\n"),
|
||||
file, ftype);
|
||||
exit(-1);
|
||||
break;
|
||||
|
|
|
@ -293,7 +293,7 @@ BOOL IsValidCodePage(UINT CodePage)
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
#define MY_ERROR_MSG(x) {if (g_display_errors) {_ftprintf(g_output,_T("%s"), x);}}
|
||||
#define MY_ERROR_MSG(x) {if (g_display_errors) {PrintColorFmtMsg_ERR(_T("%s"), x);}}
|
||||
|
||||
TCHAR *my_convert(const TCHAR *path)
|
||||
{
|
||||
|
@ -515,6 +515,59 @@ int sane_system(const TCHAR *command) {
|
|||
}
|
||||
|
||||
|
||||
void PrintColorFmtMsg(unsigned int type, const TCHAR *fmtstr, va_list args)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
const HANDLE hWin32Con = GetStdHandle(STD_OUTPUT_HANDLE);
|
||||
static INT32 contxtattrbak = -1;
|
||||
WORD txtattr = 0;
|
||||
if (contxtattrbak < 0)
|
||||
{
|
||||
if (-1 == contxtattrbak)
|
||||
{
|
||||
CONSOLE_SCREEN_BUFFER_INFO csbi;
|
||||
contxtattrbak = -2;
|
||||
if ( GetConsoleScreenBufferInfo(hWin32Con, &csbi) )
|
||||
{
|
||||
contxtattrbak = csbi.wAttributes;
|
||||
goto gottxtattrbak;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
gottxtattrbak:
|
||||
switch(type & 0xF)
|
||||
{
|
||||
case 0: goto resettxtattr;
|
||||
case 1: txtattr = FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_RED; break;
|
||||
case 2: txtattr = FOREGROUND_INTENSITY|FOREGROUND_RED; break;
|
||||
}
|
||||
SetConsoleTextAttribute(hWin32Con, txtattr);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (fmtstr) _vftprintf(g_output, fmtstr, args);
|
||||
fflush(g_output);
|
||||
|
||||
#ifdef _WIN32
|
||||
if (contxtattrbak >= 0 && !(0x10 & type))
|
||||
{
|
||||
resettxtattr:
|
||||
SetConsoleTextAttribute(hWin32Con, contxtattrbak);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void FlushOutputAndResetPrintColor()
|
||||
{
|
||||
fflush(g_output);
|
||||
#ifdef _WIN32
|
||||
PrintColorFmtMsg(0, NULL, (va_list)NULL); //va_list is just a pointer on windows so this is ok
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
static bool GetDLLVersionUsingRE(const tstring& filepath, DWORD& high, DWORD & low)
|
||||
{
|
||||
bool found = false;
|
||||
|
|
|
@ -56,6 +56,32 @@ tstring get_string_suffix(const tstring& str, const tstring& separator);
|
|||
|
||||
int sane_system(const TCHAR *command);
|
||||
|
||||
void PrintColorFmtMsg(unsigned int type, const TCHAR *fmtstr, va_list args);
|
||||
void FlushOutputAndResetPrintColor();
|
||||
#ifdef _WIN32
|
||||
#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
|
||||
#define ResetPrintColor()
|
||||
#define SetPrintColorWARN()
|
||||
#define SetPrintColorERR()
|
||||
#endif
|
||||
inline void PrintColorFmtMsg_WARN(const TCHAR *fmtstr, ...)
|
||||
{
|
||||
va_list val;
|
||||
va_start(val,fmtstr);
|
||||
PrintColorFmtMsg(1, fmtstr, val);
|
||||
va_end(val);
|
||||
}
|
||||
inline void PrintColorFmtMsg_ERR(const TCHAR *fmtstr, ...)
|
||||
{
|
||||
va_list val;
|
||||
va_start(val,fmtstr);
|
||||
PrintColorFmtMsg(2, fmtstr, val);
|
||||
va_end(val);
|
||||
}
|
||||
|
||||
#ifndef _WIN32
|
||||
TCHAR *CharPrev(const TCHAR *s, const TCHAR *p);
|
||||
TCHAR *CharNext(const TCHAR *s);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue