aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2016-05-17 18:06:13 +0200
committerMarc André Tanner <mat@brain-dump.org>2016-05-18 15:07:02 +0200
commit826be3072ad3ce475ea39d80e5a6606a896d98c2 (patch)
tree3e93b11649540e37877ccbfd6881f1bc748862ce
parent39b306f235f3faebb047c7cda82746781b9ea2f2 (diff)
downloadvis-826be3072ad3ce475ea39d80e5a6606a896d98c2.tar.gz
vis-826be3072ad3ce475ea39d80e5a6606a896d98c2.tar.xz
vis: introduce vis_pipe_collect utility function
-rw-r--r--vis.c19
-rw-r--r--vis.h5
2 files changed, 24 insertions, 0 deletions
diff --git a/vis.c b/vis.c
index 3f04c87..e367291 100644
--- 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
index ab7eade..0b819a9 100644
--- 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. */