From 68ac220b79d6db21df2fa78a562beff0db169dd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Andr=C3=A9=20Tanner?= Date: Sat, 26 Sep 2020 15:04:30 +0200 Subject: text: introduce text_iterator_text --- text.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) (limited to 'text.c') diff --git a/text.c b/text.c index 2ffb78a..3296e1a 100644 --- a/text.c +++ b/text.c @@ -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); -- cgit v1.2.3