diff options
| author | Marc André Tanner <mat@brain-dump.org> | 2014-10-25 15:18:23 +0200 |
|---|---|---|
| committer | Marc André Tanner <mat@brain-dump.org> | 2014-10-25 15:32:49 +0200 |
| commit | c42e9887aac08eeb96ccbe58453969497b5ea0ee (patch) | |
| tree | 081a4b1096c7cd8362e8855482b7c3ca961c48e1 | |
| parent | af1859662a3551f6b0da4c7c56df3854748d66e8 (diff) | |
| download | vis-c42e9887aac08eeb96ccbe58453969497b5ea0ee.tar.gz vis-c42e9887aac08eeb96ccbe58453969497b5ea0ee.tar.xz | |
Support partial writes
| -rw-r--r-- | text.c | 29 | ||||
| -rw-r--r-- | text.h | 1 | ||||
| -rw-r--r-- | vis.c | 2 |
3 files changed, 22 insertions, 10 deletions
@@ -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. @@ -87,6 +87,7 @@ bool text_newlines_crnl(Text*); bool text_save(Text*, const char *file); bool text_range_save(Text*, Filerange*, const char *file); ssize_t text_write(Text*, int fd); +ssize_t text_range_write(Text*, Filerange*, int fd); void text_free(Text*); typedef struct Regex Regex; @@ -1416,7 +1416,7 @@ static bool cmd_write(Filerange *range, const char *argv[]) { argv[1] = text_filename_get(text); if (!argv[1]) { if (text_fd_get(text) == STDIN_FILENO) - return text_write(text, STDOUT_FILENO) >= 0; + return text_range_write(text, range, STDOUT_FILENO) >= 0; editor_info_show(vis, "Filename expected"); return false; } |
