From 8db9da90ccebc650564a7b41b1bb0f16513b3e16 Mon Sep 17 00:00:00 2001 From: sloumdrone Date: Sat, 28 Dec 2019 23:05:31 -0800 Subject: [PATCH] Scrolling and file load working --- csedit | Bin 17904 -> 18184 bytes csedit.c | 109 ++++++++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 95 insertions(+), 14 deletions(-) diff --git a/csedit b/csedit index 6f9a3620c1273545e1fc073465c81b6a9cf013f8..122ef1e7577e9a107884af88787a34e05806c43b 100755 GIT binary patch literal 18184 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 I1x>gAAL&a0VgLXD literal 17904 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 OEY~zHN<~4<_WuK>G4Q+q diff --git a/csedit.c b/csedit.c index b56e89c..770dbd7 100644 --- a/csedit.c +++ b/csedit.c @@ -1,12 +1,17 @@ // // includes // -------- +#define _DEFAULT_SOURCE +#define _BSD_SOURCE +#define _GNU_SOURCE + #include #include #include #include #include #include +#include #include #include @@ -34,16 +39,25 @@ enum editorKey { // data // ---- +typedef struct erow { + int size; + char *chars; +} erow; + struct editorConfig { - struct termios orig_termios; enum editorMode mode; + int rowoff; int cx, cy; int screenRows; int screenCols; + int numRows; + erow *row; + struct termios orig_termios; }; struct editorConfig E; + // // terminal // -------- @@ -159,6 +173,42 @@ int getWindowSize(int *rows, int *cols) { return 0; } +// +// row ops +// ------- + +void editorAppendRow(char *s, size_t len) { + E.row = realloc(E.row, sizeof(erow) * (E.numRows + 1)); + + int at = E.numRows; + E.row[at].size = len; + E.row[at].chars = malloc(len + 1); + memcpy(E.row[at].chars, s, len); + E.row[at].chars[len] = '\0'; + E.numRows++; +} + +// +// file io +// ------- + +void editorOpen(char *filename) { + FILE *fp = fopen(filename, "r"); + if (!fp) die("Open file"); + + char *line = NULL; + size_t linecap = 0; + ssize_t linelen; + while ((linelen = getline(&line, &linecap, fp)) != -1) { + while (linelen > 0 && (line[linelen - 1] == '\n' || line[linelen - 1] == '\r')) + linelen--; + editorAppendRow(line, linelen); + + } + free(line); + fclose(fp); +} + // // append buffer // ------------- @@ -185,22 +235,38 @@ void abFree(struct abuf *ab) { // // output // ------ +void editorScroll() { + if (E.cy < E.rowoff) { + E.rowoff = E.cy; + } + if (E.cy >= E.rowoff + E.screenRows) { + E.rowoff = E.cy - E.screenRows + 1; + } +} + void editorDrawRows(struct abuf *ab) { int y; for (y = 0; y < E.screenRows; y++) { - if (y == E.screenRows / 3) { - char welcome[80]; - int welcomelen = snprintf(welcome, sizeof(welcome), "[ cs edit ] - version %s", CSEDIT_VERSION); - if (welcomelen > E.screenCols) welcomelen = E.screenCols; - int padding = (E.screenCols - welcomelen) / 2; - if (padding) { + int filerow = y + E.rowoff; + if (filerow >= E.numRows) { + if (E.numRows == 0 && y == E.screenRows / 3) { + char welcome[80]; + int welcomelen = snprintf(welcome, sizeof(welcome), "[ cs edit ] - version %s", CSEDIT_VERSION); + if (welcomelen > E.screenCols) welcomelen = E.screenCols; + int padding = (E.screenCols - welcomelen) / 2; + if (padding) { + abAppend(ab, "~", 1); + padding--; + } + while (padding--) abAppend(ab, " ", 1); + abAppend(ab, welcome, welcomelen); + } else { abAppend(ab, "~", 1); - padding--; } - while (padding--) abAppend(ab, " ", 1); - abAppend(ab, welcome, welcomelen); } else { - abAppend(ab, "~", 1); + int len = E.row[filerow].size; + if (len > E.screenCols) len = E.screenCols; + abAppend(ab, E.row[filerow].chars, len); } abAppend(ab, "\033[K", 3); @@ -212,6 +278,8 @@ void editorDrawRows(struct abuf *ab) { } void editorRefreshScreen() { + editorScroll(); + struct abuf ab = ABUF_INIT; abAppend(&ab, "\033[?25l", 6); @@ -219,7 +287,7 @@ void editorRefreshScreen() { editorDrawRows(&ab); char buf[32]; - snprintf(buf, sizeof(buf), "\033[%d;%dH", E.cy + 1, E.cx + 1); + snprintf(buf, sizeof(buf), "\033[%d;%dH", (E.cy - E.rowoff) + 1, E.cx + 1); abAppend(&ab, buf, strlen(buf)); abAppend(&ab, "\033[?25h", 6); @@ -235,7 +303,7 @@ void editorMoveCursor(int key) { switch (key) { case 'j': case ARROW_DOWN: - if (E.cy != E.screenRows - 1) { + if (E.cy < E.numRows) { E.cy++; } break; @@ -285,6 +353,13 @@ void editorCommandKp(int c) { case 'l': editorMoveCursor(c); break; + case 'g': + E.cy = 0; + break; + case 'G': + E.cy = E.numRows - E.screenRows - 1; + editorPageCursor(PAGE_DOWN); + break; case 'i': E.mode = InputMode; break; @@ -345,14 +420,20 @@ void editorProcessKeypress() { // ---- void initEditor() { E.mode = CommandMode; + E.rowoff = 0; + E.numRows = 0; + E.row = NULL; E.cx = 0; E.cy = 0; if (getWindowSize(&E.screenRows, &E.screenCols) == -1) die("getWindowSize"); } -int main() { +int main(int argc, char *argv[]) { enableRawMode(); initEditor(); + if (argc >= 2) { + editorOpen(argv[1]); + } while (1) { editorRefreshScreen();