Commit | Line | Data |
---|---|---|
11a49e35 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 | ||
12 | void 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.attr; | |
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 | ||
68 | void 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: */ |