diff options
| author | Marc André Tanner <mat@brain-dump.org> | 2014-07-21 13:23:41 +0200 |
|---|---|---|
| committer | Marc André Tanner <mat@brain-dump.org> | 2014-07-21 13:23:41 +0200 |
| commit | 39f545e518d22b8f9e792902675e69e7592b806a (patch) | |
| tree | 5541511d3463ae2b85e8dcedc653391a7d93778f /editor.c | |
| parent | 67d8948f37e59b9206e27070d91c7e368c099aae (diff) | |
| download | vis-39f545e518d22b8f9e792902675e69e7592b806a.tar.gz vis-39f545e518d22b8f9e792902675e69e7592b806a.tar.xz | |
Add iterator functions to walk through text
Diffstat (limited to 'editor.c')
| -rw-r--r-- | editor.c | 51 |
1 files changed, 51 insertions, 0 deletions
@@ -272,6 +272,24 @@ static Location piece_get(Editor *ed, size_t pos) { return loc; } +static Location piece_get_public(Editor *ed, size_t pos) { + Location loc = {}; + // TODO: handle position at end of file: pos+1 + size_t cur = 0; + for (Piece *p = ed->begin.next; p->next; p = p->next) { + if (cur <= pos && pos <= cur + p->len) { + loc.piece = p; + loc.off = pos - cur; + return loc; + } + cur += p->len; + } + + return loc; +} + + + static Change *change_alloc(Editor *ed) { Action *a = ed->current_action; if (!a) { @@ -640,3 +658,36 @@ void editor_free(Editor *ed) { bool editor_modified(Editor *ed) { return ed->saved_action != ed->undo; } + +Iterator editor_iterator_get(Editor *ed, size_t pos) { + Location loc = piece_get_public(ed, pos); + Piece *p = loc.piece; + return (Iterator){ + .piece = p, + .text = p ? p->content + loc.off : NULL, + .len = p ? p->len - loc.off : 0, + }; +} + +void editor_iterator_next(Iterator *it) { + Piece *p = it->piece ? it->piece->next : NULL; + *it = (Iterator){ + .piece = p, + .text = p ? p->content : NULL, + .len = p ? p->len : 0, + }; +} + +void editor_iterator_prev(Iterator *it) { + Piece *p = it->piece ? it->piece->prev : NULL; + *it = (Iterator){ + .piece = p, + .text = p ? p->content : NULL, + .len = p ? p->len : 0, + }; +} + +bool editor_iterator_valid(const Iterator *it) { + /* filter out sentinel nodes */ + return it->piece && it->piece->editor; +} |
