diff options
author | Todd C. Miller <millert@cvs.openbsd.org> | 2002-12-05 21:42:18 +0000 |
---|---|---|
committer | Todd C. Miller <millert@cvs.openbsd.org> | 2002-12-05 21:42:18 +0000 |
commit | 6926be91ff660a810708c6c6364bc02c4bb07b74 (patch) | |
tree | 33c87a8c1a944ca168fa93b7979124733306417a | |
parent | 5ef46eb79d8c949d1defbb793bf4191376db6efc (diff) |
simple regress for getopt_long() and getopt_long_only()
-rw-r--r-- | regress/lib/libc/getopt_long/Makefile | 27 | ||||
-rw-r--r-- | regress/lib/libc/getopt_long/getopt_long_test.c | 117 | ||||
-rw-r--r-- | regress/lib/libc/getopt_long/test.ok | 60 |
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 + |