summaryrefslogtreecommitdiffstats
path: root/polyp/xmalloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'polyp/xmalloc.c')
-rw-r--r--polyp/xmalloc.c29
1 files changed, 20 insertions, 9 deletions
diff --git a/polyp/xmalloc.c b/polyp/xmalloc.c
index 8ff3054d..7d8b4821 100644
--- a/polyp/xmalloc.c
+++ b/polyp/xmalloc.c
@@ -52,25 +52,36 @@ void *pa_xrealloc(void *ptr, size_t size) {
return p;
}
-char *pa_xstrdup(const char *s) {
- if (!s)
+void* pa_xmemdup(const void *p, size_t l) {
+ if (!p)
return NULL;
else {
- char *r = strdup(s);
- if (!r)
- oom();
-
+ char *r = pa_xmalloc(l);
+ memcpy(r, p, l);
return r;
}
}
+char *pa_xstrdup(const char *s) {
+ if (!s)
+ return NULL;
+
+ return pa_xmemdup(s, strlen(s)+1);
+}
+
char *pa_xstrndup(const char *s, size_t l) {
if (!s)
return NULL;
else {
- char *r = strndup(s, l);
- if (!r)
- oom();
+ char *r;
+ size_t t = strlen(s);
+
+ if (t > l)
+ t = l;
+
+ r = pa_xmemdup(s, t+1);
+ r[t] = 0;
return r;
}
}
+