diff options
-rw-r--r-- | Makefile | 3 | ||||
-rw-r--r-- | buffer.c | 21 | ||||
-rw-r--r-- | config.c | 1 | ||||
-rw-r--r-- | main.c | 18 | ||||
-rw-r--r-- | syntax.c | 24 | ||||
-rw-r--r-- | ted.cfg | 1 | ||||
-rw-r--r-- | ted.h | 24 |
7 files changed, 63 insertions, 29 deletions
@@ -3,6 +3,7 @@ ALL_CFLAGS=$(CFLAGS) -Wall -Wextra -Wshadow -Wconversion -Wpedantic -pedantic -s LIBS=-lSDL2 -lGL -ldl -lm DEBUG_CFLAGS=$(ALL_CFLAGS) -DDEBUG -O0 -g RELEASE_CFLAGS=$(ALL_CFLAGS) -O3 +PROFILE_CFLAGS=$(ALL_CFLAGS) -O3 -DPROFILE=1 GLOBAL_DATA_DIR=/usr/share/ted LOCAL_DATA_DIR=/home/`logname`/.local/share/ted INSTALL_BIN_DIR=/usr/bin @@ -10,6 +11,8 @@ ted: *.[ch] text.o $(CC) main.c text.o -o ted $(DEBUG_CFLAGS) $(LIBS) release: *.[ch] $(CC) main.c -o ted $(RELEASE_CFLAGS) $(LIBS) +profile: *.[ch] + $(CC) main.c -o ted $(PROFILE_CFLAGS) $(LIBS) text.o: text.c text.h base.h lib/stb_truetype.h $(CC) text.c -c -o $@ $(DEBUG_CFLAGS) clean: @@ -2006,9 +2006,14 @@ void buffer_render(TextBuffer *buffer, Rect r) { Language language = buffer_language(buffer); // dynamic array of character types, to be filled by syntax_highlight SyntaxCharType *char_types = NULL; - for (u32 line_idx = 0; line_idx < start_line; ++line_idx) { - Line *line = &lines[line_idx]; - syntax_highlight(&syntax_state, language, line->str, line->len, NULL); + bool syntax_highlighting = language && settings->syntax_highlighting; + if (syntax_highlighting) { + for (u32 line_idx = 0; line_idx < start_line; ++line_idx) { + Line *line = &lines[line_idx]; + syntax_highlight(&syntax_state, language, line->str, line->len, NULL); + } + } else { + gl_color_rgba(colors[COLOR_TEXT]); } for (u32 line_idx = start_line; line_idx < nlines; ++line_idx) { @@ -2016,12 +2021,14 @@ void buffer_render(TextBuffer *buffer, Rect r) { if (arr_len(char_types) < line->len) { arr_set_len(char_types, line->len); } - syntax_highlight(&syntax_state, language, line->str, line->len, char_types); + if (language) + syntax_highlight(&syntax_state, language, line->str, line->len, char_types); for (u32 i = 0; i < line->len; ++i) { char32_t c = line->str[i]; - SyntaxCharType type = char_types[i]; - - gl_color_rgba(colors[syntax_char_type_to_color(type)]); + if (syntax_highlighting) { + SyntaxCharType type = char_types[i]; + gl_color_rgba(colors[syntax_char_type_to_color(type)]); + } switch (c) { case '\n': assert(0); break; case '\r': break; // for CRLF line endings @@ -174,6 +174,7 @@ void config_read(Ted *ted, char const *filename) { OptionBool const options_bool[] = { {"auto-indent", &settings->auto_indent}, {"auto-add-newline", &settings->auto_add_newline}, + {"syntax-highlighting", &settings->syntax_highlighting}, }; OptionU8 const options_u8[] = { {"tab-width", &settings->tab_width, 1, 100}, @@ -48,6 +48,12 @@ no_warn_end #include "command.c" #include "config.c" +#if PROFILE +#define PROFILE_TIME(var) double var = time_get_seconds(); +#else +#define PROFILE_TIME(var) +#endif + static void die(char const *fmt, ...) { char buf[256] = {0}; @@ -315,7 +321,6 @@ int main(int argc, char **argv) { window_width = ted->window_width, window_height = ted->window_height; while (SDL_PollEvent(&event)) { - TextBuffer *buffer = ted->active_buffer; u32 key_modifier = (u32)ctrl_down << KEY_MODIFIER_CTRL_BIT | (u32)shift_down << KEY_MODIFIER_SHIFT_BIT @@ -483,6 +488,8 @@ int main(int argc, char **argv) { } glClear(GL_COLOR_BUFFER_BIT); + PROFILE_TIME(frame_start); + Font *font = ted->font; if (ted->active_node) { @@ -570,6 +577,15 @@ int main(int argc, char **argv) { buffer_check_valid(&ted->line_buffer); #endif + + PROFILE_TIME(frame_end); + + #if PROFILE + { + printf("Frame: %.1f ms\n", (frame_end - frame_start) * 1000); + } + #endif + SDL_GL_SwapWindow(window); } @@ -21,12 +21,12 @@ ColorSetting syntax_char_type_to_color(SyntaxCharType t) { return COLOR_TEXT; } -static void syntax_highlight_c(SyntaxStateC *state, char32_t *line, u32 line_len, SyntaxCharType *char_types) { - (void)state; - bool in_preprocessor = state->continued_preprocessor; - bool in_string = state->continued_string; - bool in_single_line_comment = state->continued_single_line_comment; // this kind of comment :) - bool in_multi_line_comment = state->multi_line_comment; +static void syntax_highlight_c(SyntaxState *state_ptr, char32_t *line, u32 line_len, SyntaxCharType *char_types) { + SyntaxState state = *state_ptr; + bool in_preprocessor = (state & SYNTAX_STATE_PREPROCESSOR) != 0; + bool in_string = (state & SYNTAX_STATE_STRING) != 0; + bool in_single_line_comment = (state & SYNTAX_STATE_SINGLE_LINE_COMMENT) != 0; + bool in_multi_line_comment = (state & SYNTAX_STATE_MULTI_LINE_COMMENT) != 0; bool in_char = false; bool in_number = false; @@ -206,11 +206,11 @@ static void syntax_highlight_c(SyntaxStateC *state, char32_t *line, u32 line_len char_types[i] = type; } } - state->continued_single_line_comment = backslashes && in_single_line_comment; - state->continued_preprocessor = backslashes && in_preprocessor; - state->continued_string = backslashes && in_string; - - state->multi_line_comment = in_multi_line_comment; + *state_ptr = (SyntaxState)( + (backslashes && in_single_line_comment) << SYNTAX_STATE_SINGLE_LINE_COMMENT_SHIFT + | (backslashes && in_preprocessor) << SYNTAX_STATE_PREPROCESSOR_SHIFT + | (backslashes && in_string) << SYNTAX_STATE_STRING_SHIFT + | in_multi_line_comment << SYNTAX_STATE_MULTI_LINE_COMMENT_SHIFT); } // This is the main syntax highlighting function. It will determine which colors to use for each character. @@ -223,7 +223,7 @@ void syntax_highlight(SyntaxState *state, Language lang, char32_t *line, u32 lin memset(char_types, 0, line_len * sizeof *char_types); break; case LANG_C: - syntax_highlight_c(&state->c, line, line_len, char_types); + syntax_highlight_c(state, line, line_len, char_types); break; case LANG_COUNT: assert(0); break; } @@ -19,6 +19,7 @@ error-display-time = 10 auto-indent = on # automatically add a newline at the end of the file on save auto-add-newline = on +syntax-highlighting = on [keyboard] # motion and selection @@ -4,16 +4,21 @@ #define TEXT_SIZE_MIN 6 #define TEXT_SIZE_MAX 70 -typedef struct { - bool multi_line_comment:1; // are we in a multi-line comment? (delineated by /* */) - bool continued_single_line_comment:1; // if you add a \ to the end of a single-line comment, it is continued to the next line. - bool continued_preprocessor:1; // similar to above - bool continued_string:1; -} SyntaxStateC; +enum { + SYNTAX_STATE_SINGLE_LINE_COMMENT_SHIFT, + SYNTAX_STATE_MULTI_LINE_COMMENT_SHIFT, + SYNTAX_STATE_PREPROCESSOR_SHIFT, + SYNTAX_STATE_STRING_SHIFT, +}; + +enum { + SYNTAX_STATE_MULTI_LINE_COMMENT = 1<<SYNTAX_STATE_MULTI_LINE_COMMENT_SHIFT, // are we in a multi-line comment? (delineated by /* */) + SYNTAX_STATE_SINGLE_LINE_COMMENT = 1<<SYNTAX_STATE_SINGLE_LINE_COMMENT_SHIFT, // if you add a \ to the end of a single-line comment, it is continued to the next line. + SYNTAX_STATE_PREPROCESSOR = 1<<SYNTAX_STATE_PREPROCESSOR_SHIFT, // similar to above + SYNTAX_STATE_STRING = 1<<SYNTAX_STATE_STRING_SHIFT, +}; -typedef union { - SyntaxStateC c; -} SyntaxState; +typedef u16 SyntaxState; ENUM_U16 { LANG_NONE, @@ -49,6 +54,7 @@ typedef struct { u16 error_display_time; bool auto_indent; bool auto_add_newline; + bool syntax_highlighting; u8 tab_width; u8 cursor_width; u8 undo_save_time; |