tPrompt for file name on save - ve - a minimal text editor (work in progress) (HTM) git clone git://src.adamsgaard.dk/ve (DIR) Log (DIR) Files (DIR) Refs (DIR) README (DIR) LICENSE --- (DIR) commit 68ebb8e650025d82f30c96de9564f924c6bfdb37 (DIR) parent 36ee312271f23de904472f0ae2208489cec7cdfd (HTM) Author: Anders Damsgaard <anders@adamsgaard.dk> Date: Tue, 6 Aug 2019 21:01:08 +0200 Prompt for file name on save Diffstat: M input.c | 35 +++++++++++++++++++++++++++++++ M input.h | 1 + M io.c | 8 ++++---- 3 files changed, 40 insertions(+), 4 deletions(-) --- (DIR) diff --git a/input.c b/input.c t@@ -1,5 +1,6 @@ #include <unistd.h> #include <stdlib.h> +#include <ctype.h> #include "te.h" #include "terminal.h" #include "edit.h" t@@ -9,6 +10,40 @@ #define CTRL_KEY(k) ((k) & 0x1f) +/* prompt is expected to be a format string containing a %s */ +char* +editor_prompt(char *prompt) +{ + size_t bufsize, buflen; + char *buf; + int c; + + bufsize = 128; + buflen = 0; + buf = malloc(bufsize); + buf[0] = '\0'; + + while (1) { + editor_set_status_message(prompt, buf); + editor_refresh_screen(); + + c = editor_read_key(); + if (c == '\r') { + if (buflen != 0) { + editor_set_status_message(""); + return buf; + } + } else if (!iscntrl(c) && c < 128) { + if (buflen == bufsize - 1) { + bufsize *= 2; + buf = realloc(buf, bufsize); + } + buf[buflen++] = c; + buf[buflen] = '\0'; + } + } +} + /* move cursor according to screen, file, and line limits */ void editor_move_cursor(char key) (DIR) diff --git a/input.h b/input.h t@@ -1,6 +1,7 @@ #ifndef INPUT_H_ #define INPUT_H_ +char* editor_prompt(char *prompt); void editor_process_keypress(); #endif (DIR) diff --git a/io.c b/io.c t@@ -14,6 +14,7 @@ #include "terminal.h" #include "row.h" #include "output.h" +#include "input.h" void file_open(char *filename) t@@ -72,10 +73,8 @@ file_save(char *filename) int len, fd; char *buf; - if (filename == NULL) { - editor_set_status_message("error: no filename specified"); - return; - } + if (filename == NULL) + filename = editor_prompt("save as: %s"); buf = editor_concatenate_rows(&len); t@@ -85,6 +84,7 @@ file_save(char *filename) if (write(fd, buf, len) == len) { close(fd); free(buf); + E.filename = filename; E.file_changed = 0; editor_set_status_message("%d bytes written to disk", len); return;