aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/api/vim.c
diff options
context:
space:
mode:
authorJustin M. Keyes <justinkz@gmail.com>2018-01-09 10:36:25 +0100
committerJustin M. Keyes <justinkz@gmail.com>2018-01-10 23:58:56 +0100
commit5055d4a755d3c100cddf51bded77abca04beb971 (patch)
treeadd3e83843cdc030ad38b1c33f40bdda419f457b /src/nvim/api/vim.c
parentc095f83116eb8ef87983ca5fea61053755fbc4e5 (diff)
downloadrneovim-5055d4a755d3c100cddf51bded77abca04beb971.tar.gz
rneovim-5055d4a755d3c100cddf51bded77abca04beb971.tar.bz2
rneovim-5055d4a755d3c100cddf51bded77abca04beb971.zip
api: nvim_command_output: direct impl
Diffstat (limited to 'src/nvim/api/vim.c')
-rw-r--r--src/nvim/api/vim.c46
1 files changed, 28 insertions, 18 deletions
diff --git a/src/nvim/api/vim.c b/src/nvim/api/vim.c
index 8929bc5b9b..0e7cc428d4 100644
--- a/src/nvim/api/vim.c
+++ b/src/nvim/api/vim.c
@@ -219,28 +219,38 @@ String nvim_replace_termcodes(String str, Boolean from_part, Boolean do_lt,
String nvim_command_output(String command, Error *err)
FUNC_API_SINCE(1)
{
- Array args = ARRAY_DICT_INIT;
- ADD(args, STRING_OBJ(copy_string(command)));
- ADD(args, STRING_OBJ(cstr_to_string("silent")));
- String fn = cstr_to_string("execute");
- Object rv = nvim_call_function(fn, args, err);
- api_free_string(fn);
- api_free_array(args);
+ const int save_msg_silent = msg_silent;
+ garray_T *const save_capture_ga = capture_ga;
+ garray_T capture_local;
+ ga_init(&capture_local, 1, 80);
+
+ try_start();
+ msg_silent++;
+ capture_ga = &capture_local;
+ do_cmdline_cmd(command.data);
+ capture_ga = save_capture_ga;
+ msg_silent = save_msg_silent;
+ try_end(err);
+
if (ERROR_SET(err)) {
- assert(rv.type == kObjectTypeNil);
- return (String)STRING_INIT;
+ goto theend;
}
- assert(rv.type == kObjectTypeString);
- // execute() always(?) prepends a newline; remove it.
- if (rv.data.string.size > 1) {
- assert(rv.data.string.data[0] == '\n');
- String *s = &rv.data.string;
- s->size--;
- memmove(s->data, s->data + 1, s->size);
- s->data[s->size] = '\0';
+ if (capture_local.ga_len > 1) {
+ // redir always(?) prepends a newline; remove it.
+ char *s = capture_local.ga_data;
+ assert(s[0] == '\n');
+ memmove(s, s + 1, (size_t)capture_local.ga_len);
+ s[capture_local.ga_len - 1] = '\0';
+ return (String) { // Caller will free the memory.
+ .data = s,
+ .size = (size_t)(capture_local.ga_len - 1),
+ };
}
- return rv.data.string;
+
+theend:
+ ga_clear(&capture_local);
+ return (String)STRING_INIT;
}
/// Evaluates a VimL expression (:help expression).