From 8b9d67da716c07f957eadd977059d74936c84a76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Manuel=20Tom=C3=A1s?= Date: Wed, 22 Apr 2020 09:21:43 -0300 Subject: Replace plain array with pages and points --- jet.c | 40 ++++++++++++++++++---------------------- page.c | 5 +++++ 2 files changed, 23 insertions(+), 22 deletions(-) diff --git a/jet.c b/jet.c index fa85a30..b539082 100644 --- a/jet.c +++ b/jet.c @@ -8,23 +8,6 @@ #include "page.c" int main(int argc, char *argv[]) { - char *buffer = 0; - size_t file_size = 0; - if (argc > 1) { - int file_descriptor = open(argv[1], O_RDONLY); - assert(file_descriptor != -1); - - struct stat file_stat; - assert(stat(argv[1], &file_stat) != -1); - file_size = file_stat.st_size; - - buffer = malloc(file_size); - assert(buffer); - assert(read(file_descriptor, buffer, file_size) != -1); - - assert(close(file_descriptor) != -1); - } - initscr(); cbreak(); noecho(); @@ -32,22 +15,35 @@ int main(int argc, char *argv[]) { intrflush(stdscr, FALSE); keypad(stdscr, TRUE); + struct page *page = new_page(); + struct point cursor = {page, 0}; + + if (argc > 1) { + FILE *f = fopen(argv[1], "r"); + char c; + while ((c = fgetc(f)) != EOF) { + insert_at_point(&cursor, c); + } + fclose(f); + } + int window_height = getmaxy(stdscr); int current_line = 0; int old_line = -1; int number_of_lines = 0; - for (int i = 0; i < file_size; i++) { - if (buffer[i] == '\n') number_of_lines++; + for (struct point i = {page, 0}; !at_eof(&i); move_point_forward(&i)) { + if (get_element(&i) == '\n') number_of_lines++; } while (1) { if (old_line != current_line) { clear(); - for (int i = 0, iter_line = 0; i < file_size && iter_line < window_height + current_line; i++) { - if (iter_line >= current_line) addch(buffer[i]); - if (buffer[i] == '\n') iter_line++; + int iter_line = 0; + for (struct point i = {page, 0}; !at_eof(&i) && iter_line < window_height + current_line; move_point_forward(&i)) { + if (iter_line >= current_line) addch(get_element(&i)); + if (get_element(&i) == '\n') iter_line++; } } diff --git a/page.c b/page.c index 65d344f..d450522 100644 --- a/page.c +++ b/page.c @@ -1,4 +1,5 @@ #include +#include #include #include @@ -26,6 +27,10 @@ uint16_t index_to_offset(struct page *page, uint16_t index) { } } +bool at_eof(struct point *point) { + return point->index == point->current_page->element_count; +} + void move_point_forward(struct point *point) { struct page *page = point->current_page; if (point->index < page->element_count) { -- cgit v1.2.3