| 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.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 | |
| 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: */ |