diff options
author | Nicolas Hillegeer <nicolas@hillegeer.com> | 2014-04-26 19:10:49 +0200 |
---|---|---|
committer | Thiago de Arruda <tpadilha84@gmail.com> | 2014-04-29 09:29:10 -0300 |
commit | 6b486f41d1b113bdb4018f5611105b83c7cd5455 (patch) | |
tree | 5764ccff4c3cada921dd1bb4491d681ce118fac4 /src/memory.c | |
parent | 466b73108fa42b9f6b20bf32f5954ab33495a09a (diff) | |
download | rneovim-6b486f41d1b113bdb4018f5611105b83c7cd5455.tar.gz rneovim-6b486f41d1b113bdb4018f5611105b83c7cd5455.tar.bz2 rneovim-6b486f41d1b113bdb4018f5611105b83c7cd5455.zip |
memory: implement xstp(n)cpy
Both are implemented to POSIX 2008 spec, though I'm not sure I'm happy about
stpncpy's behaviour.
Diffstat (limited to 'src/memory.c')
-rw-r--r-- | src/memory.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/src/memory.c b/src/memory.c index dff7e41bad..9e527bc513 100644 --- a/src/memory.c +++ b/src/memory.c @@ -173,6 +173,26 @@ void *xmemdupz(const void *data, size_t len) return memcpy(xmallocz(len), data, len); } +char *xstpcpy(char *restrict dst, const char *restrict src) +{ + const size_t len = strlen(src); + return (char *)memcpy(dst, src, len + 1) + len; +} + +char *xstpncpy(char *restrict dst, const char *restrict src, size_t maxlen) +{ + const char *p = memchr(src, '\0', maxlen); + if (p) { + size_t srclen = (size_t)(p - src); + memcpy(dst, src, srclen); + memset(dst + srclen, 0, maxlen - srclen); + return dst + srclen; + } else { + memcpy(dst, src, maxlen); + return dst + maxlen; + } +} + char * xstrdup(const char *str) { char *ret = strdup(str); |