aboutsummaryrefslogtreecommitdiff
path: root/src/memory.c
diff options
context:
space:
mode:
authorNicolas Hillegeer <nicolas@hillegeer.com>2014-04-26 19:10:49 +0200
committerThiago de Arruda <tpadilha84@gmail.com>2014-04-29 09:29:10 -0300
commit6b486f41d1b113bdb4018f5611105b83c7cd5455 (patch)
tree5764ccff4c3cada921dd1bb4491d681ce118fac4 /src/memory.c
parent466b73108fa42b9f6b20bf32f5954ab33495a09a (diff)
downloadrneovim-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.c20
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);