aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZyX <kp-pav@yandex.ru>2017-07-04 17:03:07 +0300
committerZyX <kp-pav@yandex.ru>2017-07-04 18:37:01 +0300
commit5ab9e9f617934fae8f85ceb6db398dbf1e93471d (patch)
tree98a9aa561834cf61459cec70c5e6e75b36d11ade
parent94bd0f9915b0515fde449e3ee003ecbff3ad1b42 (diff)
downloadrneovim-5ab9e9f617934fae8f85ceb6db398dbf1e93471d.tar.gz
rneovim-5ab9e9f617934fae8f85ceb6db398dbf1e93471d.tar.bz2
rneovim-5ab9e9f617934fae8f85ceb6db398dbf1e93471d.zip
os/fileio: Add msgpack_file_write function
-rw-r--r--src/nvim/os/fileio.c21
-rw-r--r--test/unit/os/fileio_spec.lua16
2 files changed, 37 insertions, 0 deletions
diff --git a/src/nvim/os/fileio.c b/src/nvim/os/fileio.c
index 4309ac723c..d16746b7bf 100644
--- a/src/nvim/os/fileio.c
+++ b/src/nvim/os/fileio.c
@@ -26,6 +26,7 @@
#include "nvim/globals.h"
#include "nvim/rbuffer.h"
#include "nvim/macros.h"
+#include "nvim/message.h"
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "os/fileio.c.generated.h"
@@ -345,3 +346,23 @@ ptrdiff_t file_skip(FileDescriptor *const fp, const size_t size)
return (ptrdiff_t)read_bytes;
}
+
+/// Msgpack callback for writing to a file
+///
+/// @param data File to write to.
+/// @param[in] buf Data to write.
+/// @param[in] len Length of the data to write.
+///
+/// @return 0 in case of success, -1 in case of error.
+int msgpack_file_write(void *data, const char *buf, size_t len)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ assert(len < PTRDIFF_MAX);
+ const ptrdiff_t written_bytes = file_write((FileDescriptor *)data, buf, len);
+ if (written_bytes < 0) {
+ emsgf(_("E5420: Failed to write to file: %s"),
+ os_strerror((int)written_bytes));
+ return -1;
+ }
+ return 0;
+}
diff --git a/test/unit/os/fileio_spec.lua b/test/unit/os/fileio_spec.lua
index e3c8e616ce..a33a9637ee 100644
--- a/test/unit/os/fileio_spec.lua
+++ b/test/unit/os/fileio_spec.lua
@@ -62,6 +62,10 @@ local function file_write(fp, buf)
return m.file_write(fp, buf, #buf)
end
+local function msgpack_file_write(fp, buf)
+ return m.msgpack_file_write(fp, buf, #buf)
+end
+
local function file_read(fp, size)
local buf = nil
if size == nil then
@@ -393,6 +397,18 @@ describe('file_write', function()
end)
end)
+describe('msgpack_file_write', function()
+ itp('can write the whole file at once', function()
+ local err, fp = file_open(filec, m.kFileCreateOnly, 384)
+ eq(0, err)
+ eq(true, fp.wr)
+ local wr = msgpack_file_write(fp, fcontents)
+ eq(0, wr)
+ eq(0, m.file_close(fp, false))
+ eq(fcontents, io.open(filec):read('*a'))
+ end)
+end)
+
describe('file_skip', function()
itp('can skip 3 bytes', function()
local err, fp = file_open(file1, 0, 384)