aboutsummaryrefslogtreecommitdiff
path: root/text.c
diff options
context:
space:
mode:
Diffstat (limited to 'text.c')
-rw-r--r--text.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/text.c b/text.c
index f789339..1bf1940 100644
--- a/text.c
+++ b/text.c
@@ -1,3 +1,4 @@
+#define _GNU_SOURCE // memrchr(3) is non-standard
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
@@ -1455,6 +1456,34 @@ bool text_iterator_byte_prev(Iterator *it, char *b) {
return true;
}
+bool text_iterator_byte_find_prev(Iterator *it, char b) {
+ while (it->text) {
+ const char *match = memrchr(it->start, b, it->text - it->start);
+ if (match) {
+ it->pos -= it->text - match;
+ it->text = match;
+ return true;
+ }
+ text_iterator_prev(it);
+ }
+ text_iterator_next(it);
+ return false;
+}
+
+bool text_iterator_byte_find_next(Iterator *it, char b) {
+ while (it->text) {
+ const char *match = memchr(it->text, b, it->end - it->text);
+ if (match) {
+ it->pos += match - it->text;
+ it->text = match;
+ return true;
+ }
+ text_iterator_next(it);
+ }
+ text_iterator_prev(it);
+ return false;
+}
+
bool text_iterator_codepoint_next(Iterator *it, char *c) {
while (text_iterator_byte_next(it, NULL)) {
if (ISUTF8(*it->text)) {