From d2004b15f1e90efafedc367335c07ad4636d291d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Andr=C3=A9=20Tanner?= Date: Fri, 7 Apr 2017 16:04:40 +0200 Subject: text: add mem{r,}chr(3) based byte search functions These are generally implemented efficiently in libc. While memrchr(3) is non-standard, it is a common extension. If it is not available, we use a simple C implementation from musl. --- text.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'text.c') 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 #include #include @@ -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)) { -- cgit v1.2.3