diff options
| -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; } |
