From 1a416a917d74d956469e6e80cf4bb519e9474c91 Mon Sep 17 00:00:00 2001 From: cflip Date: Tue, 17 Jan 2023 10:39:21 -0700 Subject: Rename 'rows' to 'lines' everywhere For whatever reason lines were called rows in the code, so this refactor changes that name everywhere. The name 'row' is still used in some places to refer to the unit of height in the screen. --- Makefile | 2 +- editor.c | 137 +++++++++++++++++++++++++++++---------------------------- editor.h | 9 ++-- file.c | 18 ++++---- input.c | 9 ++-- line.c | 150 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ line.h | 33 ++++++++++++++ row.c | 149 -------------------------------------------------------------- row.h | 30 ------------- syntax.c | 58 ++++++++++++------------ syntax.h | 4 +- window.c | 2 +- 12 files changed, 307 insertions(+), 294 deletions(-) create mode 100644 line.c create mode 100644 line.h delete mode 100644 row.c delete mode 100644 row.h diff --git a/Makefile b/Makefile index d5c6c3c..d543860 100644 --- a/Makefile +++ b/Makefile @@ -9,7 +9,7 @@ OBJS=main.o \ file.o \ font.o \ input.o \ - row.o \ + line.o \ syntax.o \ window.o diff --git a/editor.c b/editor.c index 016fa2e..963a4e4 100644 --- a/editor.c +++ b/editor.c @@ -7,20 +7,19 @@ #include #include -#include "buffer.h" #include "input.h" #include "syntax.h" -#include "row.h" +#include "window.h" void init_editor(struct editor_state* editor) { editor->cursor_x = 0; editor->cursor_y = 0; editor->cursor_display_x = 0; - editor->row_offset = 0; + editor->line_offset = 0; editor->col_offset = 0; - editor->row_count = 0; - editor->rows = NULL; + editor->num_lines = 0; + editor->lines = NULL; editor->dirty = 0; editor->filename = NULL; editor->status_message[0] = '\0'; @@ -58,16 +57,16 @@ void editor_move_left(struct editor_state *editor) editor->cursor_x--; } else if (editor->cursor_y > 0) { editor->cursor_y--; - editor->cursor_x = editor->rows[editor->cursor_y].size; + editor->cursor_x = editor->lines[editor->cursor_y].size; } } void editor_move_right(struct editor_state *editor) { - struct editor_row* row = (editor->cursor_y >= editor->row_count) ? NULL : &editor->rows[editor->cursor_y]; - if (row && editor->cursor_x < row->size) { + line_t *line = (editor->cursor_y >= editor->num_lines) ? NULL : &editor->lines[editor->cursor_y]; + if (line && editor->cursor_x < line->size) { editor->cursor_x++; - } else if (row && editor->cursor_x == row->size) { + } else if (line && editor->cursor_x == line->size) { editor->cursor_y++; editor->cursor_x = 0; } @@ -78,43 +77,49 @@ void editor_move_up(struct editor_state *editor) if (editor->cursor_y != 0) editor->cursor_y--; - struct editor_row *row = (editor->cursor_y >= editor->row_count) ? NULL : &editor->rows[editor->cursor_y]; - int row_length = row ? row->size : 0; - if (editor->cursor_x > row_length) - editor->cursor_x = row_length; + line_t *line = (editor->cursor_y >= editor->num_lines) ? NULL : &editor->lines[editor->cursor_y]; + int line_length = line ? line->size : 0; + if (editor->cursor_x > line_length) + editor->cursor_x = line_length; } void editor_move_down(struct editor_state *editor) { - if (editor->cursor_y != editor->row_count - 1) + if (editor->cursor_y != editor->num_lines - 1) editor->cursor_y++; - struct editor_row *row = (editor->cursor_y >= editor->row_count) ? NULL : &editor->rows[editor->cursor_y]; - int row_length = row ? row->size : 0; - if (editor->cursor_x > row_length) - editor->cursor_x = row_length; + line_t *line = (editor->cursor_y >= editor->num_lines) ? NULL : &editor->lines[editor->cursor_y]; + int line_length = line ? line->size : 0; + if (editor->cursor_x > line_length) + editor->cursor_x = line_length; +} + +void editor_move_end(struct editor_state *editor) +{ + if (editor->cursor_y < editor->num_lines) + editor->cursor_x = editor->lines[editor->cursor_y].size; } void editor_insert_char(struct editor_state* editor, int c) { - if (editor->cursor_y == editor->row_count) - insert_row(editor, editor->row_count, "", 0); + if (editor->cursor_y == editor->num_lines) + editor_insert_line(editor, editor->num_lines, "", 0); - row_insert_char(editor, &editor->rows[editor->cursor_y], editor->cursor_x, c); + line_insert_char(editor, &editor->lines[editor->cursor_y], editor->cursor_x, c); editor->cursor_x++; } void editor_insert_newline(struct editor_state* editor) { if (editor->cursor_x == 0) { - insert_row(editor, editor->cursor_y, "", 0); + editor_insert_line(editor, editor->cursor_y, "", 0); } else { - struct editor_row* row = &editor->rows[editor->cursor_y]; - insert_row(editor, editor->cursor_y + 1, &row->chars[editor->cursor_x], row->size - editor->cursor_x); - row = &editor->rows[editor->cursor_y]; - row->size = editor->cursor_x; - row->chars[row->size] = '\0'; - update_row(editor, row); + line_t *line = &editor->lines[editor->cursor_y]; + editor_insert_line(editor, editor->cursor_y + 1, &line->chars[editor->cursor_x], line->size - editor->cursor_x); + line = &editor->lines[editor->cursor_y]; + line->size = editor->cursor_x; + line->chars[line->size] = '\0'; + editor_update_line(editor, line); } editor->cursor_y++; editor->cursor_x = 0; @@ -122,33 +127,33 @@ void editor_insert_newline(struct editor_state* editor) void editor_delete_char(struct editor_state* editor) { - if (editor->cursor_y == editor->row_count) + if (editor->cursor_y == editor->num_lines) return; if (editor->cursor_x == 0 && editor->cursor_y == 0) return; - struct editor_row* row = &editor->rows[editor->cursor_y]; + line_t *line = &editor->lines[editor->cursor_y]; if (editor->cursor_x > 0) { - row_delete_char(editor, row, editor->cursor_x - 1); + line_delete_char(editor, line, editor->cursor_x - 1); editor->cursor_x--; } else { - editor->cursor_x = editor->rows[editor->cursor_y - 1].size; - row_append_string(editor, &editor->rows[editor->cursor_y - 1], row->chars, row->size); - delete_row(editor, editor->cursor_y); + editor->cursor_x = editor->lines[editor->cursor_y - 1].size; + line_append_string(editor, &editor->lines[editor->cursor_y - 1], line->chars, line->size); + editor_delete_line(editor, editor->cursor_y); editor->cursor_y--; } } void editor_add_line_above(struct editor_state* editor) { - insert_row(editor, editor->cursor_y, "", 0); + editor_insert_line(editor, editor->cursor_y, "", 0); editor->cursor_x = 0; } void editor_add_line_below(struct editor_state* editor) { - insert_row(editor, editor->cursor_y + 1, "", 0); + editor_insert_line(editor, editor->cursor_y + 1, "", 0); editor->cursor_y++; editor->cursor_x = 0; } @@ -162,7 +167,7 @@ static void editor_find_callback(struct editor_state* editor, char* query, int k static char* saved_highlight; if (saved_highlight) { - memset(editor->rows[saved_highlight_line].highlight, (size_t)saved_highlight, editor->rows[saved_highlight_line].render_size); + memset(editor->lines[saved_highlight_line].highlight, (size_t)saved_highlight, editor->lines[saved_highlight_line].render_size); free(saved_highlight); saved_highlight = NULL; } @@ -187,27 +192,27 @@ static void editor_find_callback(struct editor_state* editor, char* query, int k int current = last_match; int i; - for (i = 0; i < editor->row_count; i++) { + for (i = 0; i < editor->num_lines; i++) { current += direction; if (current == -1) { - current = editor->row_count - 1; - } else if (current == editor->row_count) { + current = editor->num_lines - 1; + } else if (current == editor->num_lines) { current = 0; } - struct editor_row* row = &editor->rows[current]; - char* match = strstr(row->render, query); + line_t *line = &editor->lines[current]; + char* match = strstr(line->render, query); if (match) { last_match = current; editor->cursor_y = current; - editor->cursor_x = row_display_x_to_x(row, match - row->render); - editor->row_offset = editor->row_count; + editor->cursor_x = row_display_x_to_x(line, match - line->render); + editor->line_offset = editor->num_lines; saved_highlight_line = current; - saved_highlight = malloc(row->render_size); - memcpy(saved_highlight, row->highlight, row->render_size); - memset(&row->highlight[match - row->render], HIGHLIGHT_MATCH, strlen(query)); + saved_highlight = malloc(line->render_size); + memcpy(saved_highlight, line->highlight, line->render_size); + memset(&line->highlight[match - line->render], HIGHLIGHT_MATCH, strlen(query)); break; } } @@ -218,7 +223,7 @@ void editor_find(struct editor_state* editor) int saved_cursor_x = editor->cursor_x; int saved_cursor_y = editor->cursor_y; int saved_col_offset = editor->col_offset; - int saved_row_offset = editor->row_offset; + int saved_line_offset = editor->line_offset; char* query = editor_prompt(editor, "Search: %s (Use Esc/Arrows/Enter)", editor_find_callback); if (query) { @@ -227,21 +232,21 @@ void editor_find(struct editor_state* editor) editor->cursor_x = saved_cursor_x; editor->cursor_y = saved_cursor_y; editor->col_offset = saved_col_offset; - editor->row_offset = saved_row_offset; + editor->line_offset = saved_line_offset; } } void editor_scroll(struct editor_state* editor) { editor->cursor_display_x = 0; - if (editor->cursor_y < editor->row_count) - editor->cursor_display_x = row_x_to_display_x(&editor->rows[editor->cursor_y], editor->cursor_x); + if (editor->cursor_y < editor->num_lines) + editor->cursor_display_x = row_x_to_display_x(&editor->lines[editor->cursor_y], editor->cursor_x); - if (editor->cursor_y < editor->row_offset) - editor->row_offset = editor->cursor_y; + if (editor->cursor_y < editor->line_offset) + editor->line_offset = editor->cursor_y; - if (editor->cursor_y >= editor->row_offset + editor->screen_rows) - editor->row_offset = editor->cursor_y - editor->screen_rows + 1; + if (editor->cursor_y >= editor->line_offset + editor->screen_rows) + editor->line_offset = editor->cursor_y - editor->screen_rows + 1; if (editor->cursor_display_x < editor->col_offset) editor->col_offset = editor->cursor_display_x; @@ -254,9 +259,9 @@ void editor_draw_rows(struct editor_state* editor, struct append_buffer* buffer) { int y; for (y = 0; y < editor->screen_rows; y++) { - int file_row = y + editor->row_offset; - if (file_row >= editor->row_count) { - if (editor->row_count == 0 && y == editor->screen_rows / 3) { + int file_line = y + editor->line_offset; + if (file_line >= editor->num_lines) { + if (editor->num_lines == 0 && y == editor->screen_rows / 3) { char welcome[80]; int welcome_length = snprintf(welcome, sizeof(welcome), "Welcome to cflip text editor"); @@ -277,13 +282,13 @@ void editor_draw_rows(struct editor_state* editor, struct append_buffer* buffer) ab_append(buffer, "~", 1); } } else { - int length = editor->rows[file_row].render_size - editor->col_offset; + int length = editor->lines[file_line].render_size - editor->col_offset; if (length < 0) length = 0; if (length > editor->screen_cols) length = editor->screen_cols; - char* c = &editor->rows[file_row].render[editor->col_offset]; - unsigned char* highlight = &editor->rows[file_row].highlight[editor->col_offset]; + char* c = &editor->lines[file_line].render[editor->col_offset]; + unsigned char* highlight = &editor->lines[file_line].highlight[editor->col_offset]; int current_colour = -1; int j; @@ -309,8 +314,8 @@ void editor_draw_rows(struct editor_state* editor, struct append_buffer* buffer) void editor_draw_status_bar(struct editor_state* editor, struct append_buffer* buffer) { char status[80], right_status[80]; - int length = snprintf(status, sizeof(status), "%.20s - %d lines %s", editor->filename ? editor->filename : "[New File]", editor->row_count, editor->dirty ? "(modified)" : ""); - int right_length = snprintf(right_status, sizeof(right_status), "%s | %d/%d", editor->syntax ? editor->syntax->filetype : "plaintext", editor->cursor_y + 1, editor->row_count); + int length = snprintf(status, sizeof(status), "%.20s - %d lines %s", editor->filename ? editor->filename : "[New File]", editor->num_lines, editor->dirty ? "(modified)" : ""); + int right_length = snprintf(right_status, sizeof(right_status), "%s | %d/%d", editor->syntax ? editor->syntax->filetype : "plaintext", editor->cursor_y + 1, editor->num_lines); if (length > editor->screen_cols) length = editor->screen_cols; @@ -348,7 +353,7 @@ void editor_draw_message_bar(struct editor_state* editor, struct append_buffer* void editor_destroy(struct editor_state *editor) { free(editor->filename); - for (int i = 0; i < editor->row_count; i++) - free_row(&editor->rows[i]); - free(editor->rows); + for (int i = 0; i < editor->num_lines; i++) + free_line(&editor->lines[i]); + free(editor->lines); } diff --git a/editor.h b/editor.h index 0fe8bab..a46c37f 100644 --- a/editor.h +++ b/editor.h @@ -2,7 +2,9 @@ #define _EDITOR_H #include + #include "buffer.h" +#include "line.h" enum editor_mode { EDITOR_MODE_NORMAL, @@ -13,12 +15,12 @@ enum editor_mode { struct editor_state { int cursor_x, cursor_y; int cursor_display_x; - int row_offset; + int line_offset; int col_offset; int screen_rows; int screen_cols; - int row_count; - struct editor_row* rows; + int num_lines; + line_t *lines; int dirty; char* filename; char status_message[80]; @@ -42,6 +44,7 @@ void editor_move_left(struct editor_state *); void editor_move_right(struct editor_state *); void editor_move_up(struct editor_state *); void editor_move_down(struct editor_state *); +void editor_move_end(struct editor_state *); void editor_insert_char(struct editor_state* editor, int c); void editor_insert_newline(struct editor_state* editor); diff --git a/file.c b/file.c index 7604618..606fcc3 100644 --- a/file.c +++ b/file.c @@ -8,25 +8,25 @@ #include #include "error.h" -#include "row.h" +#include "line.h" #include "syntax.h" -char* editor_rows_to_string(struct editor_state* editor, int* buffer_length) +static char *lines_to_string(struct editor_state *editor, int *buffer_length) { int total_length = 0; int j; - for (j = 0; j < editor->row_count; j++) - total_length += editor->rows[j].size + 1; + for (j = 0; j < editor->num_lines; j++) + total_length += editor->lines[j].size + 1; *buffer_length = total_length; char* buffer = malloc(total_length); char* p = buffer; - for (j = 0; j < editor->row_count; j++) { - memcpy(p, editor->rows[j].chars, editor->rows[j].size); - p += editor->rows[j].size; + for (j = 0; j < editor->num_lines; j++) { + memcpy(p, editor->lines[j].chars, editor->lines[j].size); + p += editor->lines[j].size; *p = '\n'; p++; } @@ -60,7 +60,7 @@ void editor_open(struct editor_state* editor, char* filename) while (line_length > 0 && (line[line_length - 1] == '\n' || line[line_length - 1] == '\r')) line_length--; - insert_row(editor, editor->row_count, line, line_length); + editor_insert_line(editor, editor->num_lines, line, line_length); } free(line); @@ -81,7 +81,7 @@ void editor_save(struct editor_state* editor) } int length; - char* buffer = editor_rows_to_string(editor, &length); + char *buffer = lines_to_string(editor, &length); int fd = open(editor->filename, O_RDWR | O_CREAT, 0644); if (fd != -1) { diff --git a/input.c b/input.c index 74222bb..d6a9465 100644 --- a/input.c +++ b/input.c @@ -1,7 +1,8 @@ #include "input.h" #include "editor.h" -#include "row.h" +#include "file.h" +#include "line.h" void editor_process_keypress(struct editor_state *editor, SDL_Keysym *keysym) { @@ -45,8 +46,8 @@ void editor_process_keypress(struct editor_state *editor, SDL_Keysym *keysym) editor->cursor_x = 0; break; case SDLK_4: - if (keysym->mod & KMOD_SHIFT && editor->cursor_y < editor->row_count) - editor->cursor_x = editor->rows[editor->cursor_y].size; + if (keysym->mod & KMOD_SHIFT) + editor_move_end(editor); break; case SDLK_SLASH: editor_find(editor); @@ -65,7 +66,7 @@ void editor_process_keypress(struct editor_state *editor, SDL_Keysym *keysym) break; case SDLK_a: if (keysym->mod & KMOD_SHIFT) - editor->cursor_x = editor->rows[editor->cursor_y].size; + editor_move_end(editor); else editor_move_right(editor); editor->mode = EDITOR_MODE_INSERT; diff --git a/line.c b/line.c new file mode 100644 index 0000000..27b8915 --- /dev/null +++ b/line.c @@ -0,0 +1,150 @@ +#include "line.h" + +#include +#include +#include + +#include "syntax.h" + +int row_x_to_display_x(line_t *line, int x) +{ + int display_x = 0; + int j; + + for (j = 0; j < x; j++) { + if (line->chars[j] == '\t') + display_x += (TAB_WIDTH - 1) - (display_x % TAB_WIDTH); + display_x++; + } + + return display_x; +} + +int row_display_x_to_x(line_t *line, int display_x) +{ + int current_display_x = 0; + int result_x; + + for (result_x = 0; result_x < line->size; result_x++) { + if (line->chars[result_x] == '\t') + result_x += (TAB_WIDTH - 1) - (current_display_x % TAB_WIDTH); + result_x++; + + if (current_display_x > display_x) + return result_x; + } + return result_x; +} + +void editor_update_line(struct editor_state *editor, line_t *line) +{ + int tabs = 0; + int j; + for (j = 0; j < line->size; j++) + if (line->chars[j] == '\t') tabs++; + + free(line->render); + line->render = malloc(line->size + tabs * (TAB_WIDTH - 1) + 1); + + int index = 0; + for (j = 0; j < line->size; j++) { + if (line->chars[j] == '\t') { + line->render[index++] = ' '; + while (index % TAB_WIDTH != 0) line->render[index++] = ' '; + } else { + line->render[index++] = line->chars[j]; + } + } + + line->render[index] = '\0'; + line->render_size = index; + + editor_update_syntax(editor, line); +} + +void editor_insert_line(struct editor_state *editor, int at, char* string, size_t length) +{ + if (at < 0 || at > editor->num_lines) + return; + + editor->lines = realloc(editor->lines, sizeof(line_t) * (editor->num_lines + 1)); + memmove(&editor->lines[at + 1], &editor->lines[at], sizeof(line_t) * (editor->num_lines - at)); + + for (int j = at + 1; j <= editor->num_lines; j++) + editor->lines[at].index++; + + editor->lines[at].index = at; + + editor->lines[at].size = length; + editor->lines[at].chars = malloc(length + 1); + memcpy(editor->lines[at].chars, string, length); + editor->lines[at].chars[length] = '\0'; + + editor->lines[at].render_size = 0; + editor->lines[at].render = NULL; + editor->lines[at].highlight = NULL; + editor->lines[at].highlight_open_comment = 0; + editor_update_line(editor, &editor->lines[at]); + + editor->num_lines++; + editor->dirty = 1; +} + +void free_line(line_t *line) +{ + free(line->render); + free(line->chars); + free(line->highlight); +} + +void editor_delete_line(struct editor_state *editor, int at) +{ + if (at < 0 || at >= editor->num_lines) + return; + + free_line(&editor->lines[at]); + memmove(&editor->lines[at], &editor->lines[at + 1], sizeof(line_t) * (editor->num_lines - at - 1)); + + for (int j = at; j < editor->num_lines; j++) + editor->lines[j].index--; + + editor->num_lines--; + editor->dirty = 1; +} + +void line_insert_char(struct editor_state *editor, line_t *line, int at, int c) +{ + if (at < 0 || at > line->size) + at = line->size; + + line->chars = realloc(line->chars, line->size + 2); + memmove(&line->chars[at + 1], &line->chars[at], line->size - at + 1); + line->size++; + line->chars[at] = c; + + editor_update_line(editor, line); + + editor->dirty = 1; +} + +void line_append_string(struct editor_state *editor, line_t *line, char* string, size_t length) +{ + line->chars = realloc(line->chars, line->size + length + 1); + memcpy(&line->chars[line->size], string, length); + line->size += length; + line->chars[line->size] = '\0'; + + editor_update_line(editor, line); + editor->dirty = 1; +} + +void line_delete_char(struct editor_state *editor, line_t *line, int at) +{ + if (at < 0 || at >= line->size) + return; + + memmove(&line->chars[at], &line->chars[at + 1], line->size - at); + line->size--; + editor_update_line(editor, line); + editor->dirty = 1; +} diff --git a/line.h b/line.h new file mode 100644 index 0000000..e74b17e --- /dev/null +++ b/line.h @@ -0,0 +1,33 @@ +#ifndef _LINE_H +#define _LINE_H + +#include + +#define TAB_WIDTH 4 + +typedef struct { + int index; + int size; + char* chars; + int render_size; + char* render; + unsigned char* highlight; + int highlight_open_comment; +} line_t; + +struct editor_state; + +int row_x_to_display_x(line_t*, int x); +int row_display_x_to_x(line_t*, int display_x); + +void editor_update_line(struct editor_state*, line_t*); +void editor_insert_line(struct editor_state*, int at, char *string, size_t length); +void editor_delete_line(struct editor_state*, int at); + +void line_insert_char(struct editor_state*, line_t*, int at, int c); +void line_append_string(struct editor_state*, line_t*, char* string, size_t length); +void line_delete_char(struct editor_state*, line_t*, int at); + +void free_line(line_t*); + +#endif diff --git a/row.c b/row.c deleted file mode 100644 index c009cfc..0000000 --- a/row.c +++ /dev/null @@ -1,149 +0,0 @@ -#include "row.h" - -#include -#include - -#include "syntax.h" - -int row_x_to_display_x(struct editor_row* row, int x) -{ - int display_x = 0; - int j; - - for (j = 0; j < x; j++) { - if (row->chars[j] == '\t') - display_x += (TAB_WIDTH - 1) - (display_x % TAB_WIDTH); - display_x++; - } - - return display_x; -} - -int row_display_x_to_x(struct editor_row* row, int display_x) -{ - int current_display_x = 0; - int result_x; - - for (result_x = 0; result_x < row->size; result_x++) { - if (row->chars[result_x] == '\t') - result_x += (TAB_WIDTH - 1) - (current_display_x % TAB_WIDTH); - result_x++; - - if (current_display_x > display_x) - return result_x; - } - return result_x; -} - -void update_row(struct editor_state* editor, struct editor_row* row) -{ - int tabs = 0; - int j; - for (j = 0; j < row->size; j++) - if (row->chars[j] == '\t') tabs++; - - free(row->render); - row->render = malloc(row->size + tabs * (TAB_WIDTH - 1) + 1); - - int index = 0; - for (j = 0; j < row->size; j++) { - if (row->chars[j] == '\t') { - row->render[index++] = ' '; - while (index % TAB_WIDTH != 0) row->render[index++] = ' '; - } else { - row->render[index++] = row->chars[j]; - } - } - - row->render[index] = '\0'; - row->render_size = index; - - editor_update_syntax(editor, row); -} - -void insert_row(struct editor_state* editor, int at, char* string, size_t length) -{ - if (at < 0 || at > editor->row_count) - return; - - editor->rows = realloc(editor->rows, sizeof(struct editor_row) * (editor->row_count + 1)); - memmove(&editor->rows[at + 1], &editor->rows[at], sizeof(struct editor_row) * (editor->row_count - at)); - - for (int j = at + 1; j <= editor->row_count; j++) - editor->rows[at].index++; - - editor->rows[at].index = at; - - editor->rows[at].size = length; - editor->rows[at].chars = malloc(length + 1); - memcpy(editor->rows[at].chars, string, length); - editor->rows[at].chars[length] = '\0'; - - editor->rows[at].render_size = 0; - editor->rows[at].render = NULL; - editor->rows[at].highlight = NULL; - editor->rows[at].highlight_open_comment = 0; - update_row(editor, &editor->rows[at]); - - editor->row_count++; - editor->dirty = 1; -} - -void free_row(struct editor_row* row) -{ - free(row->render); - free(row->chars); - free(row->highlight); -} - -void delete_row(struct editor_state* editor, int at) -{ - if (at < 0 || at >= editor->row_count) - return; - - free_row(&editor->rows[at]); - memmove(&editor->rows[at], &editor->rows[at + 1], sizeof(struct editor_row) * (editor->row_count - at - 1)); - - for (int j = at; j < editor->row_count; j++) - editor->rows[j].index--; - - editor->row_count--; - editor->dirty = 1; -} - -void row_insert_char(struct editor_state* editor, struct editor_row* row, int at, int c) -{ - if (at < 0 || at > row->size) - at = row->size; - - row->chars = realloc(row->chars, row->size + 2); - memmove(&row->chars[at + 1], &row->chars[at], row->size - at + 1); - row->size++; - row->chars[at] = c; - - update_row(editor, row); - - editor->dirty = 1; -} - -void row_append_string(struct editor_state* editor, struct editor_row* row, char* string, size_t length) -{ - row->chars = realloc(row->chars, row->size + length + 1); - memcpy(&row->chars[row->size], string, length); - row->size += length; - row->chars[row->size] = '\0'; - - update_row(editor, row); - editor->dirty = 1; -} - -void row_delete_char(struct editor_state* editor, struct editor_row* row, int at) -{ - if (at < 0 || at >= row->size) - return; - - memmove(&row->chars[at], &row->chars[at + 1], row->size - at); - row->size--; - update_row(editor, row); - editor->dirty = 1; -} diff --git a/row.h b/row.h deleted file mode 100644 index e8f6731..0000000 --- a/row.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef _ROW_H -#define _ROW_H - -#include - -#include "editor.h" - -#define TAB_WIDTH 4 - -struct editor_row { - int index; - int size; - char* chars; - int render_size; - char* render; - unsigned char* highlight; - int highlight_open_comment; -}; - -int row_x_to_display_x(struct editor_row* row, int x); -int row_display_x_to_x(struct editor_row* row, int display_x); -void update_row(struct editor_state* editor, struct editor_row* row); -void insert_row(struct editor_state* editor, int at, char* string, size_t length); -void free_row(struct editor_row* row); -void delete_row(struct editor_state* editor, int at); -void row_insert_char(struct editor_state* editor, struct editor_row* row, int at, int c); -void row_append_string(struct editor_state* editor, struct editor_row* row, char* string, size_t length); -void row_delete_char(struct editor_state* editor, struct editor_row* row, int at); - -#endif diff --git a/syntax.c b/syntax.c index ffaae4a..2078e19 100644 --- a/syntax.c +++ b/syntax.c @@ -1,6 +1,8 @@ #include "syntax.h" +#include #include + #include "editor.h" char* c_highlight_extensions[] = { ".c", ".h", ".cpp", ".cc", NULL }; @@ -29,10 +31,10 @@ int is_separator(int c) return isspace(c) || c == '\0' || strchr(",.()+-/*=~%<>[];", c) != NULL; } -void editor_update_syntax(struct editor_state* editor, struct editor_row* row) +void editor_update_syntax(struct editor_state *editor, line_t *line) { - row->highlight = realloc(row->highlight, row->render_size); - memset(row->highlight, HIGHLIGHT_NORMAL, row->render_size); + line->highlight = realloc(line->highlight, line->render_size); + memset(line->highlight, HIGHLIGHT_NORMAL, line->render_size); if (editor->syntax == NULL) return; @@ -50,25 +52,25 @@ void editor_update_syntax(struct editor_state* editor, struct editor_row* row) int previous_separator = 1; int in_string = 0; - int in_comment = (row->index > 0 && editor->rows[row->index - 1].highlight_open_comment); + int in_comment = (line->index > 0 && editor->lines[line->index - 1].highlight_open_comment); int i = 0; - while (i < row->render_size) { - char c = row->render[i]; - unsigned char previous_highlight = (i > 0) ? row->highlight[i - 1] : HIGHLIGHT_NORMAL; + while (i < line->render_size) { + char c = line->render[i]; + unsigned char previous_highlight = (i > 0) ? line->highlight[i - 1] : HIGHLIGHT_NORMAL; if (single_line_comment_start_length && !in_string && !in_comment) { - if (!strncmp(&row->render[i], single_line_comment_start, single_line_comment_start_length)) { - memset(&row->highlight[i], HIGHLIGHT_COMMENT, row->render_size - i); + if (!strncmp(&line->render[i], single_line_comment_start, single_line_comment_start_length)) { + memset(&line->highlight[i], HIGHLIGHT_COMMENT, line->render_size - i); break; } } if (multi_line_comment_start_length && multi_line_comment_end_length && !in_string) { if (in_comment) { - row->highlight[i] = HIGHLIGHT_MULTILINE_COMMENT; - if (!strncmp(&row->render[i], multi_line_comment_end, multi_line_comment_end_length)) { - memset(&row->highlight[i], HIGHLIGHT_MULTILINE_COMMENT, multi_line_comment_end_length); + line->highlight[i] = HIGHLIGHT_MULTILINE_COMMENT; + if (!strncmp(&line->render[i], multi_line_comment_end, multi_line_comment_end_length)) { + memset(&line->highlight[i], HIGHLIGHT_MULTILINE_COMMENT, multi_line_comment_end_length); i += multi_line_comment_end_length; in_comment = 0; @@ -78,8 +80,8 @@ void editor_update_syntax(struct editor_state* editor, struct editor_row* row) i++; continue; } - } else if (!strncmp(&row->render[i], multi_line_comment_start, multi_line_comment_start_length)) { - memset(&row->highlight[i], HIGHLIGHT_MULTILINE_COMMENT, multi_line_comment_start_length); + } else if (!strncmp(&line->render[i], multi_line_comment_start, multi_line_comment_start_length)) { + memset(&line->highlight[i], HIGHLIGHT_MULTILINE_COMMENT, multi_line_comment_start_length); i += multi_line_comment_start_length; in_comment = 1; continue; @@ -88,10 +90,10 @@ void editor_update_syntax(struct editor_state* editor, struct editor_row* row) if (editor->syntax->flags & HIGHLIGHT_FLAG_STRINGS) { if (in_string) { - row->highlight[i] = HIGHLIGHT_STRING; + line->highlight[i] = HIGHLIGHT_STRING; - if (c == '\\' && i + 1 < row->render_size) { - row->highlight[i + 1] = HIGHLIGHT_STRING; + if (c == '\\' && i + 1 < line->render_size) { + line->highlight[i + 1] = HIGHLIGHT_STRING; i += 2; continue; } @@ -105,7 +107,7 @@ void editor_update_syntax(struct editor_state* editor, struct editor_row* row) } else { if (c == '"' || c == '\'') { in_string = c; - row->highlight[i] = HIGHLIGHT_STRING; + line->highlight[i] = HIGHLIGHT_STRING; i++; continue; } @@ -114,7 +116,7 @@ void editor_update_syntax(struct editor_state* editor, struct editor_row* row) if (editor->syntax->flags & HIGHLIGHT_FLAG_NUMBERS) { if ((isdigit(c) && (previous_separator || previous_highlight == HIGHLIGHT_NUMBER)) || (c == '.' && previous_highlight == HIGHLIGHT_NUMBER)) { - row->highlight[i] = HIGHLIGHT_NUMBER; + line->highlight[i] = HIGHLIGHT_NUMBER; i++; previous_separator = 0; continue; @@ -130,8 +132,8 @@ void editor_update_syntax(struct editor_state* editor, struct editor_row* row) if (is_secondary) keyword_length--; - if (!strncmp(&row->render[i], keywords[j], keyword_length) && is_separator(row->render[i + keyword_length])) { - memset(&row->highlight[i], is_secondary ? HIGHLIGHT_KEYWORD2 : HIGHLIGHT_KEYWORD1, keyword_length); + if (!strncmp(&line->render[i], keywords[j], keyword_length) && is_separator(line->render[i + keyword_length])) { + memset(&line->highlight[i], is_secondary ? HIGHLIGHT_KEYWORD2 : HIGHLIGHT_KEYWORD1, keyword_length); i += keyword_length; break; } @@ -146,10 +148,10 @@ void editor_update_syntax(struct editor_state* editor, struct editor_row* row) i++; } - int changed = (row->highlight_open_comment != in_comment); - row->highlight_open_comment = in_comment; - if (changed && row->index + 1 < editor->row_count) - editor_update_syntax(editor, &editor->rows[row->index + 1]); + int changed = (line->highlight_open_comment != in_comment); + line->highlight_open_comment = in_comment; + if (changed && line->index + 1 < editor->num_lines) + editor_update_syntax(editor, &editor->lines[line->index + 1]); } int editor_syntax_to_colour(int highlight) @@ -184,10 +186,8 @@ void editor_select_syntax_highlight(struct editor_state* editor) if ((is_extension && extension && !strcmp(extension, syntax->filetype_match[i])) || (!is_extension && strstr(editor->filename, syntax->filetype_match[i]))) { editor->syntax = syntax; - int file_row; - for (file_row = 0; file_row < editor->row_count; file_row++) { - editor_update_syntax(editor, &editor->rows[file_row]); - } + for (int line = 0; line < editor->num_lines; line++) + editor_update_syntax(editor, &editor->lines[line]); return; } diff --git a/syntax.h b/syntax.h index 9bf85a4..e78a4ab 100644 --- a/syntax.h +++ b/syntax.h @@ -4,7 +4,7 @@ #include #include "editor.h" -#include "row.h" +#include "line.h" #define HIGHLIGHT_FLAG_NUMBERS (1 << 0) #define HIGHLIGHT_FLAG_STRINGS (1 << 1) @@ -32,7 +32,7 @@ enum editor_highlight { #define HIGHLIGHT_DATABASE_ENTRY_COUNT (sizeof(highlight_database) / sizeof(highlight_database[0])) -void editor_update_syntax(struct editor_state* editor, struct editor_row* row); +void editor_update_syntax(struct editor_state* editor, line_t*); int editor_syntax_to_colour(int highlight); void editor_select_syntax_highlight(struct editor_state* editor); diff --git a/window.c b/window.c index ee97ed9..ea3f9f4 100644 --- a/window.c +++ b/window.c @@ -115,7 +115,7 @@ void window_redraw(struct editor_state *editor) SDL_Rect cursor_rect; cursor_rect.x = editor->cursor_display_x * font.width; - cursor_rect.y = (editor->cursor_y - editor->row_offset) * font.height; + cursor_rect.y = (editor->cursor_y - editor->line_offset) * font.height; cursor_rect.w = font.width; cursor_rect.h = font.height; -- cgit v1.2.3