On July 9, 2015 9:18:41 PM GMT+02:00, Jacob Wahlgren <[email protected]>
wrote:
>With this patch, vi can load an initial buffer from stdin and then
>start reading user input from /dev/tty. This is done by invoking it as
>'vi -'. Example from the bug report: 'ls -l dir1 | vi -'.
Please always include bloat-o-meter output.
>@@ -544,6 +544,7 @@ static int readit(void); // read (maybe cursor)
>key from stdin
> static int get_one_char(void); // read 1 char from stdin
> // file_insert might reallocate text[]!
> static int file_insert(const char *, char *, int);
>+static int fd_insert(int, char *);
Don't we have something like open_file_or_stdin?
See LONE_DASH spots, maybe.
> static int file_write(char *, char *, char *);
> static void place_cursor(int, int);
> static void screen_erase(void);
>@@ -716,7 +717,8 @@ int vi_main(int argc, char **argv)
>
> /* read text from file or create an empty buf */
> /* will also update current_filename */
>-static int init_text_buffer(char *fn)
>+/* read from fd instead if fd >= 0 */
>+static int init_text_buffer(char *fn, int fd)
> {
> int rc;
>
>@@ -737,11 +739,18 @@ static int init_text_buffer(char *fn)
> free(current_filename);
> current_filename = xstrdup(fn);
> }
>- rc = file_insert(fn, text, 1);
>+
>+ if (fd >= 0) {
>+ rc = fd_insert(fd, text);
>+ } else {
>+ rc = file_insert(fn, text, 1);
>+ }
>+
> if (rc < 0) {
> // file doesnt exist. Start empty buf with dummy line
> char_insert(text, '\n', NO_UNDO);
> }
>+
> return rc;
> }
>
>@@ -765,14 +774,32 @@ static void edit_file(char *fn)
> #define cur_line edit_file__cur_line
> #endif
> int c;
>+ int fd; // set if piping from stdin, otherwise -1
> #if ENABLE_FEATURE_VI_USE_SIGNALS
> int sig;
> #endif
>
> editing = 1; // 0 = exit, 1 = one file, 2 = multiple files
>- rawmode();
> rows = 24;
> columns = 80;
>+
>+ if (fn && strcmp("-", fn) == 0) {
>+ // set fd = pipe in, stdin = tty
>+ int tmpfd;
>+
>+ fn[0] = '\0';
>+ tmpfd = open("/dev/tty", O_RDONLY);
>+ if (tmpfd < 0)
>+ bb_perror_msg_and_die("/dev/tty");
>+ if ((fd = dup(STDIN_FILENO)) < 0
>+ || dup2(tmpfd, STDIN_FILENO) < 0)
>+ bb_perror_msg_and_die("dup");
>+ close(tmpfd);
>+ } else {
>+ fd = -1; // don't use fd, open fn instead
>+ }
Sounds way too complicated.
>+ rawmode();
>+
> IF_FEATURE_VI_ASK_TERMINAL(G.get_rowcol_error =)
>query_screen_dimensions();
> #if ENABLE_FEATURE_VI_ASK_TERMINAL
> if (G.get_rowcol_error /* TODO? && no input on stdin */) {
>@@ -792,7 +819,10 @@ static void edit_file(char *fn)
> }
> #endif
> new_screen(rows, columns); // get memory for virtual screen
>- init_text_buffer(fn);
>+ init_text_buffer(fn, fd);
>+
>+ if (fd >= 0)
>+ close(fd);
>
> #if ENABLE_FEATURE_VI_YANKMARK
> YDreg = 26; // default Yank/Delete reg
>@@ -1195,7 +1225,7 @@ static void colon(char *buf)
> goto ret;
> }
>
>- size = init_text_buffer(fn);
>+ size = init_text_buffer(fn, -1);
>
> #if ENABLE_FEATURE_VI_YANKMARK
> if (Ureg >= 0 && Ureg < 28) {
>@@ -2960,6 +2990,32 @@ static int file_insert(const char *fn, char *p,
>int initial)
> return cnt;
> }
>
>+static int fd_insert(int fd, char *p)
>+{
>+ int size = BUFSIZ;
>+ int cnt = 0;
>+ int total = 0;
>+
>+ do {
>+ total += cnt;
>+ p += text_hole_make(p + total, size);
>+ cnt = full_read(fd, p + total, size);
>+ } while (cnt == size);
I think we already have open_read_close().
Thanks,
_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox