diff options
author | Carl Worth <cworth@cworth.org> | 2009-12-01 12:51:39 -0800 |
---|---|---|
committer | Carl Worth <cworth@cworth.org> | 2009-12-01 12:51:39 -0800 |
commit | 8b445212e46a194b59edbd6857449430fe460165 (patch) | |
tree | 7133fd094201bb6ef7702034a65b59858bba66e2 | |
parent | e5316b320a51915fc1dbdd8724643931cd03327f (diff) |
xutil: Implement xstrndup without relying on strndup.
Since we need to do this for portability, (some systems don't have a
strndup function), we might as well do it unconditionally. There's
almost no disadvantage to doing so, and this has the advantages of not
requiring a configure-time check nor having two different
implementations, one of which would often be less tested.
-rw-r--r-- | TODO | 2 | ||||
-rw-r--r-- | lib/xutil.c | 8 |
2 files changed, 6 insertions, 4 deletions
@@ -41,8 +41,6 @@ Portability ----------- Fix configure script to test each compiler warning we want to use. -Implement strndup locally (or call talloc_strndup instead). - Implement getline locally, (look at gnulib). Completion diff --git a/lib/xutil.c b/lib/xutil.c index 6fa5eb0d..268225b8 100644 --- a/lib/xutil.c +++ b/lib/xutil.c @@ -18,7 +18,6 @@ * Author: Carl Worth <cworth@cworth.org> */ -#define _GNU_SOURCE /* For strndup */ #include "notmuch-private.h" #include <stdio.h> @@ -84,11 +83,16 @@ xstrndup (const char *s, size_t n) { char *ret; - ret = strndup (s, n); + if (strlen (s) <= n) + n = strlen (s); + + ret = malloc (n + 1); if (ret == NULL) { fprintf (stderr, "Out of memory.\n"); exit (1); } + memcpy (ret, s, n); + ret[n] = '\0'; return ret; } |