aboutsummaryrefslogtreecommitdiff
path: root/text-iterator.c
diff options
context:
space:
mode:
Diffstat (limited to 'text-iterator.c')
-rw-r--r--text-iterator.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/text-iterator.c b/text-iterator.c
index e080ca5..b61c609 100644
--- a/text-iterator.c
+++ b/text-iterator.c
@@ -1,6 +1,3 @@
-#ifndef _GNU_SOURCE
-#define _GNU_SOURCE /* memrchr(3) is non-standard */
-#endif
#include <limits.h>
#include <stddef.h>
#include <errno.h>
@@ -72,9 +69,19 @@ bool text_iterator_byte_prev(Iterator *it, char *b) {
return true;
}
+static void *scan_memory_reverse(const void *memory, int byte, ptrdiff_t n)
+{
+ void *result = 0;
+ if (n > 0) {
+ const signed char *s = memory;
+ while (n) if (s[--n] == byte) { result = (void *)(s + n); break; }
+ }
+ return result;
+}
+
bool text_iterator_byte_find_prev(Iterator *it, char b) {
while (it->text) {
- const char *match = memrchr(it->start, b, it->text - it->start);
+ const char *match = scan_memory_reverse(it->start, b, it->text - it->start);
if (match) {
it->pos -= it->text - match;
it->text = match;