]> Zhao Yanbai Git Server - minix.git/commitdiff
Importing usr.bin/getopt
authorThomas Cort <tcort@minix3.org>
Sat, 9 Mar 2013 19:22:06 +0000 (19:22 +0000)
committerLionel Sambuc <lionel@minix3.org>
Mon, 11 Mar 2013 10:31:55 +0000 (11:31 +0100)
distrib/sets/lists/minix/mi
releasetools/nbsd_ports
usr.bin/Makefile
usr.bin/getopt/Makefile [new file with mode: 0644]
usr.bin/getopt/getopt.1 [new file with mode: 0644]
usr.bin/getopt/getopt.c [new file with mode: 0644]

index b6f4c5edb65798bdc4d4c043c6797e222cea7247..c820f97783b4d958cae86dbb4871abc8adedcf49 100644 (file)
 ./usr/bin/gcore                                minix-sys
 ./usr/bin/gcov-pull                    minix-sys
 ./usr/bin/genassym                     minix-sys
+./usr/bin/getopt                       minix-sys
 ./usr/bin/grep                         minix-sys
 ./usr/bin/groups                       minix-sys
 ./usr/bin/gunzip                       minix-sys
 ./usr/man/man1/fsck.mfs.1              minix-sys
 ./usr/man/man1/ftp.1                   minix-sys
 ./usr/man/man1/genassym.1              minix-sys
+./usr/man/man1/getopt.1                        minix-sys
 ./usr/man/man1/getopts.1               minix-sys
 ./usr/man/man1/grep.1                  minix-sys
 ./usr/man/man1/groups.1                        minix-sys
index fecf0f49f33d1355d6796ae24c70492400bf85fd..01121a7c60fc6279db9cb649c52729b97a04f31c 100644 (file)
 2012/10/17 12:00:00,usr.bin/ctags
 2011/09/01 13:37:33,usr.bin/du
 2012/10/17 12:00:00,usr.bin/genassym
+2013/03/09 12:00:00,usr.bin/getopt
 2012/10/17 12:00:00,usr.bin/gzip
 2012/10/17 12:00:00,usr.bin/indent
 2012/10/17 12:00:00,usr.bin/infocmp
index dd11b4c8b04c750a137f1f20eaef78ec2db72f77..ab54878a141c1ee4a886f2dbffcb409d4658df7b 100644 (file)
@@ -11,7 +11,7 @@ SUBDIR= \
        du \
        \
        \
-       genassym \
+       genassym getopt \
        indent infocmp join \
        ldd \
        login lorder m4 \
diff --git a/usr.bin/getopt/Makefile b/usr.bin/getopt/Makefile
new file mode 100644 (file)
index 0000000..038df37
--- /dev/null
@@ -0,0 +1,5 @@
+#      $NetBSD: Makefile,v 1.4 1997/01/09 20:19:45 tls Exp $
+
+PROG = getopt
+
+.include <bsd.prog.mk>
diff --git a/usr.bin/getopt/getopt.1 b/usr.bin/getopt/getopt.1
new file mode 100644 (file)
index 0000000..bd946b0
--- /dev/null
@@ -0,0 +1,127 @@
+.\"    $NetBSD: getopt.1,v 1.19 2010/01/24 20:13:28 dholland Exp $
+.Dd November 28, 2009
+.Dt GETOPT 1
+.Os
+.Sh NAME
+.Nm getopt
+.Nd parse command options
+.Sh SYNOPSIS
+.Li args=\`getopt optstring $*\`
+.Pp
+.Li set \-\- \`getopt optstring $*\`
+.Sh DESCRIPTION
+.Nm
+is used to break up options in command lines for easy parsing by
+shell procedures, and to check for legal options.
+.Op Optstring
+is a string of recognized option letters (see
+.Xr getopt 3 ) ;
+if a letter is followed by a colon, the option
+is expected to have an argument which may or may not be
+separated from it by white space.
+The special option
+.Dq \-\-
+is used to delimit the end of the options.
+.Nm
+will place
+.Dq \-\-
+in the arguments at the end of the options,
+or recognize it if used explicitly.
+The shell arguments
+.Pq Ev $1 , Ev $2 , ...
+are reset so that each option is
+preceded by a
+.Dq \-
+and in its own shell argument;
+each option argument is also in its own shell argument.
+.Pp
+.Nm
+should not be used in new scripts; use the shell builtin
+.Nm getopts
+instead.
+.Sh EXAMPLES
+The following code fragment shows how one might process the arguments
+for a command that can take the options
+.Op a
+and
+.Op b ,
+and the option
+.Op c ,
+which requires an argument.
+.Pp
+.Bd -literal -offset indent
+args=\`getopt abc: $*\`
+if [ $? \-ne 0 ]; then
+       echo 'Usage: ...'
+       exit 2
+fi
+set \-\- $args
+while [ $# \-gt 0 ]; do
+       case "$1" in
+               \-a|\-b)
+                       flag=$1
+                       ;;
+               \-c)
+                       carg=$2; shift
+                       ;;
+               \-\-)
+                       shift; break
+                       ;;
+       esac
+       shift
+done
+.Ed
+.Pp
+This code will accept any of the following as equivalent:
+.Pp
+.Bd -literal -offset indent
+cmd \-acarg file file
+cmd \-a \-c arg file file
+cmd \-carg -a file file
+cmd \-a \-carg \-\- file file
+.Ed
+.Pp
+.St -p1003.2
+mandates that the
+.Xr sh 1
+set command return the value of 0 for the exit status.
+Therefore, the exit status of the
+.Nm
+command is lost when
+.Nm
+and the
+.Xr sh 1
+set command are used on the same line.
+The example given is one way to detect errors found by
+.Nm .
+.Sh DIAGNOSTICS
+.Nm
+prints an error message on the standard error output when it
+encounters an option letter not included in
+.Op optstring .
+.Sh SEE ALSO
+.Xr sh 1 ,
+.Xr getopt 3
+.Sh HISTORY
+Written by Henry Spencer, working from a Bell Labs manual page.
+Behavior believed identical to the Bell version.
+.Sh BUGS
+Whatever
+.Xr getopt 3
+has.
+.Pp
+Arguments containing white space or embedded shell metacharacters
+generally will not survive intact;  this looks easy to fix but isn't.
+.Pp
+The error message for an invalid option is identified as coming
+from
+.Nm
+rather than from the shell procedure containing the invocation
+of
+.Nm ;
+this again is hard to fix.
+.Pp
+The precise best way to use the
+.Ic set
+command to set the arguments without disrupting the value(s) of
+shell options varies from one shell version to another.
diff --git a/usr.bin/getopt/getopt.c b/usr.bin/getopt/getopt.c
new file mode 100644 (file)
index 0000000..c28f287
--- /dev/null
@@ -0,0 +1,41 @@
+/*     $NetBSD: getopt.c,v 1.8 2006/07/09 21:39:48 wiz Exp $   */
+
+/*
+ * This material, written by Henry Spencer, was released by him
+ * into the public domain and is thus not subject to any copyright.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: getopt.c,v 1.8 2006/07/09 21:39:48 wiz Exp $");
+#endif /* not lint */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+int
+main(int argc, char *argv[])
+{
+       int c;
+       int status = 0;
+
+       optind = 2;     /* Past the program name and the option letters. */
+       while ((c = getopt(argc, argv, argv[1])) != -1)
+               switch (c) {
+               case '?':
+                       status = 1;     /* getopt routine gave message */
+                       break;
+               default:
+                       if (optarg != NULL)
+                               printf(" -%c %s", c, optarg);
+                       else
+                               printf(" -%c", c);
+                       break;
+               }
+       printf(" --");
+       for (; optind < argc; optind++)
+               printf(" %s", argv[optind]);
+       printf("\n");
+       exit(status);
+}