aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2020-09-26 15:04:30 +0200
committerMarc André Tanner <mat@brain-dump.org>2020-10-10 10:03:17 +0200
commit68ac220b79d6db21df2fa78a562beff0db169dd1 (patch)
tree0cfab4ded877c5d959f94807a8e26b7abfc67e14
parent9bb3fbbbc6445b457f1dca8ae2e0ea2eb915753d (diff)
downloadvis-68ac220b79d6db21df2fa78a562beff0db169dd1.tar.gz
vis-68ac220b79d6db21df2fa78a562beff0db169dd1.tar.xz
text: introduce text_iterator_text
-rw-r--r--text.c13
-rw-r--r--text.h1
2 files changed, 11 insertions, 3 deletions
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);
diff --git a/text.h b/text.h
index b151414..6935ac5 100644
--- a/text.h
+++ b/text.h
@@ -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*);