aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2018-02-27 11:16:23 +0000
committerIngo Schwarze <schwarze@openbsd.org>2018-02-27 11:16:23 +0000
commit957f6aafd9fc45fb66da1888378b261ed1209036 (patch)
treead633fa7f56954e3ad4e8d1f586be4e0a9a301b3
parent5dd8c40e5ee7a6f5e3acca5d38042a17760e0cde (diff)
downloadmandoc-957f6aafd9fc45fb66da1888378b261ed1209036.tar.gz
mandoc-957f6aafd9fc45fb66da1888378b261ed1209036.tar.zst
mandoc-957f6aafd9fc45fb66da1888378b261ed1209036.zip
Add strndup(3) compat implementation.
Jan Stary reports that MacOS X Snow Leopard and older lacks it.
-rw-r--r--Makefile5
-rw-r--r--compat_strndup.c50
-rwxr-xr-xconfigure11
-rw-r--r--test-strndup.c10
4 files changed, 73 insertions, 3 deletions
diff --git a/Makefile b/Makefile
index bbababa2..a9626643 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,4 @@
-# $Id: Makefile,v 1.517 2017/08/05 13:34:39 schwarze Exp $
+# $Id: Makefile,v 1.518 2018/02/27 11:16:23 schwarze Exp $
#
# Copyright (c) 2010, 2011, 2012 Kristaps Dzonsons <kristaps@bsd.lv>
# Copyright (c) 2011, 2013-2017 Ingo Schwarze <schwarze@openbsd.org>
@@ -46,6 +46,7 @@ TESTSRCS = test-be32toh.c \
test-stringlist.c \
test-strlcat.c \
test-strlcpy.c \
+ test-strndup.c \
test-strptime.c \
test-strsep.c \
test-strtonum.c \
@@ -70,6 +71,7 @@ SRCS = att.c \
compat_stringlist.c \
compat_strlcat.c \
compat_strlcpy.c \
+ compat_strndup.c \
compat_strsep.c \
compat_strtonum.c \
compat_vasprintf.c \
@@ -249,6 +251,7 @@ COMPAT_OBJS = compat_err.o \
compat_strcasestr.o \
compat_strlcat.o \
compat_strlcpy.o \
+ compat_strndup.o \
compat_strsep.o \
compat_strtonum.o \
compat_vasprintf.o
diff --git a/compat_strndup.c b/compat_strndup.c
new file mode 100644
index 00000000..5e127364
--- /dev/null
+++ b/compat_strndup.c
@@ -0,0 +1,50 @@
+#include "config.h"
+
+#if HAVE_STRNDUP
+
+int dummy;
+
+#else
+
+/* $Id: compat_strndup.c,v 1.1 2018/02/27 11:16:23 schwarze Exp $ */
+/* OpenBSD: strndup.c,v 1.2 2015/08/31 02:53:57 guenther Exp */
+/*
+ * Copyright (c) 2010 Todd C. Miller <Todd.Miller@courtesan.com>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <sys/types.h>
+
+#include <stdlib.h>
+#include <string.h>
+
+char *
+strndup(const char *str, size_t maxlen)
+{
+ char *copy;
+ size_t len;
+
+ for (len = 0; len < maxlen && str[len] != '\0'; len++)
+ continue;
+
+ copy = malloc(len + 1);
+ if (copy != NULL) {
+ (void)memcpy(copy, str, len);
+ copy[len] = '\0';
+ }
+
+ return copy;
+}
+
+#endif
diff --git a/configure b/configure
index f9416ce7..e7224cd2 100755
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# $Id: configure,v 1.64 2017/07/01 09:47:30 schwarze Exp $
+# $Id: configure,v 1.65 2018/02/27 11:16:23 schwarze Exp $
#
# Copyright (c) 2014, 2015, 2016, 2017 Ingo Schwarze <schwarze@openbsd.org>
#
@@ -83,6 +83,7 @@ HAVE_STRCASESTR=
HAVE_STRINGLIST=
HAVE_STRLCAT=
HAVE_STRLCPY=
+HAVE_STRNDUP=
HAVE_STRPTIME=
HAVE_STRSEP=
HAVE_STRTONUM=
@@ -238,6 +239,7 @@ runtest strcasestr STRCASESTR || true
runtest stringlist STRINGLIST || true
runtest strlcat STRLCAT || true
runtest strlcpy STRLCPY || true
+runtest strndup STRNDUP || true
runtest strptime STRPTIME || true
runtest strsep STRSEP || true
runtest strtonum STRTONUM || true
@@ -353,7 +355,8 @@ __HEREDOC__
[ ${HAVE_GETLINE} -eq 0 -o \
${HAVE_REALLOCARRAY} -eq 0 -o ${HAVE_RECALLOCARRAY} -eq 0 -o \
- ${HAVE_STRLCAT} -eq 0 -o ${HAVE_STRLCPY} -eq 0 ] \
+ ${HAVE_STRLCAT} -eq 0 -o ${HAVE_STRLCPY} -eq 0 -o \
+ ${HAVE_STRNDUP} -eq 0 ] \
&& echo "#include <sys/types.h>"
[ ${HAVE_VASPRINTF} -eq 0 ] && echo "#include <stdarg.h>"
[ ${HAVE_GETLINE} -eq 0 ] && echo "#include <stdio.h>"
@@ -396,6 +399,7 @@ cat << __HEREDOC__
#define HAVE_STRINGLIST ${HAVE_STRINGLIST}
#define HAVE_STRLCAT ${HAVE_STRLCAT}
#define HAVE_STRLCPY ${HAVE_STRLCPY}
+#define HAVE_STRNDUP ${HAVE_STRNDUP}
#define HAVE_STRPTIME ${HAVE_STRPTIME}
#define HAVE_STRSEP ${HAVE_STRSEP}
#define HAVE_STRTONUM ${HAVE_STRTONUM}
@@ -452,6 +456,9 @@ fi
[ ${HAVE_STRLCPY} -eq 0 ] && \
echo "extern size_t strlcpy(char *, const char *, size_t);"
+[ ${HAVE_STRNDUP} -eq 0 ] && \
+ echo "extern char *strndup(const char *, size_t);"
+
[ ${HAVE_STRSEP} -eq 0 ] && \
echo "extern char *strsep(char **, const char *);"
diff --git a/test-strndup.c b/test-strndup.c
new file mode 100644
index 00000000..82e4e547
--- /dev/null
+++ b/test-strndup.c
@@ -0,0 +1,10 @@
+#include <string.h>
+
+int
+main(void)
+{
+ char *s;
+
+ s = strndup("123", 2);
+ return s[0] != '1' ? 1 : s[1] != '2' ? 2 : s[2] != '\0' ? 3 : 0;
+}