OSSP CVS Repository

ossp - Check-in [3296]
Not logged in
[Honeypot]  [Browse]  [Home]  [Login]  [Reports
[Search]  [Ticket]  [Timeline
  [Patchset]  [Tagging/Branching

Check-in Number: 3296
Date: 2003-Mar-07 11:35:16 (local)
2003-Mar-07 10:35:16 (UTC)
User:rse
Branch:
Comment: add an OSSP collection of GNU getopt sources
Tickets:
Inspections:
Files:
ossp-pkg/getopt/Makefile.in      added-> 1.1
ossp-pkg/getopt/README      added-> 1.1
ossp-pkg/getopt/VERSION      added-> 1.1
ossp-pkg/getopt/configure.ac      added-> 1.1
ossp-pkg/getopt/devtool      added-> 1.1
ossp-pkg/getopt/devtool.conf      added-> 1.1
ossp-pkg/getopt/devtool.func      added-> 1.1
ossp-pkg/getopt/getopt-config.in      added-> 1.1
ossp-pkg/getopt/getopt.1      added-> 1.1
ossp-pkg/getopt/getopt.3      added-> 1.1
ossp-pkg/getopt/getopt.c      added-> 1.1
ossp-pkg/getopt/getopt.h      added-> 1.1
ossp-pkg/getopt/getopt.texi      added-> 1.1
ossp-pkg/getopt/getopt1.c      added-> 1.1
ossp-pkg/getopt/getopt_main.c      added-> 1.1
ossp-pkg/getopt/getopt_test.c      added-> 1.1

ossp-pkg/getopt/Makefile.in -> 1.1

*** /dev/null    Mon Apr 29 14:45:17 2024
--- -    Mon Apr 29 14:50:02 2024
***************
*** 0 ****
--- 1,65 ----
+ ##
+ ##  Makefile for OSSP's GNU getopt source tree
+ ##  Copyright (c) 2003 Ralf S. Engelschall <rse@engelschall.com> 
+ ##
+ 
+ DESTDIR     =
+ prefix      = @prefix@
+ exec_prefix = @exec_prefix@
+ bindir      = @bindir@
+ libdir      = @libdir@
+ includedir  = @includedir@
+ mandir      = @mandir@
+ 
+ CC          = @CC@
+ CFLAGS      = @CFLAGS@
+ CPPFLAGS    = @DEFS@ -I. -I./lib
+ LDFLAGS     =
+ LIBS        =
+ AR          = @AR@
+ RANLIB      = @RANLIB@
+ RM          = rm -f
+ SHTOOL      = ./shtool
+ 
+ all: libgetopt.a getopt
+ 
+ libgetopt.a: getopt.o getopt1.o
+        $(RM) libgetopt.a
+        $(AR) cq libgetopt.a getopt.o getopt1.o
+        $(RANLIB) libgetopt.a
+ 
+ getopt1.o: getopt1.c
+        $(CC) $(CFLAGS) $(CPPFLAGS) -o getopt1.o -c getopt1.c
+ 
+ getopt.o: getopt.c
+        $(CC) $(CFLAGS) $(CPPFLAGS) -o getopt.o -c getopt.c
+ 
+ getopt: getopt_main.o libgetopt.a
+        $(CC) $(CFLAGS) $(LDFLAGS) -o getopt getopt_main.o libgetopt.a
+ 
+ getopt_main.o: getopt_main.c
+        $(CC) $(CFLAGS) $(CPPFLAGS) -o getopt_main.o -c getopt_main.c
+ 
+ install:
+        $(SHTOOL) mkdir -f -p -m 755 $(DESTDIR)$(bindir)
+        $(SHTOOL) install -c -s -m 755 getopt $(DESTDIR)$(bindir)/
+        $(SHTOOL) install -c -m 755 getopt-config $(DESTDIR)$(bindir)/
+        $(SHTOOL) mkdir -f -p -m 755 $(DESTDIR)$(libdir)
+        $(SHTOOL) install -c -m 644 libgetopt.a $(DESTDIR)$(libdir)/
+        $(SHTOOL) mkdir -f -p -m 755 $(DESTDIR)$(includedir)
+        $(SHTOOL) install -c -m 644 getopt.h $(DESTDIR)$(includedir)/
+        $(SHTOOL) mkdir -f -p -m 755 $(DESTDIR)$(mandir)/man1
+        $(SHTOOL) install -c -m 644 getopt.1 $(DESTDIR)$(mandir)/man1/
+        $(SHTOOL) mkdir -f -p -m 755 $(DESTDIR)$(mandir)/man3
+        $(SHTOOL) install -c -m 644 getopt.3 $(DESTDIR)$(mandir)/man3/
+ 
+ clean:
+        $(RM) getopt.o getopt1.o libgetopt.a
+        $(RM) getopt_main.o getopt
+ 
+ distclean: clean
+        $(RM) getopt-config config.h config.log config.status Makefile
+ 
+ realclean: distclean
+        $(RM) shtool configure config.h.in
+ 


ossp-pkg/getopt/README -> 1.1

*** /dev/null    Mon Apr 29 14:45:17 2024
--- -    Mon Apr 29 14:50:02 2024
***************
*** 0 ****
--- 1,33 ----
+ 
+   OSSP's GNU getopt
+ 
+   From gcc 3.2.2 (because more stand-alone than original glibc sources):
+   [ftp://gcc.gnu.org/pub/gcc/releases/]
+ 
+     include/getopt.h         -> getopt.h
+     libiberty/getopt.c       -> getopt.c
+     libiberty/getopt1.c      -> getopt1.c
+ 
+   From glibc 2.3.2:
+   [ftp://ftp.gnu.org/gnu/glibc/]
+ 
+     posix/tstgetopt.c        -> getopt_test.c
+     manual/getopt.texi       -> getopt.texi
+   
+   From man-pages 1.56:
+   [ftp://ftp.kernel.org/pub/linux/docs/manpages/]
+ 
+     man3/getopt.3            -> getopt.3
+ 
+   From util-linux 2.11 or getopt 1.1.3:
+   [http://www.kernel.org/pub/linux/utils/util-linux/]
+   [http://huizen.dds.nl/~frodol/getopt.html]
+ 
+     getopt.1                 -> getopt.1
+     getopt.c                 -> getopt_main.c
+ 
+   Plus replace in getop_main.c:
+     << #include "nls.h"
+     >> #define WITHOUT_GETTEXT 1
+     >> #define _(x) x
+ 


ossp-pkg/getopt/VERSION -> 1.1

*** /dev/null    Mon Apr 29 14:45:17 2024
--- -    Mon Apr 29 14:50:02 2024
***************
*** 0 ****
--- 1 ----
+ 20030307


ossp-pkg/getopt/configure.ac -> 1.1

*** /dev/null    Mon Apr 29 14:45:17 2024
--- -    Mon Apr 29 14:50:02 2024
***************
*** 0 ****
--- 1,20 ----
+ 
+ AC_PREREQ(2.57)
+ AC_INIT
+ AC_CONFIG_SRCDIR(Makefile.in)
+ GETOPT_VERSION=`cat VERSION`
+ AC_SUBST(GETOPT_VERSION)
+ 
+ AC_PROG_MAKE_SET
+ AC_PROG_CC
+ AC_PATH_PROG(AR, ar, ar)
+ AC_PROG_RANLIB
+ 
+ AC_CHECK_HEADERS(string.h strings.h)
+ 
+ AC_CONFIG_HEADERS(config.h)
+ AC_CONFIG_FILES([Makefile getopt-config])
+ AC_CONFIG_COMMANDS([adjustment], [chmod a+x getopt-config])
+ 
+ AC_OUTPUT
+ 


ossp-pkg/getopt/devtool -> 1.1

*** /dev/null    Mon Apr 29 14:45:17 2024
--- -    Mon Apr 29 14:50:02 2024
***************
*** 0 ****
--- 1,47 ----
+ #!/bin/sh
+ ##
+ ##  devtool -- Development Tool
+ ##  Copyright (c) 2001-2003 Ralf S. Engelschall <rse@engelschall.com> 
+ ##
+ 
+ if [ $# -eq 0 ]; then
+     echo "devtool:USAGE: devtool <command> [<arg> ...]" 1>&2
+     exit 1
+ fi
+ 
+ cmd="$1"
+ shift
+ 
+ devtoolfunc="./devtool.func"
+ 
+ if [ ! -f devtool.conf ]; then
+     echo "devtool:ERROR: no devtool.conf in current directory" 1>&2
+     exit 1
+ fi
+ 
+ cmdline=`grep "^%$cmd" devtool.conf`
+ if [ ".$cmdline" = . ]; then
+     echo "devtool:ERROR: command $cmd not found in devtool.conf" 1>&2
+     exit 1
+ fi
+ 
+ if [ ".$TMPDIR" != . ]; then
+     tmpdir="$TMPDIR"
+ elif [ ".$TEMPDIR" != . ]; then
+     tmpdir="$TEMPDIR"
+ else
+     tmpdir="/tmp"
+ fi
+ tmpfile="$tmpdir/rc.$$.tmp"
+ 
+ rm -f $tmpfile
+ touch $tmpfile
+ echo ". $devtoolfunc" >>$tmpfile
+ ( sed <devtool.conf -e "1,/^%common/d" -e '/^%.*/,$d'
+   sed <devtool.conf -e "1,/^%$cmd/d" -e '/^%.*/,$d' ) |\
+ sed -e 's;\([  ]\)@\([a-zA-Z_][a-zA-Z0-9_]*\);\1devtool_\2;' >>$tmpfile
+ 
+ sh $tmpfile "$@"
+ 
+ rm -f $tmpfile >/dev/null 2>&1 || true
+ 


ossp-pkg/getopt/devtool.conf -> 1.1

*** /dev/null    Mon Apr 29 14:45:17 2024
--- -    Mon Apr 29 14:50:02 2024
***************
*** 0 ****
--- 1,29 ----
+ ##
+ ##  devtool.conf -- Development Tool Configuration
+ ##
+ 
+ %autogen
+     @autogen shtool   1.6.2 "1.[56].*" all
+     @autogen autoconf 2.57  "2.5[3-9]*"
+ 
+ %autoclean
+     @autoclean shtool
+     @autoclean autoconf
+ 
+ %configure
+     ./configure --prefix=/tmp/getopt "$@"
+ 
+ %dist
+     rm -f getopt-*.tar.gz
+     ./devtool autoclean
+     ./devtool autogen
+     ./configure
+     make clean all
+     make distclean
+     ./shtool fixperm -v .
+     V=`cat VERSION`
+     ./shtool tarball -o getopt-${V}.tar.gz -d getopt-${V} -u gnu -g getopt \
+                      -e 'CVS,\.cvsignore,\.[ao]$,^\.,devtool*' -c 'gzip --best' .
+     ls -l getopt-${V}.tar.gz
+     gunzip <getopt-${V}.tar.gz | tar tvf -
+ 


ossp-pkg/getopt/devtool.func -> 1.1

*** /dev/null    Mon Apr 29 14:45:17 2024
--- -    Mon Apr 29 14:50:02 2024
***************
*** 0 ****
--- 1,73 ----
+ ##
+ ##  devtool.func -- Development Tool Functions
+ ##  Copyright (c) 2001-2003 Ralf S. Engelschall <rse@engelschall.com> 
+ ##
+ 
+ devtool_require () {
+     t="$1"; o="$2"; p="$3"; e="$4"; a="$5"
+     v=`($t $o | head -1 | awk "{ print \\\$$p; }") 2>/dev/null`
+     if [ ".$v" = . ]; then
+         echo "devtool:ERROR: unable to determine version of $t" 1>&2
+         exit 1
+     fi
+     case "$v" in
+         $e )
+             ;;
+         $a )
+             echo "devtool:WARNING: $t version $v still accepted, although expected $e." 1>&2
+             ;;
+         * )
+             echo "devtool:ERROR: $t version $e expected, but found $v." 1>&2
+             exit 1
+             ;;
+     esac
+     echo "$v"
+ }
+ 
+ devtool_autogen () {
+     tool=$1
+     shift
+     case $tool in
+         autoconf )
+             autoconf_version=`devtool_require autoconf --version 4 "$1" "$2"`
+             echo "generating (GNU Autoconf $autoconf_version): configure config.h.in"
+             autoconf
+             autoheader 2>&1 | grep -v "is unchanged"
+             rm -rf autom4te.cache >/dev/null 2>&1
+             ;;
+         libtool )
+             libtoolize_version=`devtool_require libtoolize --version 4 "$1" "$2"`
+             echo "generating (GNU Libtool $libtoolize_version): ltmain.sh, libtool.m4, config.guess, config.sub"
+             libtoolize --force --copy >/dev/null 2>&1
+             cp `libtoolize --force --copy --dry-run | grep "add the contents of" |\
+                 sed -e 's;^[^\`]*\`;;' -e "s;'.*;;"` libtool.m4
+             ;;
+         shtool )
+             shtoolize_version=`devtool_require shtoolize -v 3 "$1" "$2"`
+             echo "generating (GNU Shtool $shtoolize_version): shtool"
+             shift
+             shift
+             shtoolize -q "$@"
+             ;;
+     esac
+ }
+ 
+ devtool_autoclean () {
+     tool=$1
+     shift
+     case $tool in
+         autoconf )
+             echo "removing: configure config.h.in"
+             rm -f configure config.h.in
+             ;;
+         libtool )
+             echo "removing: ltmain.sh libtool.m4 config.guess config.sub"
+             rm -f ltmain.sh libtool.m4 config.guess config.sub
+             ;;
+         shtool )
+             echo "removing: shtool"
+             rm -f shtool
+             ;;
+     esac
+ }
+ 


ossp-pkg/getopt/getopt-config.in -> 1.1

*** /dev/null    Mon Apr 29 14:45:17 2024
--- -    Mon Apr 29 14:50:02 2024
***************
*** 0 ****
--- 1,122 ----
+ #!/bin/sh
+ ##
+ ##  getopt-config
+ ##
+ 
+ DIFS=' 
+ '
+ 
+ #   tool
+ tool_name="getopt-config"
+ 
+ #   library version
+ lib_name="GNU getopt"
+ lib_version="@GETOPT_VERSION@"
+ 
+ #   build paths
+ prefix="@prefix@"
+ exec_prefix="@exec_prefix@"
+ bindir="@bindir@"
+ libdir="@libdir@"
+ includedir="@includedir@"
+ mandir="@mandir@"
+ datadir="@datadir@"
+ 
+ #   build options
+ cflags="@CFLAGS@"
+ ldflags="@LDFLAGS@"
+ libs="@LIBS@"
+ 
+ #   option defaults
+ help=no
+ version=no
+ 
+ usage="$tool_name"
+ usage="$usage [--help] [--version] [--all]"
+ usage="$usage [--prefix] [--exec-prefix] [--bindir] [--libdir] [--includedir] [--mandir] [--datadir]"
+ usage="$usage [--cflags] [--ldflags] [--libs]"
+ if [ $# -eq 0 ]; then
+     echo "$tool_name:Error: Invalid option" 1>&2
+     echo "$tool_name:Usage: $usage" 1>&2
+     exit 1
+ fi
+ output=''
+ output_extra=''
+ all=no
+ prev=''
+ OIFS="$IFS" IFS="$DIFS"
+ for option
+ do
+     if [ ".$prev" != . ]; then
+         eval "$prev=\$option"
+         prev=''
+         continue
+     fi
+     case "$option" in
+         -*=*) optarg=`echo "$option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+            *) optarg='' ;;
+     esac
+     case "$option" in
+         --help|-h)
+             echo "Usage: $usage"
+             exit 0
+             ;;
+         --version|-v)
+             echo "$lib_name $lib_version"
+             exit 0
+             ;;
+         --all)
+             all=yes
+             ;;
+         --prefix)
+             output="$output $prefix"
+             ;;
+         --exec-prefix)
+             output="$output $exec_prefix"
+             ;;
+         --bindir)
+             output="$output $bindir"
+             ;;
+         --libdir)
+             output="$output $libdir"
+             ;;
+         --includedir)
+             output="$output $includedir"
+             ;;
+         --mandir)
+             output="$output $mandir"
+             ;;
+         --datadir)
+             output="$output $datadir"
+             ;;
+         --cflags)
+             output="$output -I$includedir"
+             output_extra="$output_extra $cflags"
+             ;;
+         --ldflags)
+             output="$output -L$libdir"
+             output_extra="$output_extra $ldflags"
+             ;;
+         --libs)
+             output="$output -lgetopt"
+             output_extra="$output_extra $libs"
+             ;;
+         * )
+             echo "$tool_name:Error: Invalid option" 1>&2
+             echo "$tool_name:Usage: $usage" 1>&2
+             exit 1;
+             ;;
+     esac
+ done
+ IFS="$OIFS"
+ if [ ".$prev" != . ]; then
+     echo "$tool_name:Error: missing argument to --`echo $prev | sed 's/_/-/g'`" 1>&2
+     exit 1
+ fi
+ if [ ".$output" != . ]; then
+     if [ ".$all" = .yes ]; then
+         output="$output $output_extra"
+     fi
+     echo $output
+ fi
+ 


ossp-pkg/getopt/getopt.1 -> 1.1

*** /dev/null    Mon Apr 29 14:45:17 2024
--- -    Mon Apr 29 14:50:02 2024
***************
*** 0 ****
--- 1,441 ----
+ .TH GETOPT 1 "May 31, 1997" Linux ""
+ .SH NAME
+ getopt \- parse command options (enhanced)
+ .SH SYNOPSIS
+ .BR getopt " optstring parameters"
+ 
+ .BR getopt " [options] [" \-\- "] optstring parameters"
+ 
+ .BR getopt " [options] " \-o | \-\-options " optstring [options] [" \-\- "] parameters"
+ .SH DESCRIPTION
+ .B getopt
+ is used to break up 
+ .RI ( parse )
+ options in command lines for easy parsing by
+ shell procedures, and to check for legal options.
+ It uses the 
+ .SM GNU
+ .BR getopt (3) 
+ routines to do this.
+ 
+ The parameters 
+ .B getopt
+ is called with can be divided into two parts: options
+ which modify the way getopt will parse
+ .RI ( options
+ and
+ .I \-o|\-\-options optstring
+ in the 
+ .BR SYNOPSIS), 
+ and the parameters which are to be
+ parsed
+ .RI ( parameters
+ in the 
+ .BR SYNOPSIS).
+ The second part will start at the first non\-option parameter
+ that is not an option argument, or after the first occurence of 
+ .RB ` \-\- '.
+ If no 
+ .RB ` \-o ' 
+ or 
+ .RB ` \-\-options ' 
+ option is found in the first part, the first
+ parameter of the second part is used as the short options string.
+ 
+ If the environment variable
+ .B GETOPT_COMPATIBLE
+ is set, or if its first parameter 
+ is not an option (does not start with a
+ .RB ` \- ',
+ this is the first format in the 
+ .BR SYNOPSIS),
+ .B getopt
+ will generate output that is compatible with that of other versions of 
+ .BR getopt (1). 
+ It will still do parameter shuffling and recognize optional
+ arguments (see section
+ .B COMPATIBILITY
+ for more information). 
+ 
+ Traditional implementations of
+ .BR getopt (1)
+ are unable to cope with whitespace and other (shell\-specific) special characters
+ in arguments and non\-option parameters. To solve this problem, this 
+ implementation can generate
+ quoted output which must once again be interpreted by the shell (usually
+ by using the
+ .B eval
+ command). This has the effect of preserving those characters, but
+ you must call 
+ .B getopt
+ in a way that is no longer compatible with other versions (the second 
+ or third format in the 
+ .BR SYNOPSIS). 
+ To determine whether this enhanced version of
+ .BR getopt (1)
+ is installed, a special test option
+ .RB ( \-T ) 
+ can be used.
+ .SH OPTIONS
+ .IP "\-a, \-\-alternative"
+ Allow long options to start with a single 
+ .RB ` \- '.
+ .IP "\-h, \-\-help"
+ Output a small usage guide and exit succesfully. No other output is generated. 
+ .IP "\-l, \-\-longoptions longopts"
+ The long (multi\-character) options to be recognized. 
+ More than one option name
+ may be specified at once, by separating the names with commas. This option 
+ may be given more than once, the 
+ .I longopts 
+ are cumulative.
+ Each long option name
+ in 
+ .I longopts 
+ may be followed by one colon to indicate it has a required argument,and by two colons to indicate it has an optional argument.
+ .IP "\-n, \-\-name progname"
+ The name that will be used by the 
+ .BR getopt (3)
+ routines when it reports errors. Note that errors of
+ .BR getopt (1)
+ are still reported as coming from getopt.
+ .IP "\-o, \-\-options shortopts"
+ The short (one\-character) options to be recognized. If this option is not
+ found, the first parameter of 
+ .B getopt 
+ that does not start with
+ a 
+ .RB ` \- ' 
+ (and is not an option argument) is used as the short options string.
+ Each short option character
+ in 
+ .I shortopts 
+ may be followed by one colon to indicate it has a required argument,
+ and by two colons to indicate it has an optional argument.
+ The first character of shortopts may be 
+ .RB ` + ' 
+ or
+ .RB ` \- ' 
+ to influence the way
+ options are parsed and output is generated (see section 
+ .B SCANNING MODES
+ for details).
+ .IP "\-q, \-\-quiet"
+ Disable error reporting by getopt(3).
+ .IP "\-Q, \-\-quiet\-output"
+ Do not generate normal output. Errors are still reported by
+ .BR getopt (3), 
+ unless you also use 
+ .IR \-q .
+ .IP "\-s, \-\-shell shell"
+ Set quoting conventions to those of shell. If no \-s argument is found,
+ the
+ .SM BASH
+ conventions are used. Valid arguments are currently
+ .RB ` sh '
+ .RB ` bash ',
+ .RB ` csh ',
+ and
+ .RB ` tcsh '.
+ .IP "\-u, \-\-unquoted"
+ Do not quote the output. Note that whitespace and special (shell\-dependent)
+ characters can cause havoc in this mode (like they do with other
+ .BR getopt (1)
+ implementations).
+ .IP "\-T \-\-test"
+ Test if your 
+ .BR getopt (1) 
+ is this enhanced version or an old version. This generates no output, 
+ and sets the error status to 4. Other implementations of 
+ .BR getopt (1),
+ and this version if the environment variable
+ .B GETOPT_COMPATIBLE
+ is set,
+ will return 
+ .RB ` \-\- ' 
+ and error status 0.
+ .IP "\-V, \-\-version"
+ Output version information and exit succesfully. No other output is generated. 
+ .SH PARSING
+ This section specifies the format of the second part of the parameters of
+ .B getopt
+ (the 
+ .I parameters 
+ in the 
+ .BR SYNOPSIS ). 
+ The next section 
+ .RB ( OUTPUT ) 
+ describes the output that is 
+ generated. These parameters were typically the parameters a shell function
+ was called with. 
+ Care must be taken that each parameter the shell function was
+ called with corresponds to exactly one parameter in the parameter list of
+ .B getopt 
+ (see the 
+ .BR EXAMPLES ). 
+ All parsing is done by the GNU 
+ .BR getopt (3) 
+ routines. 
+ 
+ The parameters are parsed from left to right. Each parameter is classified as a
+ short option, a long option, an argument to an option,
+ or a non\-option parameter.
+ 
+ A simple short option is a 
+ .RB ` \- ' 
+ followed by a short option character. If
+ the option has a required argument, it may be written directly after the option
+ character or as the next parameter (ie. separated by whitespace on the 
+ command line). If the
+ option has an optional argument, it must be written directly after the
+ option character if present.
+ 
+ It is possible to specify several short options after one 
+ .RB ` \- ', 
+ as long as all (except possibly the last) do not have required or optional
+ arguments.
+ 
+ A long option normally begins with 
+ .RB ` \-\- ' 
+ followed by the long option name.
+ If the option has a required argument, it may be written directly after
+ the long option name, separated by 
+ .RB ` = ', 
+ or as the next argument (ie. separated by whitespace on the command line). 
+ If the option has an optional argument, it must
+ be written directly after the long option name, separated by 
+ .RB ` = ', 
+ if present (if you add the 
+ .RB ` = ' 
+ but nothing behind it, it is interpreted
+ as if no argument was present; this is a slight bug, see the 
+ .BR BUGS ).
+ Long options may be abbreviated, as long as the abbreviation is not
+ ambiguous.
+ 
+ Each parameter not starting with a 
+ .RB ` \- ', 
+ and not a required argument of
+ a previous option, is a non\-option parameter. Each parameter after
+ a 
+ .RB ` \-\- ' 
+ parameter is always interpreted as a non\-option parameter.
+ If the environment variable 
+ .B POSIXLY_CORRECT 
+ is set, or if the short
+ option string started with a 
+ .RB ` + ', 
+ all remaining parameters are interpreted
+ as non\-option parameters as soon as the first non\-option parameter is
+ found.
+ .SH OUTPUT
+ Output is generated for each element described in the previous section. 
+ Output is done
+ in the same order as the elements are specified in the input, except
+ for non\-option parameters. Output can be done in 
+ .I compatible 
+ .RI ( unquoted )
+ mode, or in such way that whitespace and other special characters within
+ arguments and non\-option parameters are preserved (see 
+ .BR QUOTING ).
+ When the output is processed in the shell script, it will seem to be
+ composed of distinct elements that can be processed one by one (by using the
+ shift command in most shell languages). This is imperfect in unquoted mode,
+ as elements can be split at unexpected places if they contain whitespace
+ or special characters.
+ 
+ If there are problems parsing the parameters, for example because a
+ required argument is not found or an option is not recognized, an error
+ will be reported on stderr, there will be no output for the offending
+ element, and a non\-zero error status is returned.
+ 
+ For a short option, a single 
+ .RB ` \- ' 
+ and the option character are generated
+ as one parameter. If the option has an argument, the next
+ parameter will be the argument. If the option takes an optional argument,
+ but none was found, the next parameter will be generated but be empty in
+ quoting mode,
+ but no second parameter will be generated in unquoted (compatible) mode.
+ Note that many other 
+ .BR getopt (1) 
+ implemetations do not support optional arguments.
+ 
+ If several short options were specified after a single 
+ .RB ` \- ', 
+ each will be present in the output as a separate parameter.
+ 
+ For a long option, 
+ .RB ` \-\- ' 
+ and the full option name are generated as one
+ parameter. This is done regardless whether the option was abbreviated or
+ specified with a single 
+ .RB ` \- ' 
+ in the input. Arguments are handled as with short options.
+ 
+ Normally, no non\-option parameters output is generated until all options
+ and their arguments have been generated. Then 
+ .RB ` \-\- ' 
+ is generated as a
+ single parameter, and after it the non\-option parameters in the order
+ they were found, each as a separate parameter.
+ Only if the first character of the short options string was a 
+ .RB ` \- ',
+ non\-option parameter output is generated at the place they are found in the 
+ input (this is not supported if the first format of the 
+ .B SYNOPSIS
+ is used; in that case all preceding occurences of
+ .RB ` \- '
+ and 
+ .RB ` + '
+ are ignored). 
+ .SH QUOTING
+ In compatible mode, whitespace or 'special' characters in arguments or
+ non\-option parameters are not handled correctly. As the output is 
+ fed to the shell script, the script does not know how it is supposed to break 
+ the output into separate parameters.  To circumvent this
+ problem, this implementation offers quoting. The idea is that output
+ is generated with quotes around each parameter. When this output is once
+ again fed to the shell (usually by a shell 
+ .B eval 
+ command), it is split correctly into separate parameters.
+ 
+ Quoting is not enabled if the environment variable
+ .B GETOPT_COMPATIBLE
+ is set, if the first form of the
+ .B SYNOPSIS
+ is used, or if the option
+ .RB ` \-u '
+ is found.
+ 
+ Different shells use different quoting conventions. You can use the 
+ .RB ` \-s '
+ option to select the shell you are using. The following shells are
+ currently supported:
+ .RB ` sh ',
+ .RB ` bash ',
+ .RB ` csh ' 
+ and
+ .RB ` tcsh '.
+ Actually, only two `flavors' are distinguished: sh\-like quoting conventions 
+ and csh\-like quoting conventions. Chances are that if you use another shell
+ script language, one of these flavors can still be used.
+ 
+ .SH "SCANNING MODES"
+ The first character of the short options string may be a
+ .RB ` \- '
+ or a
+ .RB ` + '
+ to indicate a special scanning mode. If the first calling form
+ in the
+ .B SYNOPSIS 
+ is used they are ignored; the environment variable
+ .B POSIXLY_CORRECT
+ is still examined, though.
+ 
+ If the first character is 
+ .RB ` + ',
+ or if the environment variable 
+ .B POSIXLY_CORRECT
+ is set, parsing stops as soon as the first non\-option parameter 
+ (ie. a parameter that does not start with a 
+ .RB ` \- ')
+ is found that
+ is not an option argument. The remaining parameters are all interpreted as
+ non\-option parameters.
+ 
+ If the first character is a
+ .RB ` \- ',
+ non\-option parameters are outputed at the place where they are found; in normal
+ operation, they are all collected at the end of output after a 
+ .RB ` \-\- ' 
+ parameter has been generated. Note that this
+ .RB ` \-\- '
+ parameter is still generated, but it will always be the last parameter in
+ this mode.
+ .SH COMPATIBILITY
+ This version of 
+ .BR getopt (1)
+ is written to be as compatible as possible to 
+ other versions. Usually you can just replace them with this version
+ without any modifications, and with some advantages.
+ 
+ If the first character of the first parameter of getopt is not a 
+ .RB ` \- ', 
+ getopt goes into compatibility mode. It will interpret its first parameter as
+ the string of short options, and all other arguments will be parsed. It
+ will still do parameter shuffling (ie. all non\-option parameters are outputed
+ at the end), unless the environment variable 
+ .B POSIXLY_CORRECT 
+ is set.
+ 
+ The environment variable 
+ .B GETOPT_COMPATIBLE 
+ forces 
+ .B getopt
+ into compatibility mode. Setting both this environment variable and
+ .B POSIXLY_CORRECT
+ offers 100% compatibility for `difficult' programs. Usually, though,
+ neither is needed.
+ 
+ In compatibility mode, leading 
+ .RB ` \- '
+ and 
+ .RB ` + '
+ characters in the short options string are ignored.
+ .SH RETURN CODES
+ .B getopt
+ returns error code 
+ .B 0 
+ for succesful parsing, 
+ .B 1
+ if
+ .BR getopt (3)
+ returns errors,
+ .B 2 
+ if it does not understand its own parameters,
+ .B 3
+ if an internal error occurs like out\-of\-memory, and
+ .B 4
+ if it is called with 
+ .BR \-T .
+ .SH EXAMPLES
+ Example scripts for (ba)sh and (t)csh are provided with the
+ .BR getopt (1)
+ distribution, and are optionally installed in 
+ .B /usr/local/lib/getopt 
+ or 
+ .BR /usr/lib/getopt .
+ .SH ENVIRONMENT
+ .IP POSIXLY_CORRECT
+ This environment variable is examined by the
+ .BR getopt (3)
+ routines.
+ If it is set, parsing stops as soon as a parameter
+ is found that is not an option or an option argument. All remaining 
+ parameters are also interpreted as non\-option parameters, regardless
+ whether they start with a 
+ .RB ` \- '.
+ .IP GETOPT_COMPATIBLE
+ Forces
+ .B getopt
+ to use the first calling format as specified in the
+ .BR SYNOPSIS .
+ .SH BUGS
+ .BR getopt (3)
+ can parse long options with optional arguments that are given an empty optional
+ argument (but can not do this for short options). This 
+ .BR getopt (1)
+ treats optional arguments that are empty as if they were not present.
+ 
+ The syntax if you do not want any short option variables at all is
+ not very intuitive (you have to set them explicitely to the empty
+ string).
+ 
+ .SH AUTHOR
+ Frodo Looijaard <frodol@dds.nl>
+ .SH "SEE ALSO"
+ .BR getopt (3),
+ .BR bash (1),
+ .BR tcsh (1).
+ 


ossp-pkg/getopt/getopt.3 -> 1.1

*** /dev/null    Mon Apr 29 14:45:17 2024
--- -    Mon Apr 29 14:50:02 2024
***************
*** 0 ****
--- 1,327 ----
+ .\" (c) 1993 by Thomas Koenig (ig25@rz.uni-karlsruhe.de)
+ .\"
+ .\" Permission is granted to make and distribute verbatim copies of this
+ .\" manual provided the copyright notice and this permission notice are
+ .\" preserved on all copies.
+ .\"
+ .\" Permission is granted to copy and distribute modified versions of this
+ .\" manual under the conditions for verbatim copying, provided that the
+ .\" entire resulting derived work is distributed under the terms of a
+ .\" permission notice identical to this one
+ .\" 
+ .\" Since the Linux kernel and libraries are constantly changing, this
+ .\" manual page may be incorrect or out-of-date.  The author(s) assume no
+ .\" responsibility for errors or omissions, or for damages resulting from
+ .\" the use of the information contained herein.  The author(s) may not
+ .\" have taken the same level of care in the production of this manual,
+ .\" which is licensed free of charge, as they might when working
+ .\" professionally.
+ .\" 
+ .\" Formatted or processed versions of this manual, if unaccompanied by
+ .\" the source, must acknowledge the copyright and authors of this work.
+ .\" License.
+ .\" Modified Sat Jul 24 19:27:50 1993 by Rik Faith (faith@cs.unc.edu)
+ .\" Modified Mon Aug 30 22:02:34 1995 by Jim Van Zandt <jrv@vanzandt.mv.com>
+ .\"  longindex is a pointer, has_arg can take 3 values, using consistent
+ .\"  names for optstring and longindex, "\n" in formats fixed.  Documenting
+ .\"  opterr and getopt_long_only.  Clarified explanations (borrowing heavily
+ .\"  from the source code).
+ .\" Modified 8 May 1998 by Joseph S. Myers (jsm28@cam.ac.uk)
+ .\" Modified 990715, aeb: changed `EOF' into `-1' since that is what POSIX
+ .\"  says; moreover, EOF is not defined in <unistd.h>.
+ .\" Modified 2002-02-16, joey: added information about non-existing
+ .\"  option character and colon as first option character
+ .\"
+ .TH GETOPT 3  2002-02-16 "GNU" "Linux Programmer's Manual"
+ .SH NAME
+ getopt \- Parse command line options
+ .SH SYNOPSIS
+ .nf
+ .B #include <unistd.h>
+ .sp
+ .BI "int getopt(int " argc ", char * const " argv[] ,
+ .BI "           const char *" optstring );
+ .sp
+ .BI "extern char *" optarg ;
+ .BI "extern int " optind ", " opterr ", " optopt ;
+ .sp
+ .B #define _GNU_SOURCE
+ .br
+ .B #include <getopt.h>
+ .sp
+ .BI "int getopt_long(int " argc ", char * const " argv[] ,
+ .BI "           const char *" optstring ,
+ .BI "           const struct option *" longopts ", int *" longindex );
+ .sp
+ .BI "int getopt_long_only(int " argc ", char * const " argv[] ,
+ .BI "           const char *" optstring ,
+ .BI "           const struct option *" longopts ", int *" longindex );
+ .fi
+ .SH DESCRIPTION
+ The
+ .B getopt()
+ function parses the command line arguments.  Its arguments
+ .I argc
+ and
+ .I argv
+ are the argument count and array as passed to the
+ .B main()
+ function on program invocation.
+ An element of \fIargv\fP that starts with `-' (and is not exactly "-" or "--")
+ is an option element.  The characters of this element
+ (aside from the initial `-') are option characters.  If \fBgetopt()\fP
+ is called repeatedly, it returns successively each of the option characters
+ from each of the option elements.
+ .PP
+ If \fBgetopt()\fP finds another option character, it returns that
+ character, updating the external variable \fIoptind\fP and a static
+ variable \fInextchar\fP so that the next call to \fBgetopt()\fP can
+ resume the scan with the following option character or
+ \fIargv\fP-element.
+ .PP
+ If there are no more option characters, \fBgetopt()\fP returns \-1.
+ Then \fIoptind\fP is the index in \fIargv\fP of the first
+ \fIargv\fP-element that is not an option.
+ .PP
+ .I optstring
+ is a string containing the legitimate option characters.  If such a
+ character is followed by a colon, the option requires an argument, so
+ \fBgetopt\fP places a pointer to the following text in the same
+ \fIargv\fP-element, or the text of the following \fIargv\fP-element, in
+ .IR optarg .
+ Two colons mean an option takes
+ an optional arg; if there is text in the current \fIargv\fP-element,
+ it is returned in \fIoptarg\fP, otherwise \fIoptarg\fP is set to zero.
+ This is a GNU extension.  If
+ .I optstring
+ contains
+ .B W
+ followed by a semicolon, then
+ .B -W foo
+ is treated as the long option
+ .BR --foo .
+ (The
+ .B -W
+ option is reserved by POSIX.2 for implementation extensions.)
+ This behaviour is a GNU extension, not available with libraries before
+ GNU libc 2.
+ .PP
+ By default, \fBgetopt()\fP permutes the contents of \fIargv\fP as it
+ scans, so that eventually all the non-options are at the end.  Two
+ other modes are also implemented.  If the first character of
+ \fIoptstring\fP is `+' or the environment variable POSIXLY_CORRECT is
+ set, then option processing stops as soon as a non-option argument is
+ encountered.  If the first character of \fIoptstring\fP is `-', then
+ each non-option \fIargv\fP-element is handled as if it were the argument of
+ an option with character code 1.  (This is used by programs that were
+ written to expect options and other \fIargv\fP-elements in any order
+ and that care about the ordering of the two.)
+ The special argument `--' forces an end of option-scanning regardless
+ of the scanning mode.
+ .PP
+ If \fBgetopt()\fP does not recognize an option character, it prints an
+ error message to stderr, stores the character in \fIoptopt\fP, and
+ returns `?'.  The calling program may prevent the error message by
+ setting \fIopterr\fP to 0.
+ .PP
+ If \fBgetopt()\fP finds an option character in \fIargv\fP that was not
+ included in \fIoptstring\fP, or if it detects a missing option argument,
+ it returns `?'  and sets the external variable \fIoptopt\fP to the
+ actual option character.  If the first character of \fIoptstring\fP
+ is a colon (`:'), then \fBgetopt()\fP returns `:' instead of `?' to
+ indicate a missing option argument.  If an error was detected, and
+ the first character of \fIoptstring\fP is not a colon, and
+ the external variable \fIopterr\fP is nonzero (which is the default),
+ \fBgetopt()\fP prints an error message.
+ .PP
+ The
+ .B getopt_long()
+ function works like
+ .B getopt()
+ except that it also accepts long options, started out by two dashes.
+ Long option names may be abbreviated if the abbreviation is
+ unique or is an exact match for some defined option.  A long option 
+ may take a parameter, of the form
+ .B --arg=param
+ or
+ .BR "--arg param" .
+ .PP
+ .I longopts
+ is a pointer to the first element of an array of
+ .B struct option
+ declared in
+ .B <getopt.h>
+ as
+ .nf
+ .sp
+ .in 10
+ struct option {
+ .in 14
+ const char *name;
+ int has_arg;
+ int *flag;
+ int val;
+ .in 10
+ };
+ .fi
+ .PP
+ The meanings of the different fields are:
+ .TP
+ .I name
+ is the name of the long option.
+ .TP
+ .I has_arg
+ is:
+ \fBno_argument\fP (or 0) if the option does not take an argument,
+ \fBrequired_argument\fP (or 1) if the option requires an argument, or
+ \fBoptional_argument\fP (or 2) if the option takes an optional argument.
+ .TP
+ .I flag
+ specifies how results are returned for a long option.  If \fIflag\fP
+ is \fBNULL\fP, then \fBgetopt_long()\fP returns \fIval\fP.  (For
+ example, the calling program may set \fIval\fP to the equivalent short
+ option character.)  Otherwise, \fBgetopt_long()\fP returns 0, and
+ \fIflag\fP points to a variable which is set to \fIval\fP if the
+ option is found, but left unchanged if the option is not found.
+ .TP
+ \fIval\fP 
+ is the value to return, or to load into the variable pointed
+ to by \fIflag\fP.
+ .PP
+ The last element of the array has to be filled with zeroes.
+ .PP
+ If \fIlongindex\fP is not \fBNULL\fP, it
+ points to a variable which is set to the index of the long option relative to
+ .IR longopts .
+ .PP
+ \fBgetopt_long_only()\fP is like \fBgetopt_long()\fP, but `-' as well 
+ as `--' can indicate a long option.  If an option that starts with `-'
+ (not `--') doesn't match a long option, but does match a short option,
+ it is parsed as a short option instead.  
+ .SH "RETURN VALUE"
+ The
+ .B getopt()
+ function returns the option character if the option was found
+ successfully, `:' if there was a missing parameter for one of the
+ options, `?' for an unknown option character, or \-1
+ for the end of the option list.
+ .PP
+ \fBgetopt_long()\fP and \fBgetopt_long_only()\fP also return the option
+ character when a short option is recognized.  For a long option, they
+ return \fIval\fP if \fIflag\fP is \fBNULL\fP, and 0 otherwise.  Error
+ and \-1 returns are the same as for \fBgetopt()\fP, plus `?' for an
+ ambiguous match or an extraneous parameter.
+ .SH "ENVIRONMENT VARIABLES"
+ .TP
+ .SM
+ .B POSIXLY_CORRECT
+ If this is set, then option processing stops as soon as a non-option 
+ argument is encountered.
+ .TP
+ .SM
+ .B _<PID>_GNU_nonoption_argv_flags_
+ This variable was used by
+ .B bash
+ 2.0 to communicate to GNU libc which arguments are the results of
+ wildcard expansion and so should not be considered as options.  This
+ behaviour was removed in
+ .B bash
+ version 2.01, but the support remains in GNU libc.
+ .SH EXAMPLE
+ The following example program illustrates the use of
+ .BR getopt_long()
+ with most of its features.
+ .nf
+ .sp
+ #include <stdio.h>     /* for printf */
+ #include <stdlib.h>    /* for exit */
+ #include <getopt.h>
+ 
+ int
+ main (int argc, char **argv) {
+     int c;
+     int digit_optind = 0;
+ 
+     while (1) {
+         int this_option_optind = optind ? optind : 1;
+         int option_index = 0;
+         static struct option long_options[] = {
+             {"add", 1, 0, 0},
+             {"append", 0, 0, 0},
+             {"delete", 1, 0, 0},
+             {"verbose", 0, 0, 0},
+             {"create", 1, 0, 'c'},
+             {"file", 1, 0, 0},
+             {0, 0, 0, 0}
+         };
+ 
+         c = getopt_long (argc, argv, "abc:d:012",
+                  long_options, &option_index);
+         if (c == -1)
+             break;
+ 
+         switch (c) {
+         case 0:
+             printf ("option %s", long_options[option_index].name);
+             if (optarg)
+                 printf (" with arg %s", optarg);
+             printf ("\\n");
+             break;
+ 
+         case '0':
+         case '1':
+         case '2':
+             if (digit_optind != 0 && digit_optind != this_option_optind)
+               printf ("digits occur in two different argv-elements.\\n");
+             digit_optind = this_option_optind;
+             printf ("option %c\\n", c);
+             break;
+ 
+         case 'a':
+             printf ("option a\\n");
+             break;
+ 
+         case 'b':
+             printf ("option b\\n");
+             break;
+ 
+         case 'c':
+             printf ("option c with value `%s'\\n", optarg);
+             break;
+ 
+         case 'd':
+             printf ("option d with value `%s'\\n", optarg);
+             break;
+ 
+         case '?':
+             break;
+ 
+         default:
+             printf ("?? getopt returned character code 0%o ??\\n", c);
+         }
+     }
+ 
+     if (optind < argc) {
+         printf ("non-option ARGV-elements: ");
+         while (optind < argc)
+             printf ("%s ", argv[optind++]);
+         printf ("\\n");
+     }
+ 
+     exit (0);
+ }
+ .fi
+ .SH BUGS
+ The POSIX.2 specification of
+ .B getopt()
+ has a technical error described in POSIX.2 Interpretation 150.  The GNU
+ implementation (and probably all other implementations) implements the
+ correct behaviour rather than that specified.
+ .SH "CONFORMING TO"
+ .TP
+ \fBgetopt()\fP:
+ POSIX.2, provided the environment variable POSIXLY_CORRECT is set.
+ Otherwise, the elements of \fIargv\fP aren't really const, because we
+ permute them.  We pretend they're const in the prototype to be
+ compatible with other systems.
+ 


ossp-pkg/getopt/getopt.c -> 1.1

*** /dev/null    Mon Apr 29 14:45:17 2024
--- -    Mon Apr 29 14:50:02 2024
***************
*** 0 ****
--- 1,1056 ----
+ /* Getopt for GNU.
+    NOTE: getopt is now part of the C library, so if you don't know what
+    "Keep this file name-space clean" means, talk to drepper@gnu.org
+    before changing it!
+ 
+    Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98
+        Free Software Foundation, Inc.
+ 
+    NOTE: This source is derived from an old version taken from the GNU C
+    Library (glibc).
+ 
+    This program is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the
+    Free Software Foundation; either version 2, or (at your option) any
+    later version.
+ 
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+ 
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+    USA.  */
+ 
+ /* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>.
+    Ditto for AIX 3.2 and <stdlib.h>.  */
+ #ifndef _NO_PROTO
+ # define _NO_PROTO
+ #endif
+ 
+ #ifdef HAVE_CONFIG_H
+ # include <config.h>
+ #endif
+ 
+ #if !defined __STDC__ || !__STDC__
+ /* This is a separate conditional since some stdc systems
+    reject `defined (const)'.  */
+ # ifndef const
+ #  define const
+ # endif
+ #endif
+ 
+ #include <stdio.h>
+ 
+ /* Comment out all this code if we are using the GNU C Library, and are not
+    actually compiling the library itself.  This code is part of the GNU C
+    Library, but also included in many other GNU distributions.  Compiling
+    and linking in this code is a waste when using the GNU C library
+    (especially if it is a shared library).  Rather than having every GNU
+    program understand `configure --with-gnu-libc' and omit the object files,
+    it is simpler to just do this in the source for each such file.  */
+ 
+ #define GETOPT_INTERFACE_VERSION 2
+ #if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2
+ # include <gnu-versions.h>
+ # if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION
+ #  define ELIDE_CODE
+ # endif
+ #endif
+ 
+ #ifndef ELIDE_CODE
+ 
+ 
+ /* This needs to come after some library #include
+    to get __GNU_LIBRARY__ defined.  */
+ #ifdef __GNU_LIBRARY__
+ /* Don't include stdlib.h for non-GNU C libraries because some of them
+    contain conflicting prototypes for getopt.  */
+ # include <stdlib.h>
+ # include <unistd.h>
+ #endif /* GNU C library.  */
+ 
+ #ifdef VMS
+ # include <unixlib.h>
+ # if HAVE_STRING_H - 0
+ #  include <string.h>
+ # endif
+ #endif
+ 
+ #ifndef _
+ /* This is for other GNU distributions with internationalized messages.
+    When compiling libc, the _ macro is predefined.  */
+ # if (HAVE_LIBINTL_H && ENABLE_NLS) || defined _LIBC
+ #  include <libintl.h>
+ #  define _(msgid)     gettext (msgid)
+ # else
+ #  define _(msgid)     (msgid)
+ # endif
+ #endif
+ 
+ /* This version of `getopt' appears to the caller like standard Unix `getopt'
+    but it behaves differently for the user, since it allows the user
+    to intersperse the options with the other arguments.
+ 
+    As `getopt' works, it permutes the elements of ARGV so that,
+    when it is done, all the options precede everything else.  Thus
+    all application programs are extended to handle flexible argument order.
+ 
+    Setting the environment variable POSIXLY_CORRECT disables permutation.
+    Then the behavior is completely standard.
+ 
+    GNU application programs can use a third alternative mode in which
+    they can distinguish the relative order of options and other arguments.  */
+ 
+ #include "getopt.h"
+ 
+ /* For communication from `getopt' to the caller.
+    When `getopt' finds an option that takes an argument,
+    the argument value is returned here.
+    Also, when `ordering' is RETURN_IN_ORDER,
+    each non-option ARGV-element is returned here.  */
+ 
+ char *optarg = NULL;
+ 
+ /* Index in ARGV of the next element to be scanned.
+    This is used for communication to and from the caller
+    and for communication between successive calls to `getopt'.
+ 
+    On entry to `getopt', zero means this is the first call; initialize.
+ 
+    When `getopt' returns -1, this is the index of the first of the
+    non-option elements that the caller should itself scan.
+ 
+    Otherwise, `optind' communicates from one call to the next
+    how much of ARGV has been scanned so far.  */
+ 
+ /* 1003.2 says this must be 1 before any call.  */
+ int optind = 1;
+ 
+ /* Formerly, initialization of getopt depended on optind==0, which
+    causes problems with re-calling getopt as programs generally don't
+    know that. */
+ 
+ int __getopt_initialized = 0;
+ 
+ /* The next char to be scanned in the option-element
+    in which the last option character we returned was found.
+    This allows us to pick up the scan where we left off.
+ 
+    If this is zero, or a null string, it means resume the scan
+    by advancing to the next ARGV-element.  */
+ 
+ static char *nextchar;
+ 
+ /* Callers store zero here to inhibit the error message
+    for unrecognized options.  */
+ 
+ int opterr = 1;
+ 
+ /* Set to an option character which was unrecognized.
+    This must be initialized on some systems to avoid linking in the
+    system's own getopt implementation.  */
+ 
+ int optopt = '?';
+ 
+ /* Describe how to deal with options that follow non-option ARGV-elements.
+ 
+    If the caller did not specify anything,
+    the default is REQUIRE_ORDER if the environment variable
+    POSIXLY_CORRECT is defined, PERMUTE otherwise.
+ 
+    REQUIRE_ORDER means don't recognize them as options;
+    stop option processing when the first non-option is seen.
+    This is what Unix does.
+    This mode of operation is selected by either setting the environment
+    variable POSIXLY_CORRECT, or using `+' as the first character
+    of the list of option characters.
+ 
+    PERMUTE is the default.  We permute the contents of ARGV as we scan,
+    so that eventually all the non-options are at the end.  This allows options
+    to be given in any order, even with programs that were not written to
+    expect this.
+ 
+    RETURN_IN_ORDER is an option available to programs that were written
+    to expect options and other ARGV-elements in any order and that care about
+    the ordering of the two.  We describe each non-option ARGV-element
+    as if it were the argument of an option with character code 1.
+    Using `-' as the first character of the list of option characters
+    selects this mode of operation.
+ 
+    The special argument `--' forces an end of option-scanning regardless
+    of the value of `ordering'.  In the case of RETURN_IN_ORDER, only
+    `--' can cause `getopt' to return -1 with `optind' != ARGC.  */
+ 
+ static enum
+ {
+   REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
+ } ordering;
+ 
+ /* Value of POSIXLY_CORRECT environment variable.  */
+ static char *posixly_correct;
+ 
+ #ifdef __GNU_LIBRARY__
+ /* We want to avoid inclusion of string.h with non-GNU libraries
+    because there are many ways it can cause trouble.
+    On some systems, it contains special magic macros that don't work
+    in GCC.  */
+ # include <string.h>
+ # define my_index      strchr
+ #else
+ 
+ # if HAVE_STRING_H
+ #  include <string.h>
+ # else
+ #  if HAVE_STRINGS_H
+ #   include <strings.h>
+ #  endif
+ # endif
+ 
+ /* Avoid depending on library functions or files
+    whose names are inconsistent.  */
+ 
+ #ifndef getenv
+ extern char *getenv ();
+ #endif
+ 
+ static char *
+ my_index (str, chr)
+      const char *str;
+      int chr;
+ {
+   while (*str)
+     {
+       if (*str == chr)
+        return (char *) str;
+       str++;
+     }
+   return 0;
+ }
+ 
+ /* If using GCC, we can safely declare strlen this way.
+    If not using GCC, it is ok not to declare it.  */
+ #ifdef __GNUC__
+ /* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h.
+    That was relevant to code that was here before.  */
+ # if (!defined __STDC__ || !__STDC__) && !defined strlen
+ /* gcc with -traditional declares the built-in strlen to return int,
+    and has done so at least since version 2.4.5. -- rms.  */
+ extern int strlen (const char *);
+ # endif /* not __STDC__ */
+ #endif /* __GNUC__ */
+ 
+ #endif /* not __GNU_LIBRARY__ */
+ 
+ /* Handle permutation of arguments.  */
+ 
+ /* Describe the part of ARGV that contains non-options that have
+    been skipped.  `first_nonopt' is the index in ARGV of the first of them;
+    `last_nonopt' is the index after the last of them.  */
+ 
+ static int first_nonopt;
+ static int last_nonopt;
+ 
+ #ifdef _LIBC
+ /* Bash 2.0 gives us an environment variable containing flags
+    indicating ARGV elements that should not be considered arguments.  */
+ 
+ /* Defined in getopt_init.c  */
+ extern char *__getopt_nonoption_flags;
+ 
+ static int nonoption_flags_max_len;
+ static int nonoption_flags_len;
+ 
+ static int original_argc;
+ static char *const *original_argv;
+ 
+ /* Make sure the environment variable bash 2.0 puts in the environment
+    is valid for the getopt call we must make sure that the ARGV passed
+    to getopt is that one passed to the process.  */
+ static void
+ __attribute__ ((unused))
+ store_args_and_env (int argc, char *const *argv)
+ {
+   /* XXX This is no good solution.  We should rather copy the args so
+      that we can compare them later.  But we must not use malloc(3).  */
+   original_argc = argc;
+   original_argv = argv;
+ }
+ # ifdef text_set_element
+ text_set_element (__libc_subinit, store_args_and_env);
+ # endif /* text_set_element */
+ 
+ # define SWAP_FLAGS(ch1, ch2) \
+   if (nonoption_flags_len > 0)                                               \
+     {                                                                        \
+       char __tmp = __getopt_nonoption_flags[ch1];                            \
+       __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2];         \
+       __getopt_nonoption_flags[ch2] = __tmp;                                 \
+     }
+ #else  /* !_LIBC */
+ # define SWAP_FLAGS(ch1, ch2)
+ #endif /* _LIBC */
+ 
+ /* Exchange two adjacent subsequences of ARGV.
+    One subsequence is elements [first_nonopt,last_nonopt)
+    which contains all the non-options that have been skipped so far.
+    The other is elements [last_nonopt,optind), which contains all
+    the options processed since those non-options were skipped.
+ 
+    `first_nonopt' and `last_nonopt' are relocated so that they describe
+    the new indices of the non-options in ARGV after they are moved.  */
+ 
+ #if defined __STDC__ && __STDC__
+ static void exchange (char **);
+ #endif
+ 
+ static void
+ exchange (argv)
+      char **argv;
+ {
+   int bottom = first_nonopt;
+   int middle = last_nonopt;
+   int top = optind;
+   char *tem;
+ 
+   /* Exchange the shorter segment with the far end of the longer segment.
+      That puts the shorter segment into the right place.
+      It leaves the longer segment in the right place overall,
+      but it consists of two parts that need to be swapped next.  */
+ 
+ #ifdef _LIBC
+   /* First make sure the handling of the `__getopt_nonoption_flags'
+      string can work normally.  Our top argument must be in the range
+      of the string.  */
+   if (nonoption_flags_len > 0 && top >= nonoption_flags_max_len)
+     {
+       /* We must extend the array.  The user plays games with us and
+         presents new arguments.  */
+       char *new_str = malloc (top + 1);
+       if (new_str == NULL)
+        nonoption_flags_len = nonoption_flags_max_len = 0;
+       else
+        {
+          memset (__mempcpy (new_str, __getopt_nonoption_flags,
+                             nonoption_flags_max_len),
+                  '\0', top + 1 - nonoption_flags_max_len);
+          nonoption_flags_max_len = top + 1;
+          __getopt_nonoption_flags = new_str;
+        }
+     }
+ #endif
+ 
+   while (top > middle && middle > bottom)
+     {
+       if (top - middle > middle - bottom)
+        {
+          /* Bottom segment is the short one.  */
+          int len = middle - bottom;
+          register int i;
+ 
+          /* Swap it with the top part of the top segment.  */
+          for (i = 0; i < len; i++)
+            {
+              tem = argv[bottom + i];
+              argv[bottom + i] = argv[top - (middle - bottom) + i];
+              argv[top - (middle - bottom) + i] = tem;
+              SWAP_FLAGS (bottom + i, top - (middle - bottom) + i);
+            }
+          /* Exclude the moved bottom segment from further swapping.  */
+          top -= len;
+        }
+       else
+        {
+          /* Top segment is the short one.  */
+          int len = top - middle;
+          register int i;
+ 
+          /* Swap it with the bottom part of the bottom segment.  */
+          for (i = 0; i < len; i++)
+            {
+              tem = argv[bottom + i];
+              argv[bottom + i] = argv[middle + i];
+              argv[middle + i] = tem;
+              SWAP_FLAGS (bottom + i, middle + i);
+            }
+          /* Exclude the moved top segment from further swapping.  */
+          bottom += len;
+        }
+     }
+ 
+   /* Update records for the slots the non-options now occupy.  */
+ 
+   first_nonopt += (optind - last_nonopt);
+   last_nonopt = optind;
+ }
+ 
+ /* Initialize the internal data when the first call is made.  */
+ 
+ #if defined __STDC__ && __STDC__
+ static const char *_getopt_initialize (int, char *const *, const char *);
+ #endif
+ static const char *
+ _getopt_initialize (argc, argv, optstring)
+      int argc;
+      char *const *argv;
+      const char *optstring;
+ {
+   /* Start processing options with ARGV-element 1 (since ARGV-element 0
+      is the program name); the sequence of previously skipped
+      non-option ARGV-elements is empty.  */
+ 
+   first_nonopt = last_nonopt = optind;
+ 
+   nextchar = NULL;
+ 
+   posixly_correct = getenv ("POSIXLY_CORRECT");
+ 
+   /* Determine how to handle the ordering of options and nonoptions.  */
+ 
+   if (optstring[0] == '-')
+     {
+       ordering = RETURN_IN_ORDER;
+       ++optstring;
+     }
+   else if (optstring[0] == '+')
+     {
+       ordering = REQUIRE_ORDER;
+       ++optstring;
+     }
+   else if (posixly_correct != NULL)
+     ordering = REQUIRE_ORDER;
+   else
+     ordering = PERMUTE;
+ 
+ #ifdef _LIBC
+   if (posixly_correct == NULL
+       && argc == original_argc && argv == original_argv)
+     {
+       if (nonoption_flags_max_len == 0)
+        {
+          if (__getopt_nonoption_flags == NULL
+              || __getopt_nonoption_flags[0] == '\0')
+            nonoption_flags_max_len = -1;
+          else
+            {
+              const char *orig_str = __getopt_nonoption_flags;
+              int len = nonoption_flags_max_len = strlen (orig_str);
+              if (nonoption_flags_max_len < argc)
+                nonoption_flags_max_len = argc;
+              __getopt_nonoption_flags =
+                (char *) malloc (nonoption_flags_max_len);
+              if (__getopt_nonoption_flags == NULL)
+                nonoption_flags_max_len = -1;
+              else
+                memset (__mempcpy (__getopt_nonoption_flags, orig_str, len),
+                        '\0', nonoption_flags_max_len - len);
+            }
+        }
+       nonoption_flags_len = nonoption_flags_max_len;
+     }
+   else
+     nonoption_flags_len = 0;
+ #endif
+ 
+   return optstring;
+ }
+ 
+ /* Scan elements of ARGV (whose length is ARGC) for option characters
+    given in OPTSTRING.
+ 
+    If an element of ARGV starts with '-', and is not exactly "-" or "--",
+    then it is an option element.  The characters of this element
+    (aside from the initial '-') are option characters.  If `getopt'
+    is called repeatedly, it returns successively each of the option characters
+    from each of the option elements.
+ 
+    If `getopt' finds another option character, it returns that character,
+    updating `optind' and `nextchar' so that the next call to `getopt' can
+    resume the scan with the following option character or ARGV-element.
+ 
+    If there are no more option characters, `getopt' returns -1.
+    Then `optind' is the index in ARGV of the first ARGV-element
+    that is not an option.  (The ARGV-elements have been permuted
+    so that those that are not options now come last.)
+ 
+    OPTSTRING is a string containing the legitimate option characters.
+    If an option character is seen that is not listed in OPTSTRING,
+    return '?' after printing an error message.  If you set `opterr' to
+    zero, the error message is suppressed but we still return '?'.
+ 
+    If a char in OPTSTRING is followed by a colon, that means it wants an arg,
+    so the following text in the same ARGV-element, or the text of the following
+    ARGV-element, is returned in `optarg'.  Two colons mean an option that
+    wants an optional arg; if there is text in the current ARGV-element,
+    it is returned in `optarg', otherwise `optarg' is set to zero.
+ 
+    If OPTSTRING starts with `-' or `+', it requests different methods of
+    handling the non-option ARGV-elements.
+    See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above.
+ 
+    Long-named options begin with `--' instead of `-'.
+    Their names may be abbreviated as long as the abbreviation is unique
+    or is an exact match for some defined option.  If they have an
+    argument, it follows the option name in the same ARGV-element, separated
+    from the option name by a `=', or else the in next ARGV-element.
+    When `getopt' finds a long-named option, it returns 0 if that option's
+    `flag' field is nonzero, the value of the option's `val' field
+    if the `flag' field is zero.
+ 
+    The elements of ARGV aren't really const, because we permute them.
+    But we pretend they're const in the prototype to be compatible
+    with other systems.
+ 
+    LONGOPTS is a vector of `struct option' terminated by an
+    element containing a name which is zero.
+ 
+    LONGIND returns the index in LONGOPT of the long-named option found.
+    It is only valid when a long-named option has been found by the most
+    recent call.
+ 
+    If LONG_ONLY is nonzero, '-' as well as '--' can introduce
+    long-named options.  */
+ 
+ int
+ _getopt_internal (argc, argv, optstring, longopts, longind, long_only)
+      int argc;
+      char *const *argv;
+      const char *optstring;
+      const struct option *longopts;
+      int *longind;
+      int long_only;
+ {
+   optarg = NULL;
+ 
+   if (optind == 0 || !__getopt_initialized)
+     {
+       if (optind == 0)
+        optind = 1;     /* Don't scan ARGV[0], the program name.  */
+       optstring = _getopt_initialize (argc, argv, optstring);
+       __getopt_initialized = 1;
+     }
+ 
+   /* Test whether ARGV[optind] points to a non-option argument.
+      Either it does not have option syntax, or there is an environment flag
+      from the shell indicating it is not an option.  The later information
+      is only used when the used in the GNU libc.  */
+ #ifdef _LIBC
+ # define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0'              \
+                      || (optind < nonoption_flags_len                        \
+                          && __getopt_nonoption_flags[optind] == '1'))
+ #else
+ # define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0')
+ #endif
+ 
+   if (nextchar == NULL || *nextchar == '\0')
+     {
+       /* Advance to the next ARGV-element.  */
+ 
+       /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been
+         moved back by the user (who may also have changed the arguments).  */
+       if (last_nonopt > optind)
+        last_nonopt = optind;
+       if (first_nonopt > optind)
+        first_nonopt = optind;
+ 
+       if (ordering == PERMUTE)
+        {
+          /* If we have just processed some options following some non-options,
+             exchange them so that the options come first.  */
+ 
+          if (first_nonopt != last_nonopt && last_nonopt != optind)
+            exchange ((char **) argv);
+          else if (last_nonopt != optind)
+            first_nonopt = optind;
+ 
+          /* Skip any additional non-options
+             and extend the range of non-options previously skipped.  */
+ 
+          while (optind < argc && NONOPTION_P)
+            optind++;
+          last_nonopt = optind;
+        }
+ 
+       /* The special ARGV-element `--' means premature end of options.
+         Skip it like a null option,
+         then exchange with previous non-options as if it were an option,
+         then skip everything else like a non-option.  */
+ 
+       if (optind != argc && !strcmp (argv[optind], "--"))
+        {
+          optind++;
+ 
+          if (first_nonopt != last_nonopt && last_nonopt != optind)
+            exchange ((char **) argv);
+          else if (first_nonopt == last_nonopt)
+            first_nonopt = optind;
+          last_nonopt = argc;
+ 
+          optind = argc;
+        }
+ 
+       /* If we have done all the ARGV-elements, stop the scan
+         and back over any non-options that we skipped and permuted.  */
+ 
+       if (optind == argc)
+        {
+          /* Set the next-arg-index to point at the non-options
+             that we previously skipped, so the caller will digest them.  */
+          if (first_nonopt != last_nonopt)
+            optind = first_nonopt;
+          return -1;
+        }
+ 
+       /* If we have come to a non-option and did not permute it,
+         either stop the scan or describe it to the caller and pass it by.  */
+ 
+       if (NONOPTION_P)
+        {
+          if (ordering == REQUIRE_ORDER)
+            return -1;
+          optarg = argv[optind++];
+          return 1;
+        }
+ 
+       /* We have found another option-ARGV-element.
+         Skip the initial punctuation.  */
+ 
+       nextchar = (argv[optind] + 1
+                  + (longopts != NULL && argv[optind][1] == '-'));
+     }
+ 
+   /* Decode the current option-ARGV-element.  */
+ 
+   /* Check whether the ARGV-element is a long option.
+ 
+      If long_only and the ARGV-element has the form "-f", where f is
+      a valid short option, don't consider it an abbreviated form of
+      a long option that starts with f.  Otherwise there would be no
+      way to give the -f short option.
+ 
+      On the other hand, if there's a long option "fubar" and
+      the ARGV-element is "-fu", do consider that an abbreviation of
+      the long option, just like "--fu", and not "-f" with arg "u".
+ 
+      This distinction seems to be the most useful approach.  */
+ 
+   if (longopts != NULL
+       && (argv[optind][1] == '-'
+          || (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1])))))
+     {
+       char *nameend;
+       const struct option *p;
+       const struct option *pfound = NULL;
+       int exact = 0;
+       int ambig = 0;
+       int indfound = -1;
+       int option_index;
+ 
+       for (nameend = nextchar; *nameend && *nameend != '='; nameend++)
+        /* Do nothing.  */ ;
+ 
+       /* Test all long options for either exact match
+         or abbreviated matches.  */
+       for (p = longopts, option_index = 0; p->name; p++, option_index++)
+        if (!strncmp (p->name, nextchar, nameend - nextchar))
+          {
+            if ((unsigned int) (nameend - nextchar)
+                == (unsigned int) strlen (p->name))
+              {
+                /* Exact match found.  */
+                pfound = p;
+                indfound = option_index;
+                exact = 1;
+                break;
+              }
+            else if (pfound == NULL)
+              {
+                /* First nonexact match found.  */
+                pfound = p;
+                indfound = option_index;
+              }
+            else
+              /* Second or later nonexact match found.  */
+              ambig = 1;
+          }
+ 
+       if (ambig && !exact)
+        {
+          if (opterr)
+            fprintf (stderr, _("%s: option `%s' is ambiguous\n"),
+                     argv[0], argv[optind]);
+          nextchar += strlen (nextchar);
+          optind++;
+          optopt = 0;
+          return '?';
+        }
+ 
+       if (pfound != NULL)
+        {
+          option_index = indfound;
+          optind++;
+          if (*nameend)
+            {
+              /* Don't test has_arg with >, because some C compilers don't
+                 allow it to be used on enums.  */
+              if (pfound->has_arg)
+                optarg = nameend + 1;
+              else
+                {
+                  if (opterr)
+                    {
+                      if (argv[optind - 1][1] == '-')
+                        /* --option */
+                        fprintf (stderr,
+                                 _("%s: option `--%s' doesn't allow an argument\n"),
+                                 argv[0], pfound->name);
+                      else
+                        /* +option or -option */
+                        fprintf (stderr,
+                                 _("%s: option `%c%s' doesn't allow an argument\n"),
+                                 argv[0], argv[optind - 1][0], pfound->name);
+ 
+                      nextchar += strlen (nextchar);
+ 
+                      optopt = pfound->val;
+                      return '?';
+                    }
+                }
+            }
+          else if (pfound->has_arg == 1)
+            {
+              if (optind < argc)
+                optarg = argv[optind++];
+              else
+                {
+                  if (opterr)
+                    fprintf (stderr,
+                           _("%s: option `%s' requires an argument\n"),
+                           argv[0], argv[optind - 1]);
+                  nextchar += strlen (nextchar);
+                  optopt = pfound->val;
+                  return optstring[0] == ':' ? ':' : '?';
+                }
+            }
+          nextchar += strlen (nextchar);
+          if (longind != NULL)
+            *longind = option_index;
+          if (pfound->flag)
+            {
+              *(pfound->flag) = pfound->val;
+              return 0;
+            }
+          return pfound->val;
+        }
+ 
+       /* Can't find it as a long option.  If this is not getopt_long_only,
+         or the option starts with '--' or is not a valid short
+         option, then it's an error.
+         Otherwise interpret it as a short option.  */
+       if (!long_only || argv[optind][1] == '-'
+          || my_index (optstring, *nextchar) == NULL)
+        {
+          if (opterr)
+            {
+              if (argv[optind][1] == '-')
+                /* --option */
+                fprintf (stderr, _("%s: unrecognized option `--%s'\n"),
+                         argv[0], nextchar);
+              else
+                /* +option or -option */
+                fprintf (stderr, _("%s: unrecognized option `%c%s'\n"),
+                         argv[0], argv[optind][0], nextchar);
+            }
+          nextchar = (char *) "";
+          optind++;
+          optopt = 0;
+          return '?';
+        }
+     }
+ 
+   /* Look at and handle the next short option-character.  */
+ 
+   {
+     char c = *nextchar++;
+     char *temp = my_index (optstring, c);
+ 
+     /* Increment `optind' when we start to process its last character.  */
+     if (*nextchar == '\0')
+       ++optind;
+ 
+     if (temp == NULL || c == ':')
+       {
+        if (opterr)
+          {
+            if (posixly_correct)
+              /* 1003.2 specifies the format of this message.  */
+              fprintf (stderr, _("%s: illegal option -- %c\n"),
+                       argv[0], c);
+            else
+              fprintf (stderr, _("%s: invalid option -- %c\n"),
+                       argv[0], c);
+          }
+        optopt = c;
+        return '?';
+       }
+     /* Convenience. Treat POSIX -W foo same as long option --foo */
+     if (temp[0] == 'W' && temp[1] == ';')
+       {
+        char *nameend;
+        const struct option *p;
+        const struct option *pfound = NULL;
+        int exact = 0;
+        int ambig = 0;
+        int indfound = 0;
+        int option_index;
+ 
+        /* This is an option that requires an argument.  */
+        if (*nextchar != '\0')
+          {
+            optarg = nextchar;
+            /* If we end this ARGV-element by taking the rest as an arg,
+               we must advance to the next element now.  */
+            optind++;
+          }
+        else if (optind == argc)
+          {
+            if (opterr)
+              {
+                /* 1003.2 specifies the format of this message.  */
+                fprintf (stderr, _("%s: option requires an argument -- %c\n"),
+                         argv[0], c);
+              }
+            optopt = c;
+            if (optstring[0] == ':')
+              c = ':';
+            else
+              c = '?';
+            return c;
+          }
+        else
+          /* We already incremented `optind' once;
+             increment it again when taking next ARGV-elt as argument.  */
+          optarg = argv[optind++];
+ 
+        /* optarg is now the argument, see if it's in the
+           table of longopts.  */
+ 
+        for (nextchar = nameend = optarg; *nameend && *nameend != '='; nameend++)
+          /* Do nothing.  */ ;
+ 
+        /* Test all long options for either exact match
+           or abbreviated matches.  */
+        for (p = longopts, option_index = 0; p->name; p++, option_index++)
+          if (!strncmp (p->name, nextchar, nameend - nextchar))
+            {
+              if ((unsigned int) (nameend - nextchar) == strlen (p->name))
+                {
+                  /* Exact match found.  */
+                  pfound = p;
+                  indfound = option_index;
+                  exact = 1;
+                  break;
+                }
+              else if (pfound == NULL)
+                {
+                  /* First nonexact match found.  */
+                  pfound = p;
+                  indfound = option_index;
+                }
+              else
+                /* Second or later nonexact match found.  */
+                ambig = 1;
+            }
+        if (ambig && !exact)
+          {
+            if (opterr)
+              fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"),
+                       argv[0], argv[optind]);
+            nextchar += strlen (nextchar);
+            optind++;
+            return '?';
+          }
+        if (pfound != NULL)
+          {
+            option_index = indfound;
+            if (*nameend)
+              {
+                /* Don't test has_arg with >, because some C compilers don't
+                   allow it to be used on enums.  */
+                if (pfound->has_arg)
+                  optarg = nameend + 1;
+                else
+                  {
+                    if (opterr)
+                      fprintf (stderr, _("\
+ %s: option `-W %s' doesn't allow an argument\n"),
+                               argv[0], pfound->name);
+ 
+                    nextchar += strlen (nextchar);
+                    return '?';
+                  }
+              }
+            else if (pfound->has_arg == 1)
+              {
+                if (optind < argc)
+                  optarg = argv[optind++];
+                else
+                  {
+                    if (opterr)
+                      fprintf (stderr,
+                               _("%s: option `%s' requires an argument\n"),
+                               argv[0], argv[optind - 1]);
+                    nextchar += strlen (nextchar);
+                    return optstring[0] == ':' ? ':' : '?';
+                  }
+              }
+            nextchar += strlen (nextchar);
+            if (longind != NULL)
+              *longind = option_index;
+            if (pfound->flag)
+              {
+                *(pfound->flag) = pfound->val;
+                return 0;
+              }
+            return pfound->val;
+          }
+          nextchar = NULL;
+          return 'W';   /* Let the application handle it.   */
+       }
+     if (temp[1] == ':')
+       {
+        if (temp[2] == ':')
+          {
+            /* This is an option that accepts an argument optionally.  */
+            if (*nextchar != '\0')
+              {
+                optarg = nextchar;
+                optind++;
+              }
+            else
+              optarg = NULL;
+            nextchar = NULL;
+          }
+        else
+          {
+            /* This is an option that requires an argument.  */
+            if (*nextchar != '\0')
+              {
+                optarg = nextchar;
+                /* If we end this ARGV-element by taking the rest as an arg,
+                   we must advance to the next element now.  */
+                optind++;
+              }
+            else if (optind == argc)
+              {
+                if (opterr)
+                  {
+                    /* 1003.2 specifies the format of this message.  */
+                    fprintf (stderr,
+                           _("%s: option requires an argument -- %c\n"),
+                           argv[0], c);
+                  }
+                optopt = c;
+                if (optstring[0] == ':')
+                  c = ':';
+                else
+                  c = '?';
+              }
+            else
+              /* We already incremented `optind' once;
+                 increment it again when taking next ARGV-elt as argument.  */
+              optarg = argv[optind++];
+            nextchar = NULL;
+          }
+       }
+     return c;
+   }
+ }
+ 
+ int
+ getopt (argc, argv, optstring)
+      int argc;
+      char *const *argv;
+      const char *optstring;
+ {
+   return _getopt_internal (argc, argv, optstring,
+                           (const struct option *) 0,
+                           (int *) 0,
+                           0);
+ }
+ 
+ #endif /* Not ELIDE_CODE.  */
+ 
+ #ifdef TEST
+ 
+ /* Compile with -DTEST to make an executable for use in testing
+    the above definition of `getopt'.  */
+ 
+ int
+ main (argc, argv)
+      int argc;
+      char **argv;
+ {
+   int c;
+   int digit_optind = 0;
+ 
+   while (1)
+     {
+       int this_option_optind = optind ? optind : 1;
+ 
+       c = getopt (argc, argv, "abc:d:0123456789");
+       if (c == -1)
+        break;
+ 
+       switch (c)
+        {
+        case '0':
+        case '1':
+        case '2':
+        case '3':
+        case '4':
+        case '5':
+        case '6':
+        case '7':
+        case '8':
+        case '9':
+          if (digit_optind != 0 && digit_optind != this_option_optind)
+            printf ("digits occur in two different argv-elements.\n");
+          digit_optind = this_option_optind;
+          printf ("option %c\n", c);
+          break;
+ 
+        case 'a':
+          printf ("option a\n");
+          break;
+ 
+        case 'b':
+          printf ("option b\n");
+          break;
+ 
+        case 'c':
+          printf ("option c with value `%s'\n", optarg);
+          break;
+ 
+        case '?':
+          break;
+ 
+        default:
+          printf ("?? getopt returned character code 0%o ??\n", c);
+        }
+     }
+ 
+   if (optind < argc)
+     {
+       printf ("non-option ARGV-elements: ");
+       while (optind < argc)
+        printf ("%s ", argv[optind++]);
+       printf ("\n");
+     }
+ 
+   exit (0);
+ }
+ 
+ #endif /* TEST */


ossp-pkg/getopt/getopt.h -> 1.1

*** /dev/null    Mon Apr 29 14:45:17 2024
--- -    Mon Apr 29 14:50:02 2024
***************
*** 0 ****
--- 1,141 ----
+ /* Declarations for getopt.
+    Copyright 1989, 1990, 1991, 1992, 1993, 1994, 1996, 1997, 1998, 2000
+    Free Software Foundation, Inc.
+ 
+    NOTE: The canonical source of this file is maintained with the GNU C Library.
+    Bugs can be reported to bug-glibc@gnu.org.
+ 
+    This program is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the
+    Free Software Foundation; either version 2, or (at your option) any
+    later version.
+ 
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+ 
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+    USA.  */
+ 
+ #ifndef _GETOPT_H
+ #define _GETOPT_H 1
+ 
+ #ifdef __cplusplus
+ extern "C" {
+ #endif
+ 
+ /* For communication from `getopt' to the caller.
+    When `getopt' finds an option that takes an argument,
+    the argument value is returned here.
+    Also, when `ordering' is RETURN_IN_ORDER,
+    each non-option ARGV-element is returned here.  */
+ 
+ extern char *optarg;
+ 
+ /* Index in ARGV of the next element to be scanned.
+    This is used for communication to and from the caller
+    and for communication between successive calls to `getopt'.
+ 
+    On entry to `getopt', zero means this is the first call; initialize.
+ 
+    When `getopt' returns -1, this is the index of the first of the
+    non-option elements that the caller should itself scan.
+ 
+    Otherwise, `optind' communicates from one call to the next
+    how much of ARGV has been scanned so far.  */
+ 
+ extern int optind;
+ 
+ /* Callers store zero here to inhibit the error message `getopt' prints
+    for unrecognized options.  */
+ 
+ extern int opterr;
+ 
+ /* Set to an option character which was unrecognized.  */
+ 
+ extern int optopt;
+ 
+ /* Describe the long-named options requested by the application.
+    The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
+    of `struct option' terminated by an element containing a name which is
+    zero.
+ 
+    The field `has_arg' is:
+    no_argument         (or 0) if the option does not take an argument,
+    required_argument   (or 1) if the option requires an argument,
+    optional_argument   (or 2) if the option takes an optional argument.
+ 
+    If the field `flag' is not NULL, it points to a variable that is set
+    to the value given in the field `val' when the option is found, but
+    left unchanged if the option is not found.
+ 
+    To have a long-named option do something other than set an `int' to
+    a compiled-in constant, such as set a value from `optarg', set the
+    option's `flag' field to zero and its `val' field to a nonzero
+    value (the equivalent single-letter option character, if there is
+    one).  For long options that have a zero `flag' field, `getopt'
+    returns the contents of the `val' field.  */
+ 
+ struct option
+ {
+ #if defined (__STDC__) && __STDC__
+   const char *name;
+ #else
+   char *name;
+ #endif
+   /* has_arg can't be an enum because some compilers complain about
+      type mismatches in all the code that assumes it is an int.  */
+   int has_arg;
+   int *flag;
+   int val;
+ };
+ 
+ /* Names for the values of the `has_arg' field of `struct option'.  */
+ 
+ #define        no_argument             0
+ #define required_argument      1
+ #define optional_argument      2
+ 
+ #if defined (__STDC__) && __STDC__
+ /* HAVE_DECL_* is a three-state macro: undefined, 0 or 1.  If it is
+    undefined, we haven't run the autoconf check so provide the
+    declaration without arguments.  If it is 0, we checked and failed
+    to find the declaration so provide a fully prototyped one.  If it
+    is 1, we found it so don't provide any declaration at all.  */
+ #if defined (__GNU_LIBRARY__) || (defined (HAVE_DECL_GETOPT) && !HAVE_DECL_GETOPT)
+ /* Many other libraries have conflicting prototypes for getopt, with
+    differences in the consts, in stdlib.h.  To avoid compilation
+    errors, only prototype getopt for the GNU C library.  */
+ extern int getopt (int argc, char *const *argv, const char *shortopts);
+ #else /* not __GNU_LIBRARY__ */
+ # if !defined (HAVE_DECL_GETOPT) && !defined (__cplusplus)
+ extern int getopt ();
+ # endif
+ #endif /* __GNU_LIBRARY__ */
+ extern int getopt_long (int argc, char *const *argv, const char *shortopts,
+                        const struct option *longopts, int *longind);
+ extern int getopt_long_only (int argc, char *const *argv,
+                             const char *shortopts,
+                             const struct option *longopts, int *longind);
+ 
+ /* Internal only.  Users should not call this directly.  */
+ extern int _getopt_internal (int argc, char *const *argv,
+                             const char *shortopts,
+                             const struct option *longopts, int *longind,
+                             int long_only);
+ #else /* not __STDC__ */
+ extern int getopt ();
+ extern int getopt_long ();
+ extern int getopt_long_only ();
+ 
+ extern int _getopt_internal ();
+ #endif /* __STDC__ */
+ 
+ #ifdef __cplusplus
+ }
+ #endif
+ 
+ #endif /* getopt.h */


ossp-pkg/getopt/getopt.texi -> 1.1

*** /dev/null    Mon Apr 29 14:45:17 2024
--- -    Mon Apr 29 14:50:02 2024
***************
*** 0 ****
--- 1,307 ----
+ @node Getopt, Argp, , Parsing Program Arguments
+ @section Parsing program options using @code{getopt}
+ 
+ The @code{getopt} and @code{getopt_long} functions automate some of the
+ chore involved in parsing typical unix command line options.
+ 
+ @menu
+ * Using Getopt::                Using the @code{getopt} function.
+ * Example of Getopt::           An example of parsing options with @code{getopt}.
+ * Getopt Long Options::         GNU suggests utilities accept long-named
+                                  options; here is one way to do.
+ * Getopt Long Option Example::  An example of using @code{getopt_long}.
+ @end menu
+ 
+ @node Using Getopt, Example of Getopt, , Getopt
+ @subsection Using the @code{getopt} function
+ 
+ Here are the details about how to call the @code{getopt} function.  To
+ use this facility, your program must include the header file
+ @file{unistd.h}.
+ @pindex unistd.h
+ 
+ @comment unistd.h
+ @comment POSIX.2
+ @deftypevar int opterr
+ If the value of this variable is nonzero, then @code{getopt} prints an
+ error message to the standard error stream if it encounters an unknown
+ option character or an option with a missing required argument.  This is
+ the default behavior.  If you set this variable to zero, @code{getopt}
+ does not print any messages, but it still returns the character @code{?}
+ to indicate an error.
+ @end deftypevar
+ 
+ @comment unistd.h
+ @comment POSIX.2
+ @deftypevar int optopt
+ When @code{getopt} encounters an unknown option character or an option
+ with a missing required argument, it stores that option character in
+ this variable.  You can use this for providing your own diagnostic
+ messages.
+ @end deftypevar
+ 
+ @comment unistd.h
+ @comment POSIX.2
+ @deftypevar int optind
+ This variable is set by @code{getopt} to the index of the next element
+ of the @var{argv} array to be processed.  Once @code{getopt} has found
+ all of the option arguments, you can use this variable to determine
+ where the remaining non-option arguments begin.  The initial value of
+ this variable is @code{1}.
+ @end deftypevar
+ 
+ @comment unistd.h
+ @comment POSIX.2
+ @deftypevar {char *} optarg
+ This variable is set by @code{getopt} to point at the value of the
+ option argument, for those options that accept arguments.
+ @end deftypevar
+ 
+ @comment unistd.h
+ @comment POSIX.2
+ @deftypefun int getopt (int @var{argc}, char **@var{argv}, const char *@var{options})
+ The @code{getopt} function gets the next option argument from the
+ argument list specified by the @var{argv} and @var{argc} arguments.
+ Normally these values come directly from the arguments received by
+ @code{main}.
+ 
+ The @var{options} argument is a string that specifies the option
+ characters that are valid for this program.  An option character in this
+ string can be followed by a colon (@samp{:}) to indicate that it takes a
+ required argument.  If an option character is followed by two colons
+ (@samp{::}), its argument is optional; this is a GNU extension.
+ 
+ @code{getopt} has three ways to deal with options that follow
+ non-options @var{argv} elements.  The special argument @samp{--} forces
+ in all cases the end of option scanning.
+ 
+ @itemize @bullet
+ @item
+ The default is to permute the contents of @var{argv} while scanning it
+ so that eventually all the non-options are at the end.  This allows
+ options to be given in any order, even with programs that were not
+ written to expect this.
+ 
+ @item
+ If the @var{options} argument string begins with a hyphen (@samp{-}), this
+ is treated specially.  It permits arguments that are not options to be
+ returned as if they were associated with option character @samp{\1}.
+ 
+ @item
+ POSIX demands the following behavior: The first non-option stops option
+ processing.  This mode is selected by either setting the environment
+ variable @code{POSIXLY_CORRECT} or beginning the @var{options} argument
+ string with a plus sign (@samp{+}).
+ @end itemize
+ 
+ The @code{getopt} function returns the option character for the next
+ command line option.  When no more option arguments are available, it
+ returns @code{-1}.  There may still be more non-option arguments; you
+ must compare the external variable @code{optind} against the @var{argc}
+ parameter to check this.
+ 
+ If the option has an argument, @code{getopt} returns the argument by
+ storing it in the variable @var{optarg}.  You don't ordinarily need to
+ copy the @code{optarg} string, since it is a pointer into the original
+ @var{argv} array, not into a static area that might be overwritten.
+ 
+ If @code{getopt} finds an option character in @var{argv} that was not
+ included in @var{options}, or a missing option argument, it returns
+ @samp{?} and sets the external variable @code{optopt} to the actual
+ option character.  If the first character of @var{options} is a colon
+ (@samp{:}), then @code{getopt} returns @samp{:} instead of @samp{?} to
+ indicate a missing option argument.  In addition, if the external
+ variable @code{opterr} is nonzero (which is the default), @code{getopt}
+ prints an error message.
+ @end deftypefun
+ 
+ @node Example of Getopt
+ @subsection Example of Parsing Arguments with @code{getopt}
+ 
+ Here is an example showing how @code{getopt} is typically used.  The
+ key points to notice are:
+ 
+ @itemize @bullet
+ @item
+ Normally, @code{getopt} is called in a loop.  When @code{getopt} returns
+ @code{-1}, indicating no more options are present, the loop terminates.
+ 
+ @item
+ A @code{switch} statement is used to dispatch on the return value from
+ @code{getopt}.  In typical use, each case just sets a variable that
+ is used later in the program.
+ 
+ @item
+ A second loop is used to process the remaining non-option arguments.
+ @end itemize
+ 
+ @smallexample
+ @include testopt.c.texi
+ @end smallexample
+ 
+ Here are some examples showing what this program prints with different
+ combinations of arguments:
+ 
+ @smallexample
+ % testopt
+ aflag = 0, bflag = 0, cvalue = (null)
+ 
+ % testopt -a -b
+ aflag = 1, bflag = 1, cvalue = (null)
+ 
+ % testopt -ab
+ aflag = 1, bflag = 1, cvalue = (null)
+ 
+ % testopt -c foo
+ aflag = 0, bflag = 0, cvalue = foo
+ 
+ % testopt -cfoo
+ aflag = 0, bflag = 0, cvalue = foo
+ 
+ % testopt arg1
+ aflag = 0, bflag = 0, cvalue = (null)
+ Non-option argument arg1
+ 
+ % testopt -a arg1
+ aflag = 1, bflag = 0, cvalue = (null)
+ Non-option argument arg1
+ 
+ % testopt -c foo arg1
+ aflag = 0, bflag = 0, cvalue = foo
+ Non-option argument arg1
+ 
+ % testopt -a -- -b
+ aflag = 1, bflag = 0, cvalue = (null)
+ Non-option argument -b
+ 
+ % testopt -a -
+ aflag = 1, bflag = 0, cvalue = (null)
+ Non-option argument -
+ @end smallexample
+ 
+ @node Getopt Long Options
+ @subsection Parsing Long Options with @code{getopt_long}
+ 
+ To accept GNU-style long options as well as single-character options,
+ use @code{getopt_long} instead of @code{getopt}.  This function is
+ declared in @file{getopt.h}, not @file{unistd.h}.  You should make every
+ program accept long options if it uses any options, for this takes
+ little extra work and helps beginners remember how to use the program.
+ 
+ @comment getopt.h
+ @comment GNU
+ @deftp {Data Type} {struct option}
+ This structure describes a single long option name for the sake of
+ @code{getopt_long}.  The argument @var{longopts} must be an array of
+ these structures, one for each long option.  Terminate the array with an
+ element containing all zeros.
+ 
+ The @code{struct option} structure has these fields:
+ 
+ @table @code
+ @item const char *name
+ This field is the name of the option.  It is a string.
+ 
+ @item int has_arg
+ This field says whether the option takes an argument.  It is an integer,
+ and there are three legitimate values: @w{@code{no_argument}},
+ @code{required_argument} and @code{optional_argument}.
+ 
+ @item int *flag
+ @itemx int val
+ These fields control how to report or act on the option when it occurs.
+ 
+ If @code{flag} is a null pointer, then the @code{val} is a value which
+ identifies this option.  Often these values are chosen to uniquely
+ identify particular long options.
+ 
+ If @code{flag} is not a null pointer, it should be the address of an
+ @code{int} variable which is the flag for this option.  The value in
+ @code{val} is the value to store in the flag to indicate that the option
+ was seen.
+ @end table
+ @end deftp
+ 
+ @comment getopt.h
+ @comment GNU
+ @deftypefun int getopt_long (int @var{argc}, char *const *@var{argv}, const char *@var{shortopts}, const struct option *@var{longopts}, int *@var{indexptr})
+ Decode options from the vector @var{argv} (whose length is @var{argc}).
+ The argument @var{shortopts} describes the short options to accept, just as
+ it does in @code{getopt}.  The argument @var{longopts} describes the long
+ options to accept (see above).
+ 
+ When @code{getopt_long} encounters a short option, it does the same
+ thing that @code{getopt} would do: it returns the character code for the
+ option, and stores the options argument (if it has one) in @code{optarg}.
+ 
+ When @code{getopt_long} encounters a long option, it takes actions based
+ on the @code{flag} and @code{val} fields of the definition of that
+ option.
+ 
+ If @code{flag} is a null pointer, then @code{getopt_long} returns the
+ contents of @code{val} to indicate which option it found.  You should
+ arrange distinct values in the @code{val} field for options with
+ different meanings, so you can decode these values after
+ @code{getopt_long} returns.  If the long option is equivalent to a short
+ option, you can use the short option's character code in @code{val}.
+ 
+ If @code{flag} is not a null pointer, that means this option should just
+ set a flag in the program.  The flag is a variable of type @code{int}
+ that you define.  Put the address of the flag in the @code{flag} field.
+ Put in the @code{val} field the value you would like this option to
+ store in the flag.  In this case, @code{getopt_long} returns @code{0}.
+ 
+ For any long option, @code{getopt_long} tells you the index in the array
+ @var{longopts} of the options definition, by storing it into
+ @code{*@var{indexptr}}.  You can get the name of the option with
+ @code{@var{longopts}[*@var{indexptr}].name}.  So you can distinguish among
+ long options either by the values in their @code{val} fields or by their
+ indices.  You can also distinguish in this way among long options that
+ set flags.
+ 
+ When a long option has an argument, @code{getopt_long} puts the argument
+ value in the variable @code{optarg} before returning.  When the option
+ has no argument, the value in @code{optarg} is a null pointer.  This is
+ how you can tell whether an optional argument was supplied.
+ 
+ When @code{getopt_long} has no more options to handle, it returns
+ @code{-1}, and leaves in the variable @code{optind} the index in
+ @var{argv} of the next remaining argument.
+ @end deftypefun
+ 
+ Since long option names were used before before the @code{getopt_long}
+ options was invented there are program interfaces which require programs
+ to recognize options like @w{@samp{-option value}} instead of
+ @w{@samp{--option value}}.  To enable these programs to use the GNU
+ getopt functionality there is one more function available.
+ 
+ @comment getopt.h
+ @comment GNU
+ @deftypefun int getopt_long_only (int @var{argc}, char *const *@var{argv}, const char *@var{shortopts}, const struct option *@var{longopts}, int *@var{indexptr})
+ 
+ The @code{getopt_long_only} function is equivalent to the
+ @code{getopt_long} function but it allows to specify the user of the
+ application to pass long options with only @samp{-} instead of
+ @samp{--}.  The @samp{--} prefix is still recognized but instead of
+ looking through the short options if a @samp{-} is seen it is first
+ tried whether this parameter names a long option.  If not, it is parsed
+ as a short option.
+ 
+ Assuming @code{getopt_long_only} is used starting an application with
+ 
+ @smallexample
+   app -foo
+ @end smallexample
+ 
+ @noindent
+ the @code{getopt_long_only} will first look for a long option named
+ @samp{foo}.  If this is not found, the short options @samp{f}, @samp{o},
+ and again @samp{o} are recognized.
+ @end deftypefun
+ 
+ @node Getopt Long Option Example
+ @subsection Example of Parsing Long Options with @code{getopt_long}
+ 
+ @smallexample
+ @include longopt.c.texi
+ @end smallexample


ossp-pkg/getopt/getopt1.c -> 1.1

*** /dev/null    Mon Apr 29 14:45:17 2024
--- -    Mon Apr 29 14:50:02 2024
***************
*** 0 ****
--- 1,190 ----
+ /* getopt_long and getopt_long_only entry points for GNU getopt.
+    Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98
+      Free Software Foundation, Inc.
+ 
+    NOTE: This source is derived from an old version taken from the GNU C
+    Library (glibc).
+ 
+    This program is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the
+    Free Software Foundation; either version 2, or (at your option) any
+    later version.
+ 
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+ 
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+    USA.  */
+ 
+ #ifdef HAVE_CONFIG_H
+ #include <config.h>
+ #endif
+ 
+ #include "getopt.h"
+ 
+ #if !defined __STDC__ || !__STDC__
+ /* This is a separate conditional since some stdc systems
+    reject `defined (const)'.  */
+ #ifndef const
+ #define const
+ #endif
+ #endif
+ 
+ #include <stdio.h>
+ 
+ /* Comment out all this code if we are using the GNU C Library, and are not
+    actually compiling the library itself.  This code is part of the GNU C
+    Library, but also included in many other GNU distributions.  Compiling
+    and linking in this code is a waste when using the GNU C library
+    (especially if it is a shared library).  Rather than having every GNU
+    program understand `configure --with-gnu-libc' and omit the object files,
+    it is simpler to just do this in the source for each such file.  */
+ 
+ #define GETOPT_INTERFACE_VERSION 2
+ #if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2
+ #include <gnu-versions.h>
+ #if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION
+ #define ELIDE_CODE
+ #endif
+ #endif
+ 
+ #ifndef ELIDE_CODE
+ 
+ 
+ /* This needs to come after some library #include
+    to get __GNU_LIBRARY__ defined.  */
+ #ifdef __GNU_LIBRARY__
+ #include <stdlib.h>
+ #endif
+ 
+ #ifndef        NULL
+ #define NULL 0
+ #endif
+ 
+ int
+ getopt_long (argc, argv, options, long_options, opt_index)
+      int argc;
+      char *const *argv;
+      const char *options;
+      const struct option *long_options;
+      int *opt_index;
+ {
+   return _getopt_internal (argc, argv, options, long_options, opt_index, 0);
+ }
+ 
+ /* Like getopt_long, but '-' as well as '--' can indicate a long option.
+    If an option that starts with '-' (not '--') doesn't match a long option,
+    but does match a short option, it is parsed as a short option
+    instead.  */
+ 
+ int
+ getopt_long_only (argc, argv, options, long_options, opt_index)
+      int argc;
+      char *const *argv;
+      const char *options;
+      const struct option *long_options;
+      int *opt_index;
+ {
+   return _getopt_internal (argc, argv, options, long_options, opt_index, 1);
+ }
+ 
+ 
+ #endif /* Not ELIDE_CODE.  */
+ 
+ #ifdef TEST
+ 
+ #include <stdio.h>
+ 
+ int
+ main (argc, argv)
+      int argc;
+      char **argv;
+ {
+   int c;
+   int digit_optind = 0;
+ 
+   while (1)
+     {
+       int this_option_optind = optind ? optind : 1;
+       int option_index = 0;
+       static struct option long_options[] =
+       {
+        {"add", 1, 0, 0},
+        {"append", 0, 0, 0},
+        {"delete", 1, 0, 0},
+        {"verbose", 0, 0, 0},
+        {"create", 0, 0, 0},
+        {"file", 1, 0, 0},
+        {0, 0, 0, 0}
+       };
+ 
+       c = getopt_long (argc, argv, "abc:d:0123456789",
+                       long_options, &option_index);
+       if (c == -1)
+        break;
+ 
+       switch (c)
+        {
+        case 0:
+          printf ("option %s", long_options[option_index].name);
+          if (optarg)
+            printf (" with arg %s", optarg);
+          printf ("\n");
+          break;
+ 
+        case '0':
+        case '1':
+        case '2':
+        case '3':
+        case '4':
+        case '5':
+        case '6':
+        case '7':
+        case '8':
+        case '9':
+          if (digit_optind != 0 && digit_optind != this_option_optind)
+            printf ("digits occur in two different argv-elements.\n");
+          digit_optind = this_option_optind;
+          printf ("option %c\n", c);
+          break;
+ 
+        case 'a':
+          printf ("option a\n");
+          break;
+ 
+        case 'b':
+          printf ("option b\n");
+          break;
+ 
+        case 'c':
+          printf ("option c with value `%s'\n", optarg);
+          break;
+ 
+        case 'd':
+          printf ("option d with value `%s'\n", optarg);
+          break;
+ 
+        case '?':
+          break;
+ 
+        default:
+          printf ("?? getopt returned character code 0%o ??\n", c);
+        }
+     }
+ 
+   if (optind < argc)
+     {
+       printf ("non-option ARGV-elements: ");
+       while (optind < argc)
+        printf ("%s ", argv[optind++]);
+       printf ("\n");
+     }
+ 
+   exit (0);
+ }
+ 
+ #endif /* TEST */


ossp-pkg/getopt/getopt_main.c -> 1.1

*** /dev/null    Mon Apr 29 14:45:17 2024
--- -    Mon Apr 29 14:50:02 2024
***************
*** 0 ****
--- 1,469 ----
+ /*
+     getopt.c - Enhanced implementation of BSD getopt(1)
+     Copyright (c) 1997, 1998, 1999, 2000  Frodo Looijaard <frodol@dds.nl>
+ 
+     This program is free software; you can redistribute it and/or modify
+     it under the terms of the GNU General Public License as published by
+     the Free Software Foundation; either version 2 of the License, or
+     (at your option) any later version.
+ 
+     This program is distributed in the hope that it will be useful,
+     but WITHOUT ANY WARRANTY; without even the implied warranty of
+     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+     GNU General Public License for more details.
+ 
+     You should have received a copy of the GNU General Public License
+     along with this program; if not, write to the Free Software
+     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+ 
+ /* 
+  * Version 1.0-b4: Tue Sep 23 1997. First public release.
+  * Version 1.0: Wed Nov 19 1997. 
+  *   Bumped up the version number to 1.0
+  *   Fixed minor typo (CSH instead of TCSH)
+  * Version 1.0.1: Tue Jun 3 1998
+  *   Fixed sizeof instead of strlen bug
+  *   Bumped up the version number to 1.0.1
+  * Version 1.0.2: Thu Jun 11 1998 (not present)
+  *   Fixed gcc-2.8.1 warnings
+  *   Fixed --version/-V option (not present)
+  * Version 1.0.5: Tue Jun 22 1999
+  *   Make -u option work (not present)
+  * Version 1.0.6: Tue Jun 27 2000
+  *   No important changes
+  * Version 1.1.0: Tue Jun 30 2000
+  *   Added NLS support (partly written by Arkadiusz Mi<B6>kiewicz 
+  *     <misiek@pld.org.pl>)
+  */
+ 
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <string.h>
+ #include <unistd.h>
+ #include <ctype.h>
+ 
+ #if LIBCGETOPT
+ #include <getopt.h>
+ #else
+ #include "getopt.h"
+ #endif
+ 
+ #define WITHOUT_GETTEXT 1
+ #define _(x) x
+ 
+ /* NON_OPT is the code that is returned when a non-option is found in '+' 
+    mode */
+ #define NON_OPT 1
+ /* LONG_OPT is the code that is returned when a long option is found. */
+ #define LONG_OPT 2
+ 
+ /* The shells recognized. */
+ typedef enum {BASH,TCSH} shell_t;
+ 
+ 
+ /* Some global variables that tells us how to parse. */
+ shell_t shell=BASH; /* The shell we generate output for. */
+ int quiet_errors=0; /* 0 is not quiet. */
+ int quiet_output=0; /* 0 is not quiet. */
+ int quote=1; /* 1 is do quote. */
+ int alternative=0; /* 0 is getopt_long, 1 is getopt_long_only */
+ 
+ /* Function prototypes */
+ void *our_malloc(size_t size);
+ void *our_realloc(void *ptr, size_t size);
+ const char *normalize(const char *arg);
+ int generate_output(char * argv[],int argc,const char *optstr,
+                     const struct option *longopts);
+ int main(int argc, char *argv[]);
+ void parse_error(const char *message);
+ void add_long_options(char *options);
+ void add_longopt(const char *name,int has_arg);
+ void print_help(void);
+ void set_shell(const char *new_shell);
+ void set_initial_shell(void);
+ 
+ void *our_malloc(size_t size)
+ {
+        void *ret=malloc(size);
+        if (! ret) {
+                fprintf(stderr,_("%s: Out of memory!\n"),"getopt");
+                exit(3);
+        }
+        return(ret);
+ }
+ 
+ void *our_realloc(void *ptr, size_t size)
+ {
+        void *ret=realloc(ptr,size);
+        if (! ret && size) {
+                fprintf(stderr,_("%s: Out of memory!\n"),"getopt");
+                exit(3);
+        }
+        return(ret);
+ }
+ 
+ /*
+  * This function 'normalizes' a single argument: it puts single quotes around
+  * it and escapes other special characters. If quote is false, it just
+  * returns its argument.
+  * Bash only needs special treatment for single quotes; tcsh also recognizes
+  * exclamation marks within single quotes, and nukes whitespace.
+  * This function returns a pointer to a buffer that is overwritten by 
+  * each call.
+  */
+ const char *normalize(const char *arg)
+ {
+        static char *BUFFER=NULL;
+        const char *argptr=arg;
+        char *bufptr;
+ 
+        if (BUFFER != NULL)
+                free(BUFFER);
+ 
+        if (!quote) { /* Just copy arg */
+                BUFFER=our_malloc(strlen(arg)+1);
+                        
+                strcpy(BUFFER,arg);
+                return BUFFER;
+        }
+ 
+        /* Each character in arg may take upto four characters in the result:
+           For a quote we need a closing quote, a backslash, a quote and an
+           opening quote! We need also the global opening and closing quote,
+           and one extra character for '\0'. */
+        BUFFER=our_malloc(strlen(arg)*4+3);
+ 
+        bufptr=BUFFER;
+        *bufptr++='\'';
+ 
+        while (*argptr) {
+                if (*argptr == '\'') {
+                        /* Quote: replace it with: '\'' */
+                        *bufptr++='\'';
+                        *bufptr++='\\';
+                        *bufptr++='\'';
+                        *bufptr++='\'';
+                } else if (shell==TCSH && *argptr=='!') {
+                        /* Exclamation mark: replace it with: \! */
+                        *bufptr++='\'';
+                        *bufptr++='\\';
+                        *bufptr++='!';
+                        *bufptr++='\'';
+                } else if (shell==TCSH && *argptr=='\n') {
+                        /* Newline: replace it with: \n */
+                        *bufptr++='\\';
+                        *bufptr++='n';
+                } else if (shell==TCSH && isspace(*argptr)) {
+                        /* Non-newline whitespace: replace it with \<ws> */
+                        *bufptr++='\'';
+                        *bufptr++='\\';
+                        *bufptr++=*argptr;
+                        *bufptr++='\'';
+                } else
+                        /* Just copy */
+                        *bufptr++=*argptr;
+                argptr++;
+        }
+        *bufptr++='\'';
+        *bufptr++='\0';
+        return BUFFER;
+ }
+ 
+ /* 
+  * Generate the output. argv[0] is the program name (used for reporting errors).
+  * argv[1..] contains the options to be parsed. argc must be the number of
+  * elements in argv (ie. 1 if there are no options, only the program name),
+  * optstr must contain the short options, and longopts the long options.
+  * Other settings are found in global variables.
+  */
+ int generate_output(char * argv[],int argc,const char *optstr,
+                     const struct option *longopts)
+ {
+        int exit_code = 0; /* We assume everything will be OK */
+        int opt;
+        int longindex;
+        const char *charptr;
+ 
+        if (quiet_errors) /* No error reporting from getopt(3) */
+                opterr=0;
+        optind=0; /* Reset getopt(3) */
+ 
+        while ((opt = (alternative?
+                      getopt_long_only(argc,argv,optstr,longopts,&longindex):
+                      getopt_long(argc,argv,optstr,longopts,&longindex))) 
+                != EOF) 
+                if (opt == '?' || opt == ':' )
+                        exit_code = 1;
+                else if (!quiet_output) 
+                {
+                        if (opt == LONG_OPT) {
+                                printf(" --%s",longopts[longindex].name);
+                                if (longopts[longindex].has_arg) 
+                                        printf(" %s",
+                                               normalize(optarg?optarg:""));
+                        } else if (opt == NON_OPT) 
+                                printf(" %s",normalize(optarg)); 
+                        else {
+                                printf(" -%c",opt);
+                                charptr = strchr(optstr,opt);
+                                if (charptr != NULL && *++charptr == ':')
+                                        printf(" %s",
+                                               normalize(optarg?optarg:""));
+                        }
+                }
+        
+        if (! quiet_output) {
+                printf(" --");
+                while (optind < argc) 
+                        printf(" %s",normalize(argv[optind++]));
+                printf("\n");
+        }
+        return exit_code;
+ }
+ 
+ /*
+  * Report an error when parsing getopt's own arguments.
+  * If message is NULL, we already sent a message, we just exit with a helpful
+  * hint.
+  */
+ void parse_error(const char *message)
+ {
+        if (message)
+                fprintf(stderr,"getopt: %s\n",message);
+        fputs(_("Try `getopt --help' for more information.\n"),stderr);
+        exit(2);
+ }
+ 
+ static struct option *long_options=NULL;
+ static int long_options_length=0; /* Length of array */
+ static int long_options_nr=0; /* Nr of used elements in array */
+ #define LONG_OPTIONS_INCR 10
+ #define init_longopt() add_longopt(NULL,0)
+ 
+ /* Register a long option. The contents of name is copied. */
+ void add_longopt(const char *name,int has_arg)
+ {
+        char *tmp;
+        if (!name) { /* init */
+                free(long_options);
+                long_options=NULL;
+                long_options_length=0;
+                long_options_nr=0;
+        }
+ 
+        if (long_options_nr == long_options_length) {
+                long_options_length += LONG_OPTIONS_INCR;
+                long_options=our_realloc(long_options,
+                                         sizeof(struct option) * 
+                                           long_options_length);
+        }
+ 
+        long_options[long_options_nr].name=NULL;
+        long_options[long_options_nr].has_arg=0;
+        long_options[long_options_nr].flag=NULL;
+        long_options[long_options_nr].val=0;
+ 
+        if (long_options_nr) { /* Not for init! */
+                long_options[long_options_nr-1].has_arg=has_arg;
+                long_options[long_options_nr-1].flag=NULL;
+                long_options[long_options_nr-1].val=LONG_OPT;
+                tmp = our_malloc(strlen(name)+1);
+                strcpy(tmp,name);
+                long_options[long_options_nr-1].name=tmp;
+        }
+        long_options_nr++;
+ }
+        
+ 
+ /* 
+  * Register several long options. options is a string of long options, 
+  * separated by commas or whitespace. 
+  * This nukes options! 
+  */
+ void add_long_options(char *options)
+ {
+        int arg_opt;
+        char *tokptr=strtok(options,", \t\n");
+        while (tokptr) {
+                arg_opt=no_argument;
+                if (strlen(tokptr) > 0) {
+                        if (tokptr[strlen(tokptr)-1] == ':') {
+                                if (tokptr[strlen(tokptr)-2] == ':') {
+                                        tokptr[strlen(tokptr)-2]='\0';
+                                        arg_opt=optional_argument;
+                                } else {
+                                        tokptr[strlen(tokptr)-1]='\0';
+                                        arg_opt=required_argument;
+                                }
+                                if (strlen(tokptr) == 0)
+                                        parse_error(_("empty long option after "
+                                                      "-l or --long argument"));
+                        }
+                        add_longopt(tokptr,arg_opt);
+                }
+                tokptr=strtok(NULL,", \t\n");
+        }
+ }
+ 
+ void set_shell(const char *new_shell)
+ {
+        if (!strcmp(new_shell,"bash"))
+                shell=BASH;
+        else if (!strcmp(new_shell,"tcsh"))
+                shell=TCSH;
+        else if (!strcmp(new_shell,"sh"))
+                shell=BASH;
+        else if (!strcmp(new_shell,"csh"))
+                shell=TCSH;
+        else
+                parse_error(_("unknown shell after -s or --shell argument"));
+ }
+ 
+ void print_help(void)
+ {
+        fputs(_("Usage: getopt optstring parameters\n"),stderr);
+        fputs(_("       getopt [options] [--] optstring parameters\n"),stderr);
+        fputs(_("       getopt [options] -o|--options optstring [options] [--]\n"),stderr);
+        fputs(_("              parameters\n"),stderr);
+        fputs(_("  -a, --alternative            Allow long options starting with single -\n"),stderr);
+        fputs(_("  -h, --help                   This small usage guide\n"),stderr);
+        fputs(_("  -l, --longoptions=longopts   Long options to be recognized\n"),stderr);
+        fputs(_("  -n, --name=progname          The name under which errors are reported\n"),stderr);
+        fputs(_("  -o, --options=optstring      Short options to be recognized\n"),stderr);
+        fputs(_("  -q, --quiet                  Disable error reporting by getopt(3)\n"),stderr);
+        fputs(_("  -Q, --quiet-output           No normal output\n"),stderr);
+        fputs(_("  -s, --shell=shell            Set shell quoting conventions\n"),stderr);      
+        fputs(_("  -T, --test                   Test for getopt(1) version\n"),stderr);
+        fputs(_("  -u, --unqote                 Do not quote the output\n"),stderr);
+        fputs(_("  -V, --version                Output version information\n"),stderr);
+        exit(2);
+ }
+        
+ /* Exit codes:
+  *   0) No errors, succesful operation.
+  *   1) getopt(3) returned an error.
+  *   2) A problem with parameter parsing for getopt(1).
+  *   3) Internal error, out of memory
+  *   4) Returned for -T
+  */
+ 
+ static struct option longopts[]={ {"options",required_argument,NULL,'o'},
+                                   {"longoptions",required_argument,NULL,'l'},
+                                   {"quiet",no_argument,NULL,'q'},
+                                   {"quiet-output",no_argument,NULL,'Q'},
+                                   {"shell",required_argument,NULL,'s'},
+                                   {"test",no_argument,NULL,'T'},
+                                   {"unquoted",no_argument,NULL,'u'},
+                                   {"help",no_argument,NULL,'h'},
+                                   {"alternative",no_argument,NULL,'a'},
+                                   {"name",required_argument,NULL,'n'},
+                                   {"version",no_argument,NULL,'V'},
+                                   {NULL,0,NULL,0}
+                                 };
+ 
+ /* Stop scanning as soon as a non-option argument is found! */
+ static const char *shortopts="+ao:l:n:qQs:TuhV";
+ 
+ int main(int argc, char *argv[])
+ {
+        char *optstr=NULL;
+        char *name=NULL;
+        int opt;
+        int compatible=0;
+ 
+ #if WITHOUT_GETTEXT
+ #else
+        setlocale(LC_ALL,"");
+        bindtextdomain(PACKAGE, LOCALEDIR);
+        textdomain(PACKAGE);
+ #endif
+ 
+        init_longopt();
+ 
+        if (getenv("GETOPT_COMPATIBLE")) 
+                compatible=1;
+ 
+        if (argc == 1) 
+        {
+                if (compatible) {
+                        /* For some reason, the original getopt gave no error
+                            when there were no arguments. */
+                        printf(" --\n");
+                        exit(0);
+                }
+                else
+                        parse_error(_("missing optstring argument"));
+        }
+        
+        if (argv[1][0] != '-' || compatible) {
+                quote=0;
+                optstr=our_malloc(strlen(argv[1])+1);
+                strcpy(optstr,argv[1]+strspn(argv[1],"-+"));
+                argv[1]=argv[0];
+                exit(generate_output(argv+1,argc-1,optstr,long_options));
+        }
+        
+        while ((opt=getopt_long(argc,argv,shortopts,longopts,NULL)) != EOF) 
+                switch (opt) {
+                case 'a':
+                        alternative=1;
+                        break;
+                case 'h':
+                        print_help();
+                        exit(0);
+                case 'o':
+                        if (optstr)
+                                free(optstr);
+                        optstr=our_malloc(strlen(optarg)+1);
+                        strcpy(optstr,optarg);
+                        break;
+                case 'l':
+                        add_long_options(optarg);
+                        break;
+                case 'n':
+                        if (name)
+                                free(name);
+                        name=our_malloc(strlen(optarg)+1);
+                        strcpy(name,optarg);
+                        break;
+                case 'q':
+                        quiet_errors=1;
+                        break;
+                case 'Q':
+                        quiet_output=1;
+                        break;
+                case 's':
+                        set_shell(optarg);
+                        break;
+                case 'T':
+                        exit(4);
+                case 'u':
+                        quote=0;
+                        break;
+                case 'V':
+                        printf(_("getopt (enhanced) 1.1.3\n"));
+                        exit(0);
+                case '?':
+                case ':':
+                        parse_error(NULL);
+                default:
+                        parse_error(_("internal error, contact the author."));
+                }
+        
+        if (!optstr) 
+        {
+                if (optind >= argc)
+                        parse_error(_("missing optstring argument"));
+                else {
+                        optstr=our_malloc(strlen(argv[optind])+1);
+                        strcpy(optstr,argv[optind]);
+                        optind++;
+                }
+        }
+        if (name)
+                argv[optind-1]=name;
+        else
+                argv[optind-1]=argv[0];
+        exit(generate_output(argv+optind-1,argc-optind+1,optstr,long_options));
+ }


ossp-pkg/getopt/getopt_test.c -> 1.1

*** /dev/null    Mon Apr 29 14:45:17 2024
--- -    Mon Apr 29 14:50:02 2024
***************
*** 0 ****
--- 1,77 ----
+ 
+ #include "getopt.h"
+ #include <stdio.h>
+ #include <string.h>
+ #include <unistd.h>
+ 
+ int
+ main (int argc, char **argv)
+ {
+   static const struct option options[] =
+     {
+       {"required", required_argument, NULL, 'r'},
+       {"optional", optional_argument, NULL, 'o'},
+       {"none",     no_argument,       NULL, 'n'},
+       {"color",    no_argument,       NULL, 'C'},
+       {"colour",   no_argument,       NULL, 'C'},
+       {NULL,       0,                 NULL, 0 }
+     };
+ 
+   int aflag = 0;
+   int bflag = 0;
+   char *cvalue = NULL;
+   int Cflag = 0;
+   int nflag = 0;
+   int index;
+   int c;
+   int result = 0;
+ 
+   while ((c = getopt_long (argc, argv, "abc:", options, NULL)) >= 0)
+     switch (c)
+       {
+       case 'a':
+        aflag = 1;
+        break;
+       case 'b':
+        bflag = 1;
+        break;
+       case 'c':
+        cvalue = optarg;
+        break;
+       case 'C':
+        ++Cflag;
+        break;
+       case '?':
+        fputs ("Unknown option.\n", stderr);
+        return 1;
+       default:
+        fprintf (stderr, "This should never happen!\n");
+        return 1;
+ 
+       case 'r':
+        printf ("--required %s\n", optarg);
+        result |= strcmp (optarg, "foobar") != 0;
+        break;
+       case 'o':
+        printf ("--optional %s\n", optarg);
+        result |= optarg == NULL || strcmp (optarg, "bazbug") != 0;
+        break;
+       case 'n':
+        puts ("--none");
+        nflag = 1;
+        break;
+       }
+ 
+   printf ("aflag = %d, bflag = %d, cvalue = %s, Cflags = %d, nflag = %d\n",
+          aflag, bflag, cvalue, Cflag, nflag);
+ 
+   result |= (aflag != 1 || bflag != 1 || cvalue == NULL
+             || strcmp (cvalue, "foobar") != 0 || Cflag != 3 || nflag != 1);
+ 
+   for (index = optind; index < argc; index++)
+     printf ("Non-option argument %s\n", argv[index]);
+ 
+   result |= optind + 1 != argc || strcmp (argv[optind], "random") != 0;
+ 
+   return result;
+ }

CVSTrac 2.0.1