#include "termcolour.h" #include "aliases.h" #include "platform.h" #include internal void print_coloured_text(const TerminalColourist *colourist, const char *text); #ifdef WAPP_PLATFORM_WINDOWS #define WIN32_LEAN_AND_MEAN #include internal WORD colours[COUNT_TERM_COLOUR] = { [WAPP_TERM_COLOUR_FG_BLACK] = 0, [WAPP_TERM_COLOUR_FG_RED] = FOREGROUND_RED, [WAPP_TERM_COLOUR_FG_GREEN] = FOREGROUND_GREEN, [WAPP_TERM_COLOUR_FG_BLUE] = FOREGROUND_BLUE, [WAPP_TERM_COLOUR_FG_CYAN] = FOREGROUND_GREEN | FOREGROUND_BLUE, [WAPP_TERM_COLOUR_FG_MAGENTA] = FOREGROUND_RED | FOREGROUND_BLUE, [WAPP_TERM_COLOUR_FG_YELLOW] = FOREGROUND_RED | FOREGROUND_GREEN, [WAPP_TERM_COLOUR_FG_WHITE] = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, [WAPP_TERM_COLOUR_FG_BR_BLACK] = FOREGROUND_INTENSITY, [WAPP_TERM_COLOUR_FG_BR_RED] = FOREGROUND_RED | FOREGROUND_INTENSITY, [WAPP_TERM_COLOUR_FG_BR_GREEN] = FOREGROUND_GREEN | FOREGROUND_INTENSITY, [WAPP_TERM_COLOUR_FG_BR_BLUE] = FOREGROUND_BLUE | FOREGROUND_INTENSITY, [WAPP_TERM_COLOUR_FG_BR_CYAN] = FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY, [WAPP_TERM_COLOUR_FG_BR_MAGENTA] = FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY, [WAPP_TERM_COLOUR_FG_BR_YELLOW] = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY, [WAPP_TERM_COLOUR_FG_BR_WHITE] = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY, }; #else internal const char *colours[COUNT_TERM_COLOUR] = { [WAPP_TERM_COLOUR_FG_BLACK] = "\033[30m", [WAPP_TERM_COLOUR_FG_RED] = "\033[31m", [WAPP_TERM_COLOUR_FG_GREEN] = "\033[32m", [WAPP_TERM_COLOUR_FG_BLUE] = "\033[34m", [WAPP_TERM_COLOUR_FG_CYAN] = "\033[36m", [WAPP_TERM_COLOUR_FG_MAGENTA] = "\033[35m", [WAPP_TERM_COLOUR_FG_YELLOW] = "\033[33m", [WAPP_TERM_COLOUR_FG_WHITE] = "\033[37m", [WAPP_TERM_COLOUR_FG_BR_BLACK] = "\033[90m", [WAPP_TERM_COLOUR_FG_BR_RED] = "\033[91m", [WAPP_TERM_COLOUR_FG_BR_GREEN] = "\033[92m", [WAPP_TERM_COLOUR_FG_BR_BLUE] = "\033[94m", [WAPP_TERM_COLOUR_FG_BR_CYAN] = "\033[96m", [WAPP_TERM_COLOUR_FG_BR_MAGENTA] = "\033[95m", [WAPP_TERM_COLOUR_FG_BR_YELLOW] = "\033[93m", [WAPP_TERM_COLOUR_FG_BR_WHITE] = "\033[97m", }; #endif /* ifdef WAPP_PLATFORM_WINDOWS */ TerminalColourist wapp_termcolour_get_colourist(void) { TerminalColourist colourist; #ifdef WAPP_PLATFORM_WINDOWS // create handle colourist.handle = GetStdHandle(STD_OUTPUT_HANDLE); // get console colour information CONSOLE_SCREEN_BUFFER_INFO csbi; GetConsoleScreenBufferInfo(colourist.handle, &csbi); colourist.default_colour = csbi.wAttributes; #else colourist.default_colour = "\033[0m"; #endif // ifdef WAPP_PLATFORM_WINDOWS colourist.current_colour = colourist.default_colour; return colourist; } void wapp_termcolour_print_text(TerminalColourist *colourist, const char *text, TerminalColour colour) { if (colour < WAPP_TERM_COLOUR_FG_BLACK || colour > WAPP_TERM_COLOUR_FG_BR_WHITE) { return; } colourist->current_colour = colours[colour]; print_coloured_text(colourist, text); } void wapp_termcolour_clear_colour(TerminalColourist *colourist) { colourist->current_colour = colourist->default_colour; print_coloured_text(colourist, ""); } internal void print_coloured_text(const TerminalColourist *colourist, const char *text) { #ifdef WAPP_PLATFORM_WINDOWS SetConsoleTextAttribute(colourist->handle, colourist->current_colour); printf("%s", text); #else printf("%s%s", colourist->current_colour, text); #endif // ifdef WAPP_PLATFORM_WINDOWS }