summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--jet.c40
-rw-r--r--page.c5
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 <stdint.h>
+#include <stdbool.h>
#include <string.h>
#include <stdlib.h>
@@ -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) {