vis
a vi-like editor based on Plan 9's structural regular expressions
git clone https://9o.is/git/vis.git
commit a7eb693621225b1698b494835f910ad2a4103dc5 parent 6c8203897713ce8ae1ac55c06f79acbe0fe4623a Author: Marc André Tanner <mat@brain-dump.org> Date: Fri, 30 Sep 2016 17:38:46 +0200 sam: simplify :r command implementaion Avoid intermediate shell. Diffstat:
| M | sam.c | | | 19 | ++++++------------- |
1 file changed, 6 insertions(+), 13 deletions(-)
diff --git a/sam.c b/sam.c @@ -1154,18 +1154,11 @@ static bool cmd_read(Vis *vis, Win *win, Command *cmd, const char *argv[], Curso return false; } - Buffer buf; - buffer_init(&buf); - bool ret = buffer_put0(&buf, "cat --"); - for (const char **name = &argv[1]; *name; name++) { - ret &= buffer_append0(&buf, " '"); - ret &= buffer_append0(&buf, *name); - ret &= buffer_append0(&buf, "'"); - } - if (ret) - ret = cmd_pipein(vis, win, cmd, (const char*[]){ argv[0], buf.data, NULL }, cur, range); - buffer_release(&buf); - return ret; + const char *args[MAX_ARGV] = { argv[0], "cat", "--" }; + for (int i = 3; i < MAX_ARGV-2; i++) + args[i] = argv[i-2]; + args[MAX_ARGV-1] = NULL; + return cmd_pipein(vis, win, cmd, (const char**)args, cur, range); } static ssize_t read_text(void *context, char *data, size_t len) { @@ -1226,7 +1219,7 @@ static bool cmd_pipein(Vis *vis, Win *win, Command *cmd, const char *argv[], Cur if (!win) return false; Filerange filter_range = text_range_new(range->end, range->end); - bool ret = cmd_filter(vis, win, cmd, (const char*[]){ argv[0], argv[1], NULL }, cur, &filter_range); + bool ret = cmd_filter(vis, win, cmd, argv, cur, &filter_range); if (ret) { text_delete_range(win->file->text, range); range->end = range->start + text_range_size(&filter_range);