aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2014-08-17 20:53:50 +0000
committerIngo Schwarze <schwarze@openbsd.org>2014-08-17 20:53:50 +0000
commit6bc581d1a26667c00bfa4397c833b05ca718ee9a (patch)
tree74339035f630d5731c5b26bf1632e1e90c75b60e
parent6dae70845e149f75383a1bbb4b745deffd14632e (diff)
downloadmandoc-6bc581d1a26667c00bfa4397c833b05ca718ee9a.tar.gz
mandoc-6bc581d1a26667c00bfa4397c833b05ca718ee9a.tar.zst
mandoc-6bc581d1a26667c00bfa4397c833b05ca718ee9a.zip
Do not require getsubopt() to provide extern char *suboptarg.
We don't use it anyway in mandoc. Like this, fewer systems need the compat implementation. In particular, we can now use the stock getsubopt() on glibc and musl. Besides, the comment in the BSD getsubopt.c that error messages are tricky without *suboptarg is massively overblown. If you simply save a copy of the pointer you pass into getsubopt(), that's quite usable for an error message. People start campaigning for the addition of *suboptarg to C libraries on the grounds that mandoc wants it, but actually, i consider library functions manipulating global data quite ugly, so stop pushing people into that questionable direction. While here, add an explicit Copyright header to the test file. While it's obviously to me what Kristaps intended, others might consider this file copyrightable and wonder what's up.
-rw-r--r--compat_getsubopt.c10
-rwxr-xr-xconfigure4
-rw-r--r--test-getsubopt.c23
3 files changed, 22 insertions, 15 deletions
diff --git a/compat_getsubopt.c b/compat_getsubopt.c
index 3a4a7d4a..880f2f78 100644
--- a/compat_getsubopt.c
+++ b/compat_getsubopt.c
@@ -6,6 +6,7 @@ int dummy;
#else
+/* $Id: compat_getsubopt.c,v 1.5 2014/08/17 20:53:50 schwarze Exp $ */
/* $OpenBSD: getsubopt.c,v 1.4 2005/08/08 08:05:36 espie Exp $ */
/*-
@@ -41,18 +42,11 @@ int dummy;
#include <stdlib.h>
#include <string.h>
-/*
- * The SVID interface to getsubopt provides no way of figuring out which
- * part of the suboptions list wasn't matched. This makes error messages
- * tricky... The extern variable suboptarg is a pointer to the token
- * which didn't match.
- */
-char *suboptarg;
-
int
getsubopt(char **optionp, char * const *tokens, char **valuep)
{
int cnt;
+ char *suboptarg;
char *p;
suboptarg = *valuep = NULL;
diff --git a/configure b/configure
index eb9311e3..baa05ad4 100755
--- a/configure
+++ b/configure
@@ -305,10 +305,8 @@ __HEREDOC__
[ ${HAVE_FGETLN} -eq 0 ] && \
echo "extern char *fgetln(FILE *, size_t *);"
-if [ ${HAVE_GETSUBOPT} -eq 0 ]; then
+[ ${HAVE_GETSUBOPT} -eq 0 ] && \
echo "extern int getsubopt(char **, char * const *, char **);"
- echo "extern char *suboptarg;"
-fi
[ ${HAVE_REALLOCARRAY} -eq 0 ] && \
echo "extern void *reallocarray(void *, size_t, size_t);"
diff --git a/test-getsubopt.c b/test-getsubopt.c
index 2da98238..b0835697 100644
--- a/test-getsubopt.c
+++ b/test-getsubopt.c
@@ -1,11 +1,26 @@
+/* $Id: test-getsubopt.c,v 1.3 2014/08/17 20:53:50 schwarze Exp $ */
+/*
+ * Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv>
+ *
+ * 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.
+ */
+
#if defined(__linux__) || defined(__MINT__)
-# define _GNU_SOURCE /* getsubopt() */
+#define _GNU_SOURCE /* getsubopt() */
#endif
#include <stdlib.h>
-extern char *suboptarg;
-
int
main(void)
{
@@ -15,5 +30,5 @@ main(void)
char *const tokens[] = { token0, NULL };
char *value = NULL;
return( ! (0 == getsubopt(&options, tokens, &value)
- && suboptarg == buf && value == buf+2 && options == buf+3));
+ && value == buf+2 && options == buf+3));
}