diff --git a/source/hl.h b/source/hl.h index 4af59eb..22ae2a7 100644 --- a/source/hl.h +++ b/source/hl.h @@ -16,6 +16,10 @@ typedef enum { REGION } token_type_t; +typedef void (*attribute_callback_t) (const char * const string, + const int length, + void * const attributes); + typedef struct { char * key; attribute_callback_t callback; @@ -33,10 +37,6 @@ typedef struct { char * syntax; } token_t; -typedef void (*attribute_callback_t) (const char * const string, - const int length, - void * const attributes); - // GLOBALS token_t * token_table[1000]; @@ -225,6 +225,9 @@ void render_string(const char * const string, // ------------------------- // ### Library Mangement ### // ------------------------- +hl_group_t * keyword_hl = NULL; +hl_group_t * preprocessor_hl = NULL; +hl_group_t * symbol_hl = NULL; int hl_init(void) { return 0; diff --git a/source/hl_c.inc b/source/hl_c.inc new file mode 100644 index 0000000..8ce987f --- /dev/null +++ b/source/hl_c.inc @@ -0,0 +1,17 @@ +const char * c_keywords[] = { + "register", "volatile", "auto", "const", "static", "extern", "if", "else", + "do", "while", "for", "continue", "switch", "case", "default", "break", + "enum", "union", "struct", "typedef", "goto", "void", "return", "sizeof", + "char", "short", "int", "long", "signed", "unsigned", "float", "double", + NULL +}; + +const char * preprocessor_keywords[] = { + "#include", "#pragma", "#define", "#undef", "#ifdef", "#ifndef", "#elifdef", "#elifndef", + "#if", "#elif", "#else", "#endif", "#embed", "#line", "#error", "#warning", + NULL +}; + +new_char_tokens("&|()[]{}*,", symbol_hl); +new_keyword_tokens(c_keywords, keyword_hl); +new_keyword_tokens(preprocessor_keywords, preprocessor_hl); diff --git a/source/main.c b/source/main.c index 6afc7a1..5027f93 100644 --- a/source/main.c +++ b/source/main.c @@ -10,31 +10,6 @@ static char * buffer = NULL; static size_t buffer_size = 0; -typedef struct { - char * attribute; - char * foreground_color; - char * background_color; -} terminal_hl_t; - -void cterm_render_callback(const char * const string, - const int length, - void * const attributes) { - if(!length){ - fputs(TERMINAL_STYLE_BOLD, stdout); - putchar(*string); - fputs(TERMINAL_RESET, stdout); - return; - } - - terminal_hl_t * term_hl = (terminal_hl_t*)attributes; - fputs(term_hl->attribute, stdout); - fputs(term_hl->foreground_color, stdout); - for (int i = 0; i < length; i++) { - putchar(*(string+i)); - } - fputs(TERMINAL_RESET, stdout); -} - int main(int argc, char * * argv) { UNUSED(argc); @@ -59,62 +34,9 @@ int main(int argc, buffer[buffer_size - 1] = '\0'; // Highlight init - hl_init(); - const char * c_keywords[] = { - "register", "volatile", "auto", "const", "static", "extern", "if", "else", - "do", "while", "for", "continue", "switch", "case", "default", "break", - "enum", "union", "struct", "typedef", "goto", "void", "return", "sizeof", - "char", "short", "int", "long", "signed", "unsigned", "float", "double", - NULL - }; - - const char * preprocessor_keywords[] = { - "#include", "#pragma", "#define", "#undef", "#ifdef", "#ifndef", "#elifdef", "#elifndef", - "#if", "#elif", "#else", "#endif", "#embed", "#line", "#error", "#warning", - NULL - }; - - + terminal_hl_init(); // - display_t * cterm = &(display_t) { - .key = "cterm", - .callback = cterm_render_callback - }; - // - terminal_hl_t terminal_keyword_hl = (terminal_hl_t) { - .attribute = TERMINAL_STYLE_BOLD, - .foreground_color = TERMINAL_COLOR_FG_GREEN, - .background_color = NULL - }; - hl_group_t keyword_hl = (hl_group_t) { - .link = NULL, - .attributes = (void*)&terminal_keyword_hl - }; - // - terminal_hl_t terminal_preprocessor_hl = (terminal_hl_t) { - .attribute = TERMINAL_STYLE_BOLD, - .foreground_color = TERMINAL_COLOR_FG_BLUE, - .background_color = NULL - }; - hl_group_t preprocessor_hl = (hl_group_t) { - .link = NULL, - .attributes = (void*)&terminal_preprocessor_hl - }; - // - terminal_hl_t terminal_symbol_hl = (terminal_hl_t) { - .attribute = TERMINAL_STYLE_BOLD, - .foreground_color = TERMINAL_COLOR_FG_YELLOW, - .background_color = NULL - }; - hl_group_t symbol_hl = (hl_group_t) { - .link = NULL, - .attributes = (void*)&terminal_symbol_hl - }; - // - new_display_mode(cterm); - new_char_tokens("&|()[]{}*,", &symbol_hl); - new_keyword_tokens(c_keywords, &keyword_hl); - new_keyword_tokens(preprocessor_keywords, &preprocessor_hl); + #include "hl_c.inc"; // render_string(buffer, "cterm"); putchar('\n'); diff --git a/source/terminal_hl.h b/source/terminal_hl.h new file mode 100644 index 0000000..5d4e2c7 --- /dev/null +++ b/source/terminal_hl.h @@ -0,0 +1,67 @@ +typedef struct { + char * attribute; + char * foreground_color; + char * background_color; +} terminal_hl_t; + +void cterm_render_callback(const char * const string, + const int length, + void * const attributes) { + if(!length){ + fputs(TERMINAL_STYLE_BOLD, stdout); + putchar(*string); + fputs(TERMINAL_RESET, stdout); + return; + } + + terminal_hl_t * term_hl = (terminal_hl_t*)attributes; + fputs(term_hl->attribute, stdout); + fputs(term_hl->foreground_color, stdout); + for (int i = 0; i < length; i++) { + putchar(*(string+i)); + } + fputs(TERMINAL_RESET, stdout); +} + +display_t * cterm = &(display_t) { + .key = "cterm", + .callback = cterm_render_callback +}; + + +int terminal_hl_init(void){ + hl_init(); + new_display_mode(cterm); + // + terminal_hl_t terminal_keyword_hl = (terminal_hl_t) { + .attribute = TERMINAL_STYLE_BOLD, + .foreground_color = TERMINAL_COLOR_FG_GREEN, + .background_color = NULL + }; + keyword_hl = (hl_group_t) { + .link = NULL, + .attributes = (void*)&terminal_keyword_hl + }; + // + terminal_hl_t terminal_preprocessor_hl = (terminal_hl_t) { + .attribute = TERMINAL_STYLE_BOLD, + .foreground_color = TERMINAL_COLOR_FG_BLUE, + .background_color = NULL + }; + preprocessor_hl = (hl_group_t) { + .link = NULL, + .attributes = (void*)&terminal_preprocessor_hl + }; + // + terminal_hl_t terminal_symbol_hl = (terminal_hl_t) { + .attribute = TERMINAL_STYLE_BOLD, + .foreground_color = TERMINAL_COLOR_FG_YELLOW, + .background_color = NULL + }; + symbol_hl = (hl_group_t) { + .link = NULL, + .attributes = (void*)&terminal_symbol_hl + }; + + return 0; +}