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;