best makefile
[webserver.git] / color.c
CommitLineData
8512671a
LM
1#ifdef _WIN32
2#include <windows.h>
3#else
4#include <unistd.h>
5#include <stdio.h>
6#endif
7
8#include "color.h"
9
10#ifdef _WIN32 /* Windows */
11
12void color_set (FILE *fid, color_e color)
13{
14 /* save default configuration */
15 static WORD init = 0;
16 if (init == 0) {
17 CONSOLE_SCREEN_BUFFER_INFO info;
18 GetConsoleScreenBufferInfo (GetStdHandle (STD_OUTPUT_HANDLE), &info);
19 init = info.wAttributes;
20 }
21
22 /* default attribute */
23 WORD attr = 0;
24
25 /* define foreground color */
26 if (FG_DEFAULT == (color & FG_MASK)) {
27 attr |= init & (FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
28 } else {
29 attr |= (color & FG_BRIGHT) ? FOREGROUND_INTENSITY : 0;
30 switch (color & FG_MASK) {
31 case FG_RED: attr |= FOREGROUND_RED; break;
32 case FG_GREEN: attr |= FOREGROUND_GREEN; break;
33 case FG_BLUE: attr |= FOREGROUND_BLUE; break;
34 case FG_YELLOW: attr |= FOREGROUND_RED | FOREGROUND_GREEN; break;
35 case FG_MAGENTA: attr |= FOREGROUND_RED | FOREGROUND_BLUE; break;
36 case FG_CYAN: attr |= FOREGROUND_GREEN | FOREGROUND_BLUE; break;
37 case FG_WHITE: attr |= FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE; break;
38 }
39 }
40
41 /* define background color */
42 if (BG_DEFAULT == (color & BG_MASK)) {
43 attr |= init & (BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | BACKGROUND_INTENSITY);
44 } else {
45 attr |= (color & BG_BRIGHT) ? BACKGROUND_INTENSITY : 0;
46 switch (color&BG_MASK) {
47 case BG_RED: attr |= BACKGROUND_RED; break;
48 case BG_GREEN: attr |= BACKGROUND_GREEN; break;
49 case BG_BLUE: attr |= BACKGROUND_BLUE; break;
50 case BG_YELLOW: attr |= BACKGROUND_RED | BACKGROUND_GREEN; break;
51 case BG_MAGENTA: attr |= BACKGROUND_RED | BACKGROUND_BLUE; break;
52 case BG_CYAN: attr |= BACKGROUND_GREEN | BACKGROUND_BLUE; break;
53 case BG_WHITE: attr |= BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE; break;
54 }
55 }
56
57 /* define underline state */
58 if (color & UNDERLINE) {
59 attr |= COMMON_LVB_UNDERSCORE;
60 }
61
62 /* set text attribute */
63 SetConsoleTextAttribute (GetStdHandle ((fid == stdout) ? STD_OUTPUT_HANDLE : STD_ERROR_HANDLE), attr);
64}
65
66#else /* Linux */
67
68void color_set (FILE *fid, color_e color)
69{
70 /* check if it's a terminal */
71 if (!isatty (fileno (fid))) {
72 return;
73 }
74
75 /* default color */
76 fprintf (fid, "\033[m");
77
78 /* set foreground color */
79 if (FG_DEFAULT != (color & FG_MASK)) {
80 fprintf (fid, "\033[%dm", 29 + (color & FG_MASK) + ((color & FG_BRIGHT) ? 60 : 0));
81 }
82
83 /* set background color */
84 if (BG_DEFAULT != (color & BG_MASK)) {
85 fprintf (fid, "\033[%dm", 39 + ((color & BG_MASK ) >> 8) + ((color & BG_BRIGHT) ? 60 : 0));
86 }
87
88 /* set underline state */
89 if (color & UNDERLINE) {
90 fprintf (fid, "\033[4m");
91 }
92}
93
94#endif /* _WIN32 */
95
96/* vim: set ts=4 sw=4 et: */