summaryrefslogtreecommitdiff
path: root/examples/dte/block-iter.h
diff options
context:
space:
mode:
Diffstat (limited to 'examples/dte/block-iter.h')
-rw-r--r--examples/dte/block-iter.h78
1 files changed, 78 insertions, 0 deletions
diff --git a/examples/dte/block-iter.h b/examples/dte/block-iter.h
new file mode 100644
index 0000000..aaef8cf
--- /dev/null
+++ b/examples/dte/block-iter.h
@@ -0,0 +1,78 @@
+#ifndef BLOCK_ITER_H
+#define BLOCK_ITER_H
+
+#include <stdbool.h>
+#include <stddef.h>
+#include "block.h"
+#include "util/list.h"
+#include "util/macros.h"
+#include "util/string-view.h"
+#include "util/unicode.h"
+
+typedef struct {
+ Block *blk;
+ const ListHead *head;
+ size_t offset;
+} BlockIter;
+
+static inline void block_iter_bof(BlockIter *bi)
+{
+ bi->blk = BLOCK(bi->head->next);
+ bi->offset = 0;
+}
+
+static inline void block_iter_eof(BlockIter *bi)
+{
+ bi->blk = BLOCK(bi->head->prev);
+ bi->offset = bi->blk->size;
+}
+
+static inline bool block_iter_is_eof(const BlockIter *bi)
+{
+ return bi->offset == bi->blk->size && bi->blk->node.next == bi->head;
+}
+
+static inline bool block_iter_is_bol(const BlockIter *bi)
+{
+ return bi->offset == 0 || bi->blk->data[bi->offset - 1] == '\n';
+}
+
+static inline bool block_iter_is_eol(const BlockIter *bi)
+{
+ const Block *blk = bi->blk;
+ size_t offset = bi->offset;
+ if (offset == blk->size) {
+ if (blk->node.next == bi->head) {
+ // EOF
+ return true;
+ }
+ // Normalize
+ blk = BLOCK(blk->node.next);
+ offset = 0;
+ }
+ return blk->data[offset] == '\n';
+}
+
+void block_iter_normalize(BlockIter *bi);
+size_t block_iter_eat_line(BlockIter *bi);
+size_t block_iter_next_line(BlockIter *bi);
+size_t block_iter_prev_line(BlockIter *bi);
+size_t block_iter_next_char(BlockIter *bi, CodePoint *up);
+size_t block_iter_prev_char(BlockIter *bi, CodePoint *up);
+size_t block_iter_next_column(BlockIter *bi);
+size_t block_iter_prev_column(BlockIter *bi);
+size_t block_iter_bol(BlockIter *bi);
+size_t block_iter_eol(BlockIter *bi);
+void block_iter_back_bytes(BlockIter *bi, size_t count);
+void block_iter_skip_bytes(BlockIter *bi, size_t count);
+void block_iter_goto_offset(BlockIter *bi, size_t offset);
+void block_iter_goto_line(BlockIter *bi, size_t line);
+size_t block_iter_get_offset(const BlockIter *bi) WARN_UNUSED_RESULT;
+size_t block_iter_get_char(const BlockIter *bi, CodePoint *up) WARN_UNUSED_RESULT;
+char *block_iter_get_bytes(const BlockIter *bi, size_t len) WARN_UNUSED_RESULT;
+
+void fill_line_ref(BlockIter *bi, StringView *line);
+void fill_line_nl_ref(BlockIter *bi, StringView *line);
+size_t fetch_this_line(const BlockIter *bi, StringView *line);
+
+#endif