summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--regress/lib/libc/getopt_long/Makefile27
-rw-r--r--regress/lib/libc/getopt_long/getopt_long_test.c117
-rw-r--r--regress/lib/libc/getopt_long/test.ok60
3 files changed, 204 insertions, 0 deletions
diff --git a/regress/lib/libc/getopt_long/Makefile b/regress/lib/libc/getopt_long/Makefile
new file mode 100644
index 00000000000..5237d82dd22
--- /dev/null
+++ b/regress/lib/libc/getopt_long/Makefile
@@ -0,0 +1,27 @@
+# $OpenBSD: Makefile,v 1.1 2002/12/05 21:42:17 millert Exp $
+
+NOMAN=
+PROG=getopt_long_test
+
+# test getopt_long and getopt_long_only
+run-regress-${PROG}: ${PROG}
+ @( test -n "$$POSIXLY_CORRECT" && unset POSIXLY_CORRECT; \
+ test -n "$$LONG_ONLY" && unset LONG_ONLY; \
+ ./${PROG} myfile --force -f infile -9 ; \
+ ./${PROG} onefile twofile --best --illiterate -i foo.in threefile ; \
+ ./${PROG} --fast --drinking guiness -i foo.in somefile ; \
+ export POSIXLY_CORRECT=1 ; \
+ ./${PROG} myfile --force -f infile -9 ; \
+ ./${PROG} onefile twofile --best --illiterate -i foo.in threefile ; \
+ ./${PROG} --fast --drinking guiness -i foo.in somefile ; \
+ unset POSIXLY_CORRECT ; export LONG_ONLY=1 ; \
+ ./${PROG} myfile -force -f infile -9 ; \
+ ./${PROG} onefile twofile --best -illiterate -i foo.in threefile ; \
+ ./${PROG} --fast -drinking guiness -i foo.in somefile ; \
+ export POSIXLY_CORRECT=1 ; \
+ ./${PROG} myfile -force -f infile -9 ; \
+ ./${PROG} onefile twofile --best -illiterate -i foo.in threefile ; \
+ ./${PROG} --fast -drinking guiness -i foo.in somefile ) >test.out 2>&1
+ cmp -s ${.OBJDIR}/test.out ${.CURDIR}/test.ok
+
+.include <bsd.regress.mk>
diff --git a/regress/lib/libc/getopt_long/getopt_long_test.c b/regress/lib/libc/getopt_long/getopt_long_test.c
new file mode 100644
index 00000000000..7b013e534b9
--- /dev/null
+++ b/regress/lib/libc/getopt_long/getopt_long_test.c
@@ -0,0 +1,117 @@
+/*
+ * Copyright (c) 2002 Todd C. Miller <Todd.Miller@courtesan.com>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+ * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <getopt.h>
+
+/*
+ * Simple getopt_long() and getopt_long_only() excerciser.
+ * ENVIRONMENT:
+ * LONG_ONLY : use getopt_long_only() (default is getopt_long())
+ * POSIXLY_CORRECT : don't permute args
+ */
+
+int
+main(int argc, char **argv)
+{
+ int ch, idx, goggles;
+ int (*gl)(int, char * const *, const char *, const struct option *, int *);
+ struct option longopts[] = {
+ { "force", no_argument, 0, 0 },
+ { "fast", no_argument, 0, '1' },
+ { "best", no_argument, 0, '9' },
+ { "input", required_argument, 0, 'i' },
+ { "illiterate", no_argument, 0, 0 },
+ { "drinking", required_argument, &goggles, 42 },
+ { "help", no_argument, 0, 'h' },
+ { 0, 0, 0, 0 },
+ };
+
+ if (getenv("LONG_ONLY")) {
+ gl = getopt_long_only;
+ printf("getopt_long_only");
+ } else {
+ gl = getopt_long;
+ printf("getopt_long");
+ }
+ if (getenv("POSIXLY_CORRECT"))
+ printf(" (POSIXLY_CORRECT)");
+ printf(": ");
+ for (idx = 1; idx < argc; idx++)
+ printf("%s ", argv[idx]);
+ printf("\n");
+
+ goggles = 0;
+ for (;;) {
+ idx = -1;
+ ch = gl(argc, argv, "19bf:i:h", longopts, &idx);
+ if (ch == -1)
+ break;
+ switch (ch) {
+ case 0:
+ case '1':
+ case '9':
+ case 'h':
+ if (idx != -1) {
+ if (goggles == 42)
+ printf("option %s, arg %s\n",
+ longopts[idx].name, optarg);
+ else
+ printf("option %s\n",
+ longopts[idx].name);
+ } else
+ printf("option %c\n", ch);
+ break;
+ case 'f':
+ case 'i':
+ if (idx != -1)
+ printf("option %s, arg %s\n",
+ longopts[idx].name, optarg);
+ else
+ printf("option %c, arg %s\n", ch, optarg);
+ break;
+
+ case '?':
+ break;
+
+ default:
+ printf("unexpected return value: %c\n", ch);
+ break;
+ }
+ }
+ argc -= optind;
+ argv += optind;
+
+ if (argc > 0) {
+ printf("remaining ARGV: ");
+ while (argc--)
+ printf("%s ", *argv++);
+ printf("\n");
+ }
+ printf("\n");
+
+ exit (0);
+}
diff --git a/regress/lib/libc/getopt_long/test.ok b/regress/lib/libc/getopt_long/test.ok
new file mode 100644
index 00000000000..0bade064f65
--- /dev/null
+++ b/regress/lib/libc/getopt_long/test.ok
@@ -0,0 +1,60 @@
+getopt_long: myfile --force -f infile -9
+option force
+option f, arg infile
+option 9
+remaining ARGV: myfile
+
+getopt_long: onefile twofile --best --illiterate -i foo.in threefile
+option best
+option illiterate
+option i, arg foo.in
+remaining ARGV: onefile twofile threefile
+
+getopt_long: --fast --drinking guiness -i foo.in somefile
+option fast
+option drinking, arg guiness
+option i, arg foo.in
+remaining ARGV: somefile
+
+getopt_long (POSIXLY_CORRECT): myfile --force -f infile -9
+remaining ARGV: myfile --force -f infile -9
+
+getopt_long (POSIXLY_CORRECT): onefile twofile --best --illiterate -i foo.in threefile
+remaining ARGV: onefile twofile --best --illiterate -i foo.in threefile
+
+getopt_long (POSIXLY_CORRECT): --fast --drinking guiness -i foo.in somefile
+option fast
+option drinking, arg guiness
+option i, arg foo.in
+remaining ARGV: somefile
+
+getopt_long_only: myfile -force -f infile -9
+option force
+option f, arg infile
+option 9
+remaining ARGV: myfile
+
+getopt_long_only: onefile twofile --best -illiterate -i foo.in threefile
+option best
+option illiterate
+option i, arg foo.in
+remaining ARGV: onefile twofile threefile
+
+getopt_long_only: --fast -drinking guiness -i foo.in somefile
+option fast
+option drinking, arg guiness
+option i, arg foo.in
+remaining ARGV: somefile
+
+getopt_long_only (POSIXLY_CORRECT): myfile -force -f infile -9
+remaining ARGV: myfile -force -f infile -9
+
+getopt_long_only (POSIXLY_CORRECT): onefile twofile --best -illiterate -i foo.in threefile
+remaining ARGV: onefile twofile --best -illiterate -i foo.in threefile
+
+getopt_long_only (POSIXLY_CORRECT): --fast -drinking guiness -i foo.in somefile
+option fast
+option drinking, arg guiness
+option i, arg foo.in
+remaining ARGV: somefile
+