Loading...
stdlib/FreeBSD/getopt_long.3 Libc-763.13 Libc-1669.40.2
--- Libc/Libc-763.13/stdlib/FreeBSD/getopt_long.3
+++ Libc/Libc-1669.40.2/stdlib/FreeBSD/getopt_long.3
@@ -29,9 +29,9 @@
 .\" SUCH DAMAGE.
 .\"
 .\"     @(#)getopt.3	8.5 (Berkeley) 4/27/95
-.\" $FreeBSD: src/lib/libc/stdlib/getopt_long.3,v 1.13 2005/01/20 09:17:04 ru Exp $
+.\" $FreeBSD$
 .\"
-.Dd April 1, 2000
+.Dd December 24, 2022
 .Dt GETOPT_LONG 3
 .Os
 .Sh NAME
@@ -130,11 +130,11 @@
 .Pp
 .Bl -tag -width ".Dv optional_argument" -offset indent -compact
 .It Dv no_argument
-no argument to the option is expect
+no argument to the option is expected
 .It Dv required_argument
 an argument to the option is required
 .It Dv optional_argument
-an argument to the option may be presented.
+an argument to the option may be presented
 .El
 .Pp
 If
@@ -207,12 +207,53 @@
 .Fa val
 in the location pointed to by
 .Fa flag .
+.Pp
 These functions return
 .Ql \&:
-if there was a missing option argument,
+if there was a missing option argument and error messages are suppressed,
 .Ql \&?
 if the user specified an unknown or ambiguous option, and
 \-1 when the argument list has been exhausted.
+The default behavior when a missing option argument is encountered is to write
+an error and return
+.Ql \&? .
+Specifying
+.Ql \&:
+in
+.Fa optstr
+will cause the error message to be suppressed and
+.Ql \&:
+to be returned instead.
+.Pp
+In addition to
+.Ql \&: ,
+a leading
+.Ql \&+
+or
+.Ql \&-
+in
+.Fa optstr
+also has special meaning.
+If either of these are specified, they must appear before
+.Ql \&: .
+.Pp
+A leading
+.Ql \&+
+indicates that processing should be halted at the first non-option argument,
+matching the default behavior of
+.Xr getopt 3 .
+The default behavior without
+.Ql \&+
+is to permute non-option arguments to the end of
+.Fa argv .
+.Pp
+A leading
+.Ql \&-
+indicates that all non-option arguments should be treated as if they are
+arguments to a literal
+.Ql \&1
+flag (i.e., the function call will return the value 1, rather than the char
+literal '1').
 .Sh ENVIRONMENT
 .Bl -tag -width ".Ev POSIXLY_CORRECT"
 .It Ev POSIXLY_CORRECT
@@ -239,7 +280,7 @@
 };
 
 bflag = 0;
-while ((ch = getopt_long(argc, argv, "bf:", longopts, NULL)) != -1)
+while ((ch = getopt_long(argc, argv, "bf:", longopts, NULL)) != -1) {
 	switch (ch) {
 	case 'b':
 		bflag = 1;
@@ -256,6 +297,7 @@
 		break;
 	default:
 		usage();
+	}
 }
 argc -= optind;
 argv += optind;
@@ -469,9 +511,9 @@
 .Fn getopt_long
 and
 .Fn getopt_long_only
-functions first appeared in
+functions first appeared in the
 .Tn GNU
-libiberty.
+libiberty library.
 The first
 .Bx
 implementation of
@@ -504,3 +546,19 @@
 The implementation can completely replace
 .Xr getopt 3 ,
 but right now we are using separate code.
+.Pp
+.Nm
+makes the assumption that the first argument should always be skipped because
+it's typically the program name.
+As a result, setting
+.Va optind
+to 0 will indicate that
+.Nm
+should reset, and
+.Va optind
+will be set to 1 in the process.
+This behavior differs from
+.Xr getopt 3 ,
+which will handle an
+.Va optind
+value of 0 as expected and process the first element.