From c42e9887aac08eeb96ccbe58453969497b5ea0ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Andr=C3=A9=20Tanner?= Date: Sat, 25 Oct 2014 15:18:23 +0200 Subject: Support partial writes --- text.c | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) (limited to 'text.c') diff --git a/text.c b/text.c index c0b5eee..40d09f0 100644 --- a/text.c +++ b/text.c @@ -664,26 +664,37 @@ err: } ssize_t text_write(Text *txt, int fd) { - ssize_t len = 0; - text_iterate(txt, it, 0) { - size_t plen = it.end - it.start, poff = 0; - while (plen > 0) { - ssize_t res = write(fd, it.start + poff, plen); + Filerange r = (Filerange){ .start = 0, .end = text_size(txt) }; + return text_range_write(txt, &r, fd); +} + +ssize_t text_range_write(Text *txt, Filerange *range, int fd) { + size_t size = range->end - range->start; + size_t rem = size; + for (Iterator it = text_iterator_get(txt, range->start); + rem > 0 && text_iterator_valid(&it); + text_iterator_next(&it)) { + size_t prem = it.end - it.text, poff = 0; + if (prem > rem) + prem = rem; + while (prem > 0) { + ssize_t res = write(fd, it.text + poff, prem); if (res < 0) { if (errno == EAGAIN || errno == EINTR) continue; return -1; } if (res == 0) - break; + goto out; poff += res; - plen -= res; + prem -= res; + rem -= res; } - len += plen; } +out: txt->saved_action = txt->undo; text_snapshot(txt); - return len; + return size - rem; } /* load the given file as starting point for further editing operations. -- cgit v1.2.3