diff options
| author | Marc André Tanner <mat@brain-dump.org> | 2020-09-26 15:04:30 +0200 |
|---|---|---|
| committer | Marc André Tanner <mat@brain-dump.org> | 2020-10-10 10:03:17 +0200 |
| commit | 68ac220b79d6db21df2fa78a562beff0db169dd1 (patch) | |
| tree | 0cfab4ded877c5d959f94807a8e26b7abfc67e14 | |
| parent | 9bb3fbbbc6445b457f1dca8ae2e0ea2eb915753d (diff) | |
| download | vis-68ac220b79d6db21df2fa78a562beff0db169dd1.tar.gz vis-68ac220b79d6db21df2fa78a562beff0db169dd1.tar.xz | |
text: introduce text_iterator_text
| -rw-r--r-- | text.c | 13 | ||||
| -rw-r--r-- | text.h | 1 |
2 files changed, 11 insertions, 3 deletions
@@ -1411,10 +1411,11 @@ Iterator text_iterator_get(Text *txt, size_t pos) { bool text_iterator_byte_get(Iterator *it, char *b) { if (text_iterator_valid(it)) { + Text *txt = text_iterator_text(it); if (it->start <= it->text && it->text < it->end) { *b = *it->text; return true; - } else if (it->pos == it->piece->text->size) { /* EOF */ + } else if (it->pos == text_size(txt)) { *b = '\0'; return true; } @@ -1433,6 +1434,10 @@ bool text_iterator_prev(Iterator *it) { return text_iterator_init(it, it->pos-off, it->piece ? it->piece->prev : NULL, len); } +Text *text_iterator_text(const Iterator *it) { + return it->piece ? it->piece->text : NULL; +} + bool text_iterator_valid(const Iterator *it) { /* filter out sentinel nodes */ return it->piece && it->piece->text; @@ -1549,9 +1554,10 @@ bool text_iterator_char_next(Iterator *it, char *c) { if (!text_iterator_codepoint_next(it, c)) return false; mbstate_t ps = { 0 }; + Text *txt = text_iterator_text(it); for (;;) { char buf[MB_LEN_MAX]; - size_t len = text_bytes_get(it->piece->text, it->pos, sizeof buf, buf); + size_t len = text_bytes_get(txt, it->pos, sizeof buf, buf); wchar_t wc; size_t wclen = mbrtowc(&wc, buf, len, &ps); if (wclen == (size_t)-1 && errno == EILSEQ) { @@ -1574,9 +1580,10 @@ bool text_iterator_char_next(Iterator *it, char *c) { bool text_iterator_char_prev(Iterator *it, char *c) { if (!text_iterator_codepoint_prev(it, c)) return false; + Text *txt = text_iterator_text(it); for (;;) { char buf[MB_LEN_MAX]; - size_t len = text_bytes_get(it->piece->text, it->pos, sizeof buf, buf); + size_t len = text_bytes_get(txt, it->pos, sizeof buf, buf); wchar_t wc; mbstate_t ps = { 0 }; size_t wclen = mbrtowc(&wc, buf, len, &ps); @@ -250,6 +250,7 @@ char *text_bytes_alloc0(Text*, size_t pos, size_t len); * @{ */ Iterator text_iterator_get(Text*, size_t pos); +Text *text_iterator_text(const Iterator*); bool text_iterator_valid(const Iterator*); bool text_iterator_has_next(const Iterator*); bool text_iterator_has_prev(const Iterator*); |
