diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/memory.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/src/nvim/memory.c b/src/nvim/memory.c index 3f9e8f1ada..59edefec4a 100644 --- a/src/nvim/memory.c +++ b/src/nvim/memory.c @@ -1,5 +1,6 @@ // Various routines dealing with allocation and deallocation of memory. +#include <assert.h> #include <errno.h> #include <inttypes.h> #include <string.h> @@ -251,6 +252,37 @@ void *xmemscan(const void *addr, char c, size_t size) return p ? p : (char *)addr + size; } +/// Replaces every instance of `c` with `x`. +/// +/// @warning Will read past `str + strlen(str)` if `c == NUL`. +/// +/// @param str A NUL-terminated string. +/// @param c The unwanted byte. +/// @param x The replacement. +void strchrsub(char *str, char c, char x) + FUNC_ATTR_NONNULL_ALL +{ + assert(c != '\0'); + while ((str = strchr(str, c))) { + *str++ = x; + } +} + +/// Replaces every instance of `c` with `x`. +/// +/// @param data An object in memory. May contain NULs. +/// @param c The unwanted byte. +/// @param x The replacement. +/// @param len The length of data. +void memchrsub(void *data, char c, char x, size_t len) + FUNC_ATTR_NONNULL_ALL +{ + char *p = data, *end = (char *)data + len; + while ((p = memchr(p, c, (size_t)(end - p)))) { + *p++ = x; + } +} + /// The xstpcpy() function shall copy the string pointed to by src (including /// the terminating NUL character) into the array pointed to by dst. /// |