From fe7b9c06f9cfab098c662a84c29ef3ea82085c56 Mon Sep 17 00:00:00 2001 From: Thomas Cort Date: Sat, 9 Mar 2013 19:22:06 +0000 Subject: [PATCH] Importing usr.bin/getopt --- distrib/sets/lists/minix/mi | 2 + releasetools/nbsd_ports | 1 + usr.bin/Makefile | 2 +- usr.bin/getopt/Makefile | 5 ++ usr.bin/getopt/getopt.1 | 127 ++++++++++++++++++++++++++++++++++++ usr.bin/getopt/getopt.c | 41 ++++++++++++ 6 files changed, 177 insertions(+), 1 deletion(-) create mode 100644 usr.bin/getopt/Makefile create mode 100644 usr.bin/getopt/getopt.1 create mode 100644 usr.bin/getopt/getopt.c diff --git a/distrib/sets/lists/minix/mi b/distrib/sets/lists/minix/mi index b6f4c5edb..c820f9778 100644 --- a/distrib/sets/lists/minix/mi +++ b/distrib/sets/lists/minix/mi @@ -276,6 +276,7 @@ ./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 @@ -1253,6 +1254,7 @@ ./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 diff --git a/releasetools/nbsd_ports b/releasetools/nbsd_ports index fecf0f49f..01121a7c6 100644 --- a/releasetools/nbsd_ports +++ b/releasetools/nbsd_ports @@ -128,6 +128,7 @@ 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 diff --git a/usr.bin/Makefile b/usr.bin/Makefile index dd11b4c8b..ab54878a1 100644 --- a/usr.bin/Makefile +++ b/usr.bin/Makefile @@ -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 index 000000000..038df3715 --- /dev/null +++ b/usr.bin/getopt/Makefile @@ -0,0 +1,5 @@ +# $NetBSD: Makefile,v 1.4 1997/01/09 20:19:45 tls Exp $ + +PROG = getopt + +.include diff --git a/usr.bin/getopt/getopt.1 b/usr.bin/getopt/getopt.1 new file mode 100644 index 000000000..bd946b042 --- /dev/null +++ b/usr.bin/getopt/getopt.1 @@ -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 index 000000000..c28f287a4 --- /dev/null +++ b/usr.bin/getopt/getopt.c @@ -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 +#ifndef lint +__RCSID("$NetBSD: getopt.c,v 1.8 2006/07/09 21:39:48 wiz Exp $"); +#endif /* not lint */ + +#include +#include +#include + +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); +}