Expose BufferedWriter
This commit is contained in:
parent
914f4f8c19
commit
a566a22cbc
37
src/file.cc
37
src/file.cc
|
@ -279,43 +279,6 @@ void write_to_file(StringView filename, StringView data)
|
||||||
write(fd, data);
|
write(fd, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct BufferedWriter
|
|
||||||
{
|
|
||||||
BufferedWriter(int fd)
|
|
||||||
: m_fd{fd}, m_exception_count{std::uncaught_exceptions()} {}
|
|
||||||
|
|
||||||
~BufferedWriter() noexcept(false)
|
|
||||||
{
|
|
||||||
if (m_pos != 0 and m_exception_count == std::uncaught_exceptions())
|
|
||||||
Kakoune::write(m_fd, {m_buffer, m_pos});
|
|
||||||
}
|
|
||||||
|
|
||||||
void write(StringView data)
|
|
||||||
{
|
|
||||||
while (not data.empty())
|
|
||||||
{
|
|
||||||
const ByteCount length = data.length();
|
|
||||||
const ByteCount write_len = std::min(length, size - m_pos);
|
|
||||||
memcpy(m_buffer + (int)m_pos, data.data(), (int)write_len);
|
|
||||||
m_pos += write_len;
|
|
||||||
if (m_pos == size)
|
|
||||||
{
|
|
||||||
Kakoune::write(m_fd, {m_buffer, size});
|
|
||||||
m_pos = 0;
|
|
||||||
}
|
|
||||||
data = data.substr(write_len);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
static constexpr ByteCount size = 4096;
|
|
||||||
int m_fd;
|
|
||||||
int m_exception_count;
|
|
||||||
ByteCount m_pos = 0;
|
|
||||||
char m_buffer[(int)size];
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
void write_buffer_to_fd(Buffer& buffer, int fd)
|
void write_buffer_to_fd(Buffer& buffer, int fd)
|
||||||
{
|
{
|
||||||
auto eolformat = buffer.options()["eolformat"].get<EolFormat>();
|
auto eolformat = buffer.options()["eolformat"].get<EolFormat>();
|
||||||
|
|
38
src/file.hh
38
src/file.hh
|
@ -10,6 +10,7 @@
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
namespace Kakoune
|
namespace Kakoune
|
||||||
{
|
{
|
||||||
|
@ -121,6 +122,43 @@ CandidateList complete_filename(StringView prefix, const Regex& ignore_regex,
|
||||||
|
|
||||||
CandidateList complete_command(StringView prefix, ByteCount cursor_pos = -1);
|
CandidateList complete_command(StringView prefix, ByteCount cursor_pos = -1);
|
||||||
|
|
||||||
|
template<int buffer_size = 4096>
|
||||||
|
struct BufferedWriter
|
||||||
|
{
|
||||||
|
BufferedWriter(int fd)
|
||||||
|
: m_fd{fd}, m_exception_count{std::uncaught_exceptions()} {}
|
||||||
|
|
||||||
|
~BufferedWriter() noexcept(false)
|
||||||
|
{
|
||||||
|
if (m_pos != 0 and m_exception_count == std::uncaught_exceptions())
|
||||||
|
Kakoune::write(m_fd, {m_buffer, m_pos});
|
||||||
|
}
|
||||||
|
|
||||||
|
void write(StringView data)
|
||||||
|
{
|
||||||
|
while (not data.empty())
|
||||||
|
{
|
||||||
|
const ByteCount length = data.length();
|
||||||
|
const ByteCount write_len = std::min(length, size - m_pos);
|
||||||
|
memcpy(m_buffer + (int)m_pos, data.data(), (int)write_len);
|
||||||
|
m_pos += write_len;
|
||||||
|
if (m_pos == size)
|
||||||
|
{
|
||||||
|
Kakoune::write(m_fd, {m_buffer, size});
|
||||||
|
m_pos = 0;
|
||||||
|
}
|
||||||
|
data = data.substr(write_len);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
static constexpr ByteCount size = buffer_size;
|
||||||
|
int m_fd;
|
||||||
|
int m_exception_count;
|
||||||
|
ByteCount m_pos = 0;
|
||||||
|
char m_buffer[(int)size];
|
||||||
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // file_hh_INCLUDED
|
#endif // file_hh_INCLUDED
|
||||||
|
|
Loading…
Reference in New Issue
Block a user