diff options
author | Juan Manuel Tomás <jtomas1815@gmail.com> | 2020-05-24 05:35:00 -0300 |
---|---|---|
committer | Juan Manuel Tomás <jtomas1815@gmail.com> | 2020-05-24 05:35:00 -0300 |
commit | 98280238383dc390207827d09dc92e0459229134 (patch) | |
tree | e2bc7c0877289165463dd6f9c2e77b570b22e29c /jet.cpp | |
parent | d37027bbd7ac13fdd0f1e2f01e1ec4b75b6c9588 (diff) | |
download | jet-98280238383dc390207827d09dc92e0459229134.tar.gz jet-98280238383dc390207827d09dc92e0459229134.zip |
Rewrite in c++
Diffstat (limited to 'jet.cpp')
-rw-r--r-- | jet.cpp | 123 |
1 files changed, 123 insertions, 0 deletions
@@ -0,0 +1,123 @@ +#include <stdlib.h> +#include <stdio.h> +#include <assert.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <unistd.h> +#include <curses.h> +#include "page.cpp" +#include "point.cpp" + +#define NORMAL_MODE 0 +#define INSERT_MODE 1 + +struct Buffer { + const char *name; + Point start; + Point cursor; + + Buffer(const char *name) : name(name), start(new Page()), cursor(start) {} + + void prev_line(int window_width) { + cursor--; + cursor--; + cursor.rseek('\n', window_width - 2); + if (cursor.element() == '\n') { + cursor++; + } + } + + void next_line(int window_width) { + cursor.seek('\n', window_width); + if (cursor.element() == '\n') { + cursor++; + } + } + +}; + +int main(int argc, char *argv[]) { + initscr(); + cbreak(); + noecho(); + intrflush(stdscr, FALSE); + keypad(stdscr, TRUE); + + Buffer buffer = Buffer("test"); + Point window_start = buffer.start; + + if (argc > 1) { + FILE *f = fopen(argv[1], "r"); + char c; + while ((c = fgetc(f)) != EOF) { + buffer.cursor.push(c); + } + buffer.cursor = buffer.start; + fclose(f); + } + + int window_height, window_width; + getmaxyx(stdscr, window_height, window_width); + + int mode = NORMAL_MODE; + + int quit = 0; + while (!quit) { + clear(); + + int x = -1, y = -1; + Point window_end = window_start; + while (window_end.element() && getcury(stdscr) < window_height - 1) { + if (window_end == buffer.cursor) { + getyx(stdscr, y, x); + } + addch(window_end.element()); + window_end++; + } + if (x > -1 && y > -1) { + move(y, x); + } + + int input = getch(); + + if (mode == NORMAL_MODE) { + switch (input) { + case '': + quit = 1; + break; + case 'i': + mode = INSERT_MODE; + break; + case 'k': + buffer.prev_line(window_width); + break; + case 'j': + buffer.next_line(window_width); + break; + case 'h': + buffer.cursor--; + break; + case 'l': + buffer.cursor++; + break; + } + } else { + switch (input) { + case '': + mode = NORMAL_MODE; + break; + case KEY_BACKSPACE: + buffer.cursor.pop(); + break; + default: + buffer.cursor.push(input); + } + } + if (buffer.cursor.element() == 0) { + buffer.cursor--; + } + } + + endwin(); + return 0; +} |