Skip to content

Commit

Permalink
Merge pull request #3919 from 9rnsr/fix13019
Browse files Browse the repository at this point in the history
Issue 13019 - Different color for "Warning:"
  • Loading branch information
WalterBright committed Aug 30, 2014
2 parents 6e63083 + 1e27b1a commit 873ea24
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 23 deletions.
36 changes: 25 additions & 11 deletions src/color.c
Expand Up @@ -25,14 +25,19 @@
#endif

#if _WIN32
static CONSOLE_SCREEN_BUFFER_INFO *consoleAttributes()
static WORD consoleAttributes(HANDLE h)
{
static CONSOLE_SCREEN_BUFFER_INFO sbi;
static bool sbi_inited = false;
if (!sbi_inited)
sbi_inited = GetConsoleScreenBufferInfo(GetStdHandle(STD_ERROR_HANDLE), &sbi) != FALSE;
return &sbi;
sbi_inited = GetConsoleScreenBufferInfo(h, &sbi) != FALSE;
return sbi.wAttributes;
}

enum
{
FOREGROUND_WHITE = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE,
};
#endif

bool isConsoleColorSupported()
Expand All @@ -47,29 +52,38 @@ bool isConsoleColorSupported()
#endif
}

void setConsoleColorBright()
void setConsoleColorBright(bool bright)
{
#if _WIN32
SetConsoleTextAttribute(GetStdHandle(STD_ERROR_HANDLE), consoleAttributes()->wAttributes | FOREGROUND_INTENSITY);
HANDLE h = GetStdHandle(STD_ERROR_HANDLE);
WORD attr = consoleAttributes(h);
SetConsoleTextAttribute(h, attr | (bright ? FOREGROUND_INTENSITY : 0));
#else
fprintf(stderr, "\033[1m");
fprintf(stderr, "\033[%dm", bright ? 1 : 0);
#endif
}

void setConsoleColorError()
void setConsoleColor(COLOR color, bool bright)
{
#if _WIN32
enum { FOREGROUND_WHITE = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE };
SetConsoleTextAttribute(GetStdHandle(STD_ERROR_HANDLE), (consoleAttributes()->wAttributes & ~FOREGROUND_WHITE) | FOREGROUND_RED | FOREGROUND_INTENSITY);
HANDLE h = GetStdHandle(STD_ERROR_HANDLE);
WORD attr = consoleAttributes(h);
attr = (attr & ~(FOREGROUND_WHITE | FOREGROUND_INTENSITY)) |
((color & COLOR_RED) ? FOREGROUND_RED : 0) |
((color & COLOR_GREEN) ? FOREGROUND_GREEN : 0) |
((color & COLOR_BLUE) ? FOREGROUND_BLUE : 0) |
(bright ? FOREGROUND_INTENSITY : 0);
SetConsoleTextAttribute(h, attr);
#else
fprintf(stderr, "\033[1;31m");
fprintf(stderr, "\033[%d;%dm", bright ? 1 : 0, 30 + (int)color);
#endif
}

void resetConsoleColor()
{
#if _WIN32
SetConsoleTextAttribute(GetStdHandle(STD_ERROR_HANDLE), consoleAttributes()->wAttributes);
HANDLE h = GetStdHandle(STD_ERROR_HANDLE);
SetConsoleTextAttribute(h, consoleAttributes(h));
#else
fprintf(stderr, "\033[m");
#endif
Expand Down
17 changes: 15 additions & 2 deletions src/color.h
Expand Up @@ -9,8 +9,21 @@
* https://github.com/D-Programming-Language/dmd/blob/master/src/mars.c
*/

enum COLOR
{
COLOR_BLACK = 0,
COLOR_RED = 1,
COLOR_GREEN = 2,
COLOR_BLUE = 4,

COLOR_YELLOW = COLOR_RED | COLOR_GREEN,
COLOR_MAGENTA = COLOR_RED | COLOR_BLUE,
COLOR_CYAN = COLOR_GREEN | COLOR_BLUE,
COLOR_WHITE = COLOR_RED | COLOR_GREEN | COLOR_BLUE,
};

extern bool isConsoleColorSupported();
extern void setConsoleColorBright();
extern void setConsoleColorError();
extern void setConsoleColorBright(bool bright);
extern void setConsoleColor(COLOR color, bool bright);
extern void resetConsoleColor();

18 changes: 9 additions & 9 deletions src/mars.c
Expand Up @@ -245,19 +245,19 @@ void deprecation(Loc loc, const char *format, ...)
}

// Just print, doesn't care about gagging
void verrorPrint(Loc loc, const char *header, const char *format, va_list ap,
const char *p1, const char *p2)
void verrorPrint(Loc loc, COLOR headerColor, const char *header, const char *format, va_list ap,
const char *p1 = NULL, const char *p2 = NULL)
{
char *p = loc.toChars();

if (global.params.color)
setConsoleColorBright();
setConsoleColorBright(true);
if (*p)
fprintf(stderr, "%s: ", p);
mem.free(p);

if (global.params.color)
setConsoleColorError();
setConsoleColor(headerColor, true);
fputs(header, stderr);
if (global.params.color)
resetConsoleColor();
Expand All @@ -277,15 +277,15 @@ void verror(Loc loc, const char *format, va_list ap,
{
if (!global.gag)
{
verrorPrint(loc, header, format, ap, p1, p2);
verrorPrint(loc, COLOR_RED, header, format, ap, p1, p2);
if (global.errors >= 20) // moderate blizzard of cascading messages
fatal();
//halt();
}
else
{
//fprintf(stderr, "(gag:%d) ", global.gag);
//verrorPrint(loc, header, format, ap, p1, p2);
//verrorPrint(loc, COLOR_RED, header, format, ap, p1, p2);
global.gaggedErrors++;
}
global.errors++;
Expand All @@ -295,14 +295,14 @@ void verror(Loc loc, const char *format, va_list ap,
void verrorSupplemental(Loc loc, const char *format, va_list ap)
{
if (!global.gag)
verrorPrint(loc, " ", format, ap);
verrorPrint(loc, COLOR_RED, " ", format, ap);
}

void vwarning(Loc loc, const char *format, va_list ap)
{
if (global.params.warnings && !global.gag)
{
verrorPrint(loc, "Warning: ", format, ap);
verrorPrint(loc, COLOR_YELLOW, "Warning: ", format, ap);
//halt();
if (global.params.warnings == 1)
global.warnings++; // warnings don't count if gagged
Expand All @@ -316,7 +316,7 @@ void vdeprecation(Loc loc, const char *format, va_list ap,
if (global.params.useDeprecated == 0)
verror(loc, format, ap, p1, p2, header);
else if (global.params.useDeprecated == 2 && !global.gag)
verrorPrint(loc, header, format, ap, p1, p2);
verrorPrint(loc, COLOR_BLUE, header, format, ap, p1, p2);
}

void readFile(Loc loc, File *f)
Expand Down
1 change: 0 additions & 1 deletion src/mars.h
Expand Up @@ -361,7 +361,6 @@ void errorSupplemental(Loc loc, const char *format, ...);
void verror(Loc loc, const char *format, va_list ap, const char *p1 = NULL, const char *p2 = NULL, const char *header = "Error: ");
void vwarning(Loc loc, const char *format, va_list);
void verrorSupplemental(Loc loc, const char *format, va_list ap);
void verrorPrint(Loc loc, const char *header, const char *format, va_list ap, const char *p1 = NULL, const char *p2 = NULL);
void vdeprecation(Loc loc, const char *format, va_list ap, const char *p1 = NULL, const char *p2 = NULL);

#if defined(__GNUC__) || defined(__clang__)
Expand Down

0 comments on commit 873ea24

Please sign in to comment.