diff --git a/b_truncate.c b/b_truncate.c new file mode 100644 index 0000000..aaf6a19 --- /dev/null +++ b/b_truncate.c @@ -0,0 +1,10 @@ +void +b_truncate(Row *row) { + Row *n = row->n; + row->n = NULL; + if (n != NULL) { + b_truncate(n); + free(n); + } +} + diff --git a/c_open.c b/c_open.c new file mode 100644 index 0000000..8735817 --- /dev/null +++ b/c_open.c @@ -0,0 +1,24 @@ +void +c_open(char *file) { + file += 2; + FILE *f = fopen(file, "r"); + if (f == NULL) { + puts("couldnt open file."); + return; + } + b_truncate(buffer); + Row *row = buffer; + row->n = NULL; + while (1) { + size_t red = fread(&row->text, 1, ROW_SIZE, f); + if (red < ROW_SIZE) { + break; + } else { + Row *new_row = calloc(1, sizeof(Row)); + new_row->p = row; + row->n = new_row; + row = new_row; + } + } +} + diff --git a/commands.c b/commands.c index 2c549e8..9a46b02 100644 --- a/commands.c +++ b/commands.c @@ -1,3 +1,4 @@ void (*commands[256])(char *) = { NULL, ['q'] = c_quit, +['O'] = c_open, diff --git a/efn.c b/efn.c index 16362b4..1750d8e 100644 --- a/efn.c +++ b/efn.c @@ -12,4 +12,6 @@ }; #include "c_quit.c" +#include "c_open.c" +#include "b_truncate.c" diff --git a/efn.h b/efn.h index e45ebfd..695cb27 100644 --- a/efn.h +++ b/efn.h @@ -5,3 +5,6 @@ extern void (*commands[256])(char *); void c_quit(char *); +void c_open(char *); +#include +void b_truncate(Row *); diff --git a/globals.h b/globals.h index e69de29..220b7d7 100644 --- a/globals.h +++ b/globals.h @@ -0,0 +1,3 @@ +Row init_row = { 0 }; +Row *buffer = &init_row; + diff --git a/main.c b/main.c index a231a38..c6713ea 100644 --- a/main.c +++ b/main.c @@ -1,12 +1,17 @@ int main(int argc, char **argv) { - static char buf[256]; - while(1) { - char *com = fgets(buf, sizeof(buf), stdin); + static char buf[256]; + while(1) { + memset(buf, 0, sizeof(buf)); +char *com = fgets(buf, sizeof(buf), stdin); + for (int i = 0; i < sizeof(buf); i++) + if (buf[i] == '\n') + buf[i] = '\0'; if (com != NULL) { - if (commands[com[0]] != NULL) commands[com[0]](buf); - else puts("invalid command."); - } - } - return 0; + if (commands[com[0]] != NULL) commands[com[0]](buf); + else puts("invalid command."); + } + } + return 0; } +