diff options
Diffstat (limited to 'text-iterator.c')
| -rw-r--r-- | text-iterator.c | 15 |
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; |
