2023-08-23 21:47:09 -04:00
|
|
|
#include "hl.h"
|
|
|
|
|
2023-08-28 15:58:20 -04:00
|
|
|
// Terminal manipulation
|
|
|
|
#define TERMINAL_RESET "\033[0m"
|
|
|
|
|
|
|
|
#define TERMINAL_COLOR_FG_BLACK "\033[30m"
|
|
|
|
#define TERMINAL_COLOR_FG_RED "\033[31m"
|
|
|
|
#define TERMINAL_COLOR_FG_GREEN "\033[32m"
|
|
|
|
#define TERMINAL_COLOR_FG_YELLOW "\033[33m"
|
|
|
|
#define TERMINAL_COLOR_FG_BLUE "\033[34m"
|
|
|
|
#define TERMINAL_COLOR_FG_MAGENTA "\033[35m"
|
|
|
|
#define TERMINAL_COLOR_FG_CYAN "\033[36m"
|
|
|
|
#define TERMINAL_COLOR_FG_WHITE "\033[37m"
|
|
|
|
|
|
|
|
#define TERMINAL_COLOR_BG_BLACK "\033[40m"
|
|
|
|
#define TERMINAL_COLOR_BG_RED "\033[41m"
|
|
|
|
#define TERMINAL_COLOR_BG_GREEN "\033[42m"
|
|
|
|
#define TERMINAL_COLOR_BG_YELLOW "\033[43m"
|
|
|
|
#define TERMINAL_COLOR_BG_BLUE "\033[44m"
|
|
|
|
#define TERMINAL_COLOR_BG_MAGENTA "\033[45m"
|
|
|
|
#define TERMINAL_COLOR_BG_CYAN "\033[46m"
|
|
|
|
#define TERMINAL_COLOR_BG_WHITE "\033[47m"
|
|
|
|
|
|
|
|
#define TERMINAL_STYLE_BOLD "\033[1m"
|
|
|
|
#define TERMINAL_STYLE_ITALICS "\033[3m"
|
|
|
|
#define TERMINAL_STYLE_REVERSE "\033[7m"
|
|
|
|
|
2023-08-23 21:37:40 -04:00
|
|
|
typedef struct {
|
2023-08-28 18:19:40 -04:00
|
|
|
const char * attribute;
|
|
|
|
const char * foreground_color;
|
|
|
|
const char * background_color;
|
2023-08-23 21:37:40 -04:00
|
|
|
} terminal_hl_t;
|
|
|
|
|
2023-08-27 18:49:36 -04:00
|
|
|
extern display_t * cterm;
|
|
|
|
|
|
|
|
extern void cterm_render_callback(const char * const string,
|
|
|
|
const int length,
|
|
|
|
void * const attributes);
|
|
|
|
|
|
|
|
extern int terminal_hl_init(void);
|
|
|
|
|
|
|
|
display_t * cterm = &(display_t) {
|
|
|
|
.key = "cterm",
|
|
|
|
.callback = cterm_render_callback
|
|
|
|
};
|
|
|
|
|
2023-08-23 21:37:40 -04:00
|
|
|
void cterm_render_callback(const char * const string,
|
|
|
|
const int length,
|
|
|
|
void * const attributes) {
|
2023-08-28 18:19:40 -04:00
|
|
|
if (!length) {
|
2023-08-23 21:37:40 -04:00
|
|
|
fputs(TERMINAL_STYLE_BOLD, stdout);
|
|
|
|
putchar(*string);
|
|
|
|
fputs(TERMINAL_RESET, stdout);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
terminal_hl_t * term_hl = (terminal_hl_t*)attributes;
|
2023-08-28 09:40:36 -04:00
|
|
|
if (term_hl->attribute) {
|
|
|
|
fputs(term_hl->attribute, stdout);
|
|
|
|
}
|
|
|
|
if (term_hl->foreground_color) {
|
|
|
|
fputs(term_hl->foreground_color, stdout);
|
|
|
|
}
|
2023-08-23 21:37:40 -04:00
|
|
|
for (int i = 0; i < length; i++) {
|
|
|
|
putchar(*(string+i));
|
|
|
|
}
|
|
|
|
fputs(TERMINAL_RESET, stdout);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2023-08-28 18:19:40 -04:00
|
|
|
void fun(const char * attribute,
|
|
|
|
const char * color,
|
|
|
|
hl_group_t * * group){
|
|
|
|
terminal_hl_t * t = (terminal_hl_t *) malloc(sizeof(terminal_hl_t));
|
|
|
|
t->attribute = attribute;
|
|
|
|
t->foreground_color = color;
|
|
|
|
t->background_color = NULL;
|
2023-08-28 09:40:36 -04:00
|
|
|
(*group) = (hl_group_t *)malloc(sizeof(hl_group_t));
|
2023-08-28 18:19:40 -04:00
|
|
|
(*group)->link = NULL;
|
|
|
|
(*group)->attributes = (void*)t;
|
2023-08-28 09:40:36 -04:00
|
|
|
}
|
2023-08-23 21:37:40 -04:00
|
|
|
|
2023-08-27 18:49:36 -04:00
|
|
|
int terminal_hl_init(void) {
|
2023-08-23 21:37:40 -04:00
|
|
|
hl_init();
|
|
|
|
new_display_mode(cterm);
|
|
|
|
//
|
2023-08-28 09:40:36 -04:00
|
|
|
fun(TERMINAL_STYLE_BOLD, TERMINAL_COLOR_FG_CYAN, &special_hl);
|
|
|
|
fun(TERMINAL_STYLE_BOLD, TERMINAL_COLOR_FG_YELLOW, &control_hl);
|
|
|
|
fun(NULL, TERMINAL_COLOR_FG_YELLOW, &operator_hl);
|
|
|
|
fun(TERMINAL_STYLE_BOLD, TERMINAL_COLOR_FG_GREEN, &keyword_hl);
|
|
|
|
fun(TERMINAL_STYLE_BOLD, TERMINAL_COLOR_FG_BLUE, &comment_hl);
|
|
|
|
fun(TERMINAL_STYLE_BOLD, TERMINAL_COLOR_FG_RED, &string_literal_hl);
|
2023-08-23 21:37:40 -04:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|