file reading
This commit is contained in:
parent
09920200e8
commit
bfacf003ad
|
@ -20,7 +20,7 @@ clean:
|
||||||
.PHONY: run
|
.PHONY: run
|
||||||
run: $(BIN)
|
run: $(BIN)
|
||||||
reset
|
reset
|
||||||
./$(BIN)
|
./$(BIN) escapes.txt
|
||||||
|
|
||||||
%.o: %.c
|
%.o: %.c
|
||||||
$(CC) $(CFLAGS) -c $@ $<
|
$(CC) $(CFLAGS) -c $@ $<
|
||||||
|
|
103
ke/main.c
103
ke/main.c
|
@ -37,11 +37,18 @@ enum KeyPress {
|
||||||
|
|
||||||
void disable_termraw();
|
void disable_termraw();
|
||||||
|
|
||||||
|
typedef struct erow {
|
||||||
|
char *line;
|
||||||
|
int size;
|
||||||
|
} erow;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
struct termios entry_term;
|
struct termios entry_term;
|
||||||
int rows, cols;
|
int rows, cols;
|
||||||
int curx, cury;
|
int curx, cury;
|
||||||
int mode;
|
int mode;
|
||||||
|
int nrows;
|
||||||
|
erow *row;
|
||||||
} editor;
|
} editor;
|
||||||
|
|
||||||
|
|
||||||
|
@ -114,6 +121,47 @@ get_winsz(int *rows, int *cols)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
append_row(char *s, size_t len)
|
||||||
|
{
|
||||||
|
int at = editor.nrows;
|
||||||
|
|
||||||
|
editor.row = realloc(editor.row, sizeof(erow) * (editor.nrows + 1));
|
||||||
|
editor.row[at].size = len;
|
||||||
|
editor.row[at].line = malloc(len+1);
|
||||||
|
memcpy(editor.row[at].line, s, len);
|
||||||
|
editor.row[at].line[len] = '\0';
|
||||||
|
editor.nrows++;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
open_file(const char *filename)
|
||||||
|
{
|
||||||
|
char *line = NULL;
|
||||||
|
size_t linecap = 0;
|
||||||
|
ssize_t linelen;
|
||||||
|
FILE *fp = fopen(filename, "r");
|
||||||
|
if (!fp) {
|
||||||
|
die("fopen");
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((linelen = getline(&line, &linecap, fp)) != -1) {
|
||||||
|
if (linelen != -1) {
|
||||||
|
while ((linelen > 0) && ((line[linelen-1] == '\r') ||
|
||||||
|
(line[linelen-1] == '\n'))) {
|
||||||
|
linelen--;
|
||||||
|
}
|
||||||
|
|
||||||
|
append_row(line, linelen);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
free(line);
|
||||||
|
fclose(fp);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
uint16_t
|
uint16_t
|
||||||
is_arrow_key(int16_t c)
|
is_arrow_key(int16_t c)
|
||||||
{
|
{
|
||||||
|
@ -396,15 +444,38 @@ void
|
||||||
draw_rows(struct abuf *ab)
|
draw_rows(struct abuf *ab)
|
||||||
{
|
{
|
||||||
char buf[editor.cols];
|
char buf[editor.cols];
|
||||||
|
int buflen, padding;
|
||||||
int y;
|
int y;
|
||||||
|
|
||||||
for (y = 0; y < editor.rows-1; y++) {
|
for (y = 0; y < editor.rows; y++) {
|
||||||
ab_append(ab, ESCSEQ "K|\r\n", 6);
|
if (y >= editor.nrows) {
|
||||||
}
|
if ((editor.nrows == 0) && (y == editor.rows / 3)) {
|
||||||
|
buflen = snprintf(buf, sizeof(buf),
|
||||||
|
"ke k%s", KE_VERSION);
|
||||||
|
padding = (editor.rows - buflen) / 2;
|
||||||
|
|
||||||
snprintf(buf, sizeof(buf), ESCSEQ "K+ [%d,%d] ke v" KE_VERSION,
|
if (padding) {
|
||||||
editor.cury, editor.curx);
|
ab_append(ab, "|", 1);
|
||||||
ab_append(ab, buf, strlen(buf));
|
padding--;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (padding--) ab_append(ab, " ", 1);
|
||||||
|
ab_append(ab, buf, buflen);
|
||||||
|
} else {
|
||||||
|
ab_append(ab, "|", 1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
buflen = editor.row[y].size;
|
||||||
|
if (buflen > editor.rows) {
|
||||||
|
buflen = editor.rows;
|
||||||
|
}
|
||||||
|
ab_append(ab, editor.row[y].line, buflen);
|
||||||
|
}
|
||||||
|
ab_append(ab, ESCSEQ "K", 3);
|
||||||
|
if (y < (editor.rows - 1)) {
|
||||||
|
ab_append(ab, "\r\n", 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -422,8 +493,7 @@ display_refresh()
|
||||||
snprintf(buf, sizeof(buf), ESCSEQ "%d;%dH", editor.cury+1,
|
snprintf(buf, sizeof(buf), ESCSEQ "%d;%dH", editor.cury+1,
|
||||||
editor.curx+1);
|
editor.curx+1);
|
||||||
ab_append(&ab, buf, strnlen(buf, 32));
|
ab_append(&ab, buf, strnlen(buf, 32));
|
||||||
|
/* ab_append(&ab, ESCSEQ "1;2H", 7); */
|
||||||
ab_append(&ab, ESCSEQ "1;2H", 7);
|
|
||||||
ab_append(&ab, ESCSEQ "?25h", 6);
|
ab_append(&ab, ESCSEQ "?25h", 6);
|
||||||
|
|
||||||
write(STDOUT_FILENO, ab.b, ab.len);
|
write(STDOUT_FILENO, ab.b, ab.len);
|
||||||
|
@ -453,15 +523,22 @@ init_editor()
|
||||||
|
|
||||||
editor.curx = 0;
|
editor.curx = 0;
|
||||||
editor.cury = 0;
|
editor.cury = 0;
|
||||||
|
|
||||||
|
editor.nrows = 0;
|
||||||
|
editor.row = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
main()
|
main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
setup_terminal();
|
setup_terminal();
|
||||||
init_editor();
|
init_editor();
|
||||||
|
|
||||||
|
if (argc > 1) {
|
||||||
|
open_file(argv[1]);
|
||||||
|
}
|
||||||
|
|
||||||
display_clear(NULL);
|
display_clear(NULL);
|
||||||
loop();
|
loop();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue