vis

a vi-like editor based on Plan 9's structural regular expressions

git clone https://9o.is/git/vis.git

commit 72755a8bdb7b8a9972d4af9d4a7d1acf104830c2
parent 555720ed0c1403a6eccfba0a7c47834da35e992a
Author: Marc André Tanner <mat@brain-dump.org>
Date:   Tue, 17 May 2016 18:06:13 +0200

vis: introduce vis_pipe_collect utility function

Diffstat:
Mvis.c | 19+++++++++++++++++++
Mvis.h | 5+++++
2 files changed, 24 insertions(+), 0 deletions(-)

diff --git a/vis.c b/vis.c @@ -1325,6 +1325,25 @@ int vis_pipe(Vis *vis, Filerange *range, const char *argv[], return status; } +static ssize_t read_buffer(void *context, char *data, size_t len) { + buffer_append(context, data, len); + return len; +} + +int vis_pipe_collect(Vis *vis, Filerange *range, const char *argv[], char **out, char **err) { + Buffer bufout, buferr; + buffer_init(&bufout); + buffer_init(&buferr); + int status = vis_pipe(vis, range, argv, &bufout, read_buffer, &buferr, read_buffer); + buffer_terminate(&bufout); + buffer_terminate(&buferr); + if (out) + *out = bufout.data; + if (err) + *err = buferr.data; + return status; +} + bool vis_cmd(Vis *vis, const char *cmdline) { if (!cmdline) return true; diff --git a/vis.h b/vis.h @@ -422,6 +422,11 @@ int vis_pipe(Vis *vis, Filerange *range, const char *argv[], void *stdout_context, ssize_t (*read_stdout)(void *stdout_context, char *data, size_t len), void *stderr_context, ssize_t (*read_stderr)(void *stderr_context, char *data, size_t len)); +/* pipe a range to an external application, return its exit status and store + * everything that is written to stdout/stderr in the gitven char pointers + * which have to be free(3)-ed by the caller */ +int vis_pipe_collect(Vis *vis, Filerange *range, const char *argv[], char **out, char **err); + /* given the start of a key, returns a pointer to the start of the one immediately * following as will be processed by the input system. skips over special keys * such as <Enter> as well as pseudo keys registered via vis_action_register. */