18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#---------------------------------------------------------------------
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpackage Getopt::Mixed;
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# Copyright 1995 Christopher J. Madsen
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# Author: Christopher J. Madsen <ac608@yfn.ysu.edu>
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# Created: 1 Jan 1995
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# Version: $Revision: 1.8 $ ($Date: 1996/02/09 00:05:00 $)
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#    Note that RCS revision 1.23 => $Getopt::Mixed::VERSION = "1.023"
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# This program is free software; you can redistribute it and/or modify
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# it under the terms of the GNU General Public License as published by
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# the Free Software Foundation; either version 2, or (at your option)
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# any later version.
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# This program is distributed in the hope that it will be useful,
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# but WITHOUT ANY WARRANTY; without even the implied warranty of
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# GNU General Public License for more details.
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# You should have received a copy of the GNU General Public License
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# along with Perl; see the file COPYING.  If not, write to the
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# Process both single-character and extended options
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#---------------------------------------------------------------------
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectrequire 5.000;
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectuse Carp;
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectrequire Exporter;
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@ISA = qw(Exporter);
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@EXPORT = ();
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@EXPORT_OK = qw(abortMsg getOptions nextOption);
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#=====================================================================
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# Package Global Variables:
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectBEGIN
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    # The permissible settings for $order:
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    $REQUIRE_ORDER   = 0;
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    $PERMUTE         = 1;
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    $RETURN_IN_ORDER = 2;
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    # Regular expressions:
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    $intRegexp   = '^[-+]?\d+$';               # Match an integer
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    $floatRegexp = '^[-+]?(\d*\.?\d+|\d+\.)$'; # Match a real number
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    $typeChars   = 'sif';                      # Match type characters
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    # Convert RCS revision number (must be main branch) to d.ddd format:
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ' $Revision: 1.8 $ ' =~ / (\d+)\.(\d{1,3}) /
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        or die "Invalid version number";
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    $VERSION = sprintf("%d.%03d",$1,$2);
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} # end BEGIN
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#=====================================================================
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# Subroutines:
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#---------------------------------------------------------------------
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# Initialize the option processor:
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# You should set any customization variables *after* calling init.
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# For a description of option declarations, see the documentation at
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# the end of this file.
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# Input:
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#   List of option declarations (separated by whitespace)
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#     If the first argument is entirely non-alphanumeric characters
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#     with no whitespace, it is the characters that start options.
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsub init
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    undef %options;
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my($opt,$type);
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    $ignoreCase  = 1;           # Ignore case by default
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    $optionStart = "-";         # Dash is the default option starter
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    # If the first argument is entirely non-alphanumeric characters
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    # with no whitespace, it is the desired value for $optionStart:
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    $optionStart = shift @_ if $_[0] =~ /^[^a-z0-9\s]+$/i;
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    foreach $group (@_) {
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        # Ignore case unless there are upper-case options:
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        $ignoreCase = 0 if $group =~ /[A-Z]/;
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        foreach $option (split(/\s+/,$group)) {
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            croak "Invalid option declaration `$option'"
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                unless $option =~ /^([^=:>]+)([=:][$typeChars]|>[^=:>]+)?$/o;
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            $opt  = $1;
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            $type = $2 || "";
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if ($type =~ /^>(.*)$/) {
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                $type = $1;
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                croak "Invalid synonym `$option'"
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (not defined $options{$type}
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        or $options{$type} =~ /^[^:=]/);
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } # end if synonym
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            $options{$opt} = $type;
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } # end foreach option
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } # end foreach group
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    # Handle POSIX compliancy:
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (defined $ENV{"POSIXLY_CORRECT"}) {
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        $order = $REQUIRE_ORDER;
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        $order = $PERMUTE;
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    $optionEnd = 0;
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    $badOption = \&badOption;
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    $checkArg  = \&checkArg;
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} # end init
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#---------------------------------------------------------------------
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# Clean up when we're done:
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# This just releases the memory used by the %options hash.
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# If 'help' was defined as an option, a new hash with just 'help' is
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# created, in case the program calls abortMsg.
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsub cleanup
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $help = defined($options{'help'});
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    undef %options;
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    $options{'help'} = "" if $help;
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} # end cleanup
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#---------------------------------------------------------------------
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# Abort program with message:
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# Prints program name and arguments to STDERR
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# If --help is an option, prints message saying 'Try --help'
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# Exits with code 1
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsub abortMsg
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $name = $0;
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    $name =~ s|^.+[\\/]||;      # Remove any directories from name
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    print STDERR $name,": ",@_,"\n";
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    print STDERR "Try `$name --help' for more information.\n"
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if defined $options{"help"};
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    exit 1;
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} # end abortMsg
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#---------------------------------------------------------------------
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# Standard function for handling bad options:
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# Prints an error message and exits.
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# You can override this by setting $Getopt::Mixed::badOption to a
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# function reference.
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# Input:
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#   Index into @ARGV
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#   The option that caused the error
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#   An optional string describing the problem
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#     Currently, this can be
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#       undef        The option was not recognized
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#       'ambiguous'  The option could match several long options
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# Note:
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#   The option has already been removed from @ARGV.  To put it back,
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#   you can say:
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#     splice(@ARGV,$_[0],0,$_[1]);
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#   If your function returns, it should return whatever you want
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#   nextOption to return.
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsub badOption
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my ($index, $option, $problem) = @_;
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    $problem = 'unrecognized' unless $problem;
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    abortMsg("$problem option `$option'");
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} # end badOption
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#---------------------------------------------------------------------
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# Make sure we have the proper argument for this option:
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# You can override this by setting $Getopt::Mixed::checkArg to a
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# function reference.
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# Input:
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#   $i:       Position of argument in @ARGV
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#   $value:   The text appended to the option (undef if no text)
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#   $option:  The pretty name of the option (as the user typed it)
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#   $type:    The type of the option
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# Returns:
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#   The value of the option's argument
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsub checkArg
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my ($i,$value,$option,$type) = @_;
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    abortMsg("option `$option' does not take an argument")
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (not $type and defined $value);
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ($type =~ /^=/) {
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        # An argument is required for this option:
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        $value = splice(@ARGV,$i,1) unless defined $value;
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        abortMsg("option `$option' requires an argument")
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            unless defined $value;
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ($type =~ /i$/) {
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        abortMsg("option `$option' requires integer argument")
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (defined $value and $value !~ /$intRegexp/o);
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    elsif ($type =~ /f$/) {
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        abortMsg("option `$option' requires numeric argument")
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (defined $value and $value !~ /$floatRegexp/o);
2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    elsif ($type =~ /^[=:]/ and ref($checkType)) {
2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        $value = &$checkType($i,$value,$option,$type);
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    $value = "" if not defined $value and $type =~ /^:/;
2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    $value;
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} # end checkArg
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#---------------------------------------------------------------------
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# Find a match for an incomplete long option:
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#
2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# Input:
2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#   The option text to match
2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#
2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# Returns:
2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#   The option that matched, or
2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#   undef, if no option matched, or
2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#   (undef, 'ambiguous'), if multiple options matched
2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsub findMatch
2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $opt = shift;
2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    $opt =~ s/-/[^-]*-/g;
2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    $opt .= ".*";
2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my @matches = grep(/^$opt$/, keys %options);
2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return undef       if $#matches <  0;
2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return $matches[0] if $#matches == 0;
2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    $opt = $matches[0];
2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    $opt = $options{$opt} if $options{$opt} =~ /^[^=:]/;
2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    foreach (@matches) {
2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return (undef, 'ambiguous')
2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            unless $_ eq $opt or $options{$_} eq $opt;
2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    $opt;
2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} # end findMatch
2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#---------------------------------------------------------------------
2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# Return the next option:
2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#
2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# Returns a list of 3 elements:  (OPTION, VALUE, PRETTYNAME), where
2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#   OPTION is the name of the option,
2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#   VALUE is its argument, and
2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#   PRETTYNAME is the option as the user entered it.
2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# Returns the null list if there are no more options to process
2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#
2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# If $order is $RETURN_IN_ORDER, and this is a normal argument (not an
2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# option), OPTION will be the null string, VALUE will be the argument,
2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# and PRETTYNAME will be undefined.
2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsub nextOption
2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return () if $#ARGV < 0;    # No more arguments
2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ($optionEnd) {
2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        # We aren't processing any more options:
2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return ("", shift @ARGV) if $order == $RETURN_IN_ORDER;
2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return ();
2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    # Find the next option:
2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $i = 0;
2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (length($ARGV[$i]) < 2 or
2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           index($optionStart,substr($ARGV[$i],0,1)) < 0) {
2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return ()                if $order == $REQUIRE_ORDER;
2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return ("", shift @ARGV) if $order == $RETURN_IN_ORDER;
2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ++$i;
2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return () if $i > $#ARGV;
2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } # end while
2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    # Process the option:
2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my($option,$opt,$value,$optType,$prettyOpt);
2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    $option = $ARGV[$i];
2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (substr($option,0,1) eq substr($option,1,1)) {
2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        # If the option start character is repeated, it's a long option:
2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        splice @ARGV,$i,1;
2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (length($option) == 2) {
2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            # A double dash by itself marks the end of the options:
3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            $optionEnd = 1;     # Don't process any more options
3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return nextOption();
3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } # end if bare double dash
3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        $opt = substr($option,2);
3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ($opt =~ /^([^=]+)=(.*)$/) {
3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            $opt = $1;
3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            $value = $2;
3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } # end if option is followed by value
3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        $opt =~ tr/A-Z/a-z/ if $ignoreCase;
3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        $prettyOpt = substr($option,0,2) . $opt;
3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        my $problem;
3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ($opt, $problem) = findMatch($opt)
3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            unless defined $options{$opt} and length($opt) > 1;
3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return &$badOption($i,$option,$problem) unless $opt;
3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        $optType = $options{$opt};
3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ($optType =~ /^[^:=]/) {
3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            $opt = $optType;
3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            $optType = $options{$opt};
3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        $value = &$checkArg($i,$value,$prettyOpt,$optType);
3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } # end if long option
3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else {
3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        # It's a short option:
3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        $opt = substr($option,1,1);
3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        $opt =~ tr/A-Z/a-z/ if $ignoreCase;
3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return &$badOption($i,$option) unless defined $options{$opt};
3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        $optType = $options{$opt};
3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ($optType =~ /^[^:=]/) {
3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            $opt = $optType;
3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            $optType = $options{$opt};
3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (length($option) == 2 or $optType) {
3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            # This is the last option in the group, so remove the group:
3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            splice(@ARGV,$i,1);
3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            # Just remove this option from the group:
3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            substr($ARGV[$i],1,1) = "";
3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ($optType) {
3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            $value = (length($option) > 2) ? substr($option,2) : undef;
3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            $value =~ s/^=// if $value; # Allow either -d3 or -d=3
3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } # end if option takes an argument
3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        $prettyOpt = substr($option,0,2);
3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        $value = &$checkArg($i,$value,$prettyOpt,$optType);
3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } # end else short option
3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ($opt,$value,$prettyOpt);
3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} # end nextOption
3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#---------------------------------------------------------------------
3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# Get options:
3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#
3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# Input:
3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#   The same as for init()
3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#   If no parameters are supplied, init() is NOT called.  This allows
3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#   you to call init() yourself and then change the configuration
3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#   variables.
3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#
3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# Output Variables:
3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#   Sets $opt_X for each `-X' option encountered.
3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#
3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#   Note that if --apple is a synonym for -a, then --apple will cause
3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#   $opt_a to be set, not $opt_apple.
3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsub getOptions
3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    &init if $#_ >= 0;        # Pass arguments (if any) on to init
3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    # If you want to use $RETURN_IN_ORDER, you have to call
3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    # nextOption yourself; getOptions doesn't support it:
3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    $order = $PERMUTE if $order == $RETURN_IN_ORDER;
3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my ($option,$value,$package);
3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    $package = (caller)[0];
3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (($option, $value) = nextOption()) {
3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        $option =~ s/\W/_/g;    # Make a legal Perl identifier
3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        $value = 1 unless defined $value;
3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        eval("\$" . $package . '::opt_' . $option . ' = $value;');
3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } # end while
3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cleanup();
3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} # end getOptions
3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#=====================================================================
3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# Package return value:
3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project$VERSION;
3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project__END__
3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project=head1 NAME
3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectGetopt::Mixed - getopt processing with both long and short options
3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project=head1 SYNOPSIS
3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    use Getopt::Mixed;
3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Getopt::Mixed::getOptions(...option-descriptions...);
3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ...examine $opt_* variables...
4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projector
4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    use Getopt::Mixed "nextOption";
4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Getopt::Mixed::init(...option-descriptions...);
4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (($option, $value) = nextOption()) {
4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ...process option...
4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Getopt::Mixed::cleanup();
4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project=head1 DESCRIPTION
4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectThis package is my response to the standard modules Getopt::Std and
4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectGetopt::Long.  C<Std> doesn't support long options, and C<Long>
4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectdoesn't support short options.  I wanted both, since long options are
4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projecteasier to remember and short options are faster to type.
4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectThis package is intended to be the "Getopt-to-end-all-Getop's".  It
4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectcombines (I hope) flexibility and simplicity.  It supports both short
4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectoptions (introduced by C<->) and long options (introduced by C<-->).
4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectShort options which do not take an argument can be grouped together.
4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectShort options which do take an argument must be the last option in
4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projecttheir group, because everything following the option will be
4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconsidered to be its argument.
4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectThere are two methods for using Getopt::Mixed:  the simple method and
4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectthe flexible method.  Both methods use the same format for option
4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectdescriptions.
4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project=head2 Option Descriptions
4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectThe option-description arguments required by C<init> and C<getOptions>
4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectare strings composed of individual option descriptions.  Several
4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectoption descriptions can appear in the same string if they are
4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectseparated by whitespace.
4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectEach description consists of the option name and an optional trailing
4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectargument specifier.  Option names may consist of any characters but
4388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectwhitespace, C<=>, C<:>, and C<E<gt>>.
4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectValues for argument specifiers are:
4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  <none>   option does not take an argument
4438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  =s :s    option takes a mandatory (=) or optional (:) string argument
4448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  =i :i    option takes a mandatory (=) or optional (:) integer argument
4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  =f :f    option takes a mandatory (=) or optional (:) real number argument
4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  >new     option is a synonym for option `new'
4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectThe C<E<gt>> specifier is not really an argument specifier.  It
4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectdefines an option as being a synonym for another option.  For example,
4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project"a=i apples>a" would define B<-a> as an option that requires an
4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectinteger argument and B<--apples> as a synonym for B<-a>.  Only one
4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectlevel of synonyms is supported, and the root option must be listed
4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfirst.  For example, "apples>a a=i" and "a=i apples>a oranges>apples"
4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectare illegal; use "a=i apples>a oranges>a" if that's what you want.
4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFor example, in the option description:
4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project     "a b=i c:s apple baker>b charlie:s"
4588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         -a and --apple do not take arguments
4598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         -b takes a mandatory integer argument
4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         --baker is a synonym for -b
4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         -c and --charlie take an optional string argument
4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectIf the first argument to C<init> or C<getOptions> is entirely
4648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnon-alphanumeric characters with no whitespace, it represents the
4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectcharacters which can begin options.
4668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project=head2 User Interface
4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFrom the user's perspective, short options are introduced by a dash
4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project(C<->) and long options are introduced by a double dash (C<-->).
4718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectShort options may be combined ("-a -b" can be written "-ab"), but an
4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectoption that takes an argument must be the last one in its group,
4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbecause anything following it is considered part of the argument.  A
4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectdouble dash by itself marks the end of the options; all arguments
4758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfollowing it are treated as normal arguments, not options.  A single
4768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectdash by itself is treated as a normal argument, I<not> an option.
4778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectLong options may be abbreviated.  An option B<--all-the-time> could be
4798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectabbreviated B<--all>, B<--a--tim>, or even B<--a>.  Note that B<--time>
4808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectwould not work; the abbreviation must start at the beginning of the
4818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectoption name.  If an abbreviation is ambiguous, an error message will
4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbe printed.
4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectIn the following examples, B<-i> and B<--int> take integer arguments,
4858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectB<-f> and B<--float> take floating point arguments, and B<-s> and
4868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectB<--string> take string arguments.  All other options do not take an
4878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectargument.
4888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  -i24            -f24.5               -sHello
4908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  -i=24 --int=-27 -f=24.5 --float=0.27 -s=Hello --string=Hello
4918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectIf the argument is required, it can also be separated by whitespace:
4938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  -i 24 --int -27 -f 24.5 --float 0.27 -s Hello --string Hello
4958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNote that if the option is followed by C<=>, whatever follows the C<=>
4978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectI<is> the argument, even if it's the null string.  In the example
4988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  -i= 24 -f= 24.5 -s= Hello
5008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectB<-i> and B<-f> will cause an error, because the null string is not a
5028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnumber, but B<-s> is perfectly legal; its argument is the null string,
5038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnot "Hello".
5048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRemember that optional arguments I<cannot> be separated from the
5068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectoption by whitespace.
5078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project=head2 The Simple Method
5098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectThe simple method is
5118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    use Getopt::Mixed;
5138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Getopt::Mixed::getOptions(...option-descriptions...);
5148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectYou then examine the C<$opt_*> variables to find out what options were
5168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectspecified and the C<@ARGV> array to see what arguments are left.
5178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectIf B<-a> is an option that doesn't take an argument, then C<$opt_a>
5198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectwill be set to 1 if the option is present, or left undefined if the
5208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectoption is not present.
5218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectIf B<-b> is an option that takes an argument, then C<$opt_b> will be
5238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectset to the value of the argument if the option is present, or left
5248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectundefined if the option is not present.  If the argument is optional
5258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbut not supplied, C<$opt_b> will be set to the null string.
5268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNote that even if you specify that an option I<requires> a string
5288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectargument, you can still get the null string (if the user specifically
5298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectenters it).  If the option requires a numeric argument, you will never
5308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectget the null string (because it isn't a number).
5318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectWhen converting the option name to a Perl identifier, any non-word
5338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectcharacters in the name will be converted to underscores (C<_>).
5348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectIf the same option occurs more than once, only the last occurrence
5368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectwill be recorded.  If that's not acceptable, you'll have to use the
5378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectflexible method instead.
5388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project=head2 The Flexible Method
5408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectThe flexible method is
5428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    use Getopt::Mixed "nextOption";
5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Getopt::Mixed::init(...option-descriptions...);
5458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (($option, $value, $pretty) = nextOption()) {
5468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ...process option...
5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Getopt::Mixed::cleanup();
5498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectThis lets you process arguments one at a time.  You can then handle
5518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectrepeated options any way you want to.  It also lets you see option
5528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnames with non-alphanumeric characters without any translation.  This
5538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectis also the only method that lets you find out what order the options
5548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectand other arguments were in.
5558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFirst, you call Getopt::Mixed::init with the option descriptions.
5578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectThen, you keep calling nextOption until it returns an empty list.
5588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFinally, you call Getopt::Mixed::cleanup when you're done.  The
5598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectremaining (non-option) arguments will be found in @ARGV.
5608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectEach call to nextOption returns a list of the next option, its value,
5628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectand the option as the user typed it.  The value will be undefined if
5638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectthe option does not take an argument.  The option is stripped of its
5648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstarter (e.g., you get "a" and "foo", not "-a" or "--foo").  If you
5658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectwant to print an error message, use the third element, which does
5668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectinclude the option starter.
5678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project=head1 OTHER FUNCTIONS
5698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectGetopt::Mixed provides one other function you can use.  C<abortMsg>
5718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprints its arguments on STDERR, plus your program's name and a
5728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnewline.  It then exits with status 1.  For example, if F<foo.pl>
5738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectcalls C<abortMsg> like this:
5748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  Getopt::Mixed::abortMsg("Error");
5768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectThe output will be:
5788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  foo.pl: Error
5808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project=head1 CUSTOMIZATION
5828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectThere are several customization variables you can set.  All of these
5848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvariables should be set I<after> calling Getopt::Mixed::init and
5858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectI<before> calling nextOption.
5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectIf you set any of these variables, you I<must> check the version
5888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnumber first.  The easiest way to do this is like this:
5898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    use Getopt::Mixed 1.006;
5918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectIf you are using the simple method, and you want to set these
5938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvariables, you'll need to call init before calling getOptions, like
5948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectthis:
5958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    use Getopt::Mixed 1.006;
5978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Getopt::Mixed::init(...option-descriptions...);
5988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ...set configuration variables...
5998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Getopt::Mixed::getOptions();      # IMPORTANT: no parameters
6008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project=over 4
6028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project=item $order
6048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project$order can be set to $REQUIRE_ORDER, $PERMUTE, or $RETURN_IN_ORDER.
6068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectThe default is $REQUIRE_ORDER if the environment variable
6078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPOSIXLY_CORRECT has been set, $PERMUTE otherwise.
6088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project$REQUIRE_ORDER means that no options can follow the first argument
6108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectwhich isn't an option.
6118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project$PERMUTE means that all options are treated as if they preceded all
6138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectother arguments.
6148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project$RETURN_IN_ORDER means that all arguments maintain their ordering.
6168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectWhen nextOption is called, and the next argument is not an option, it
6178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectreturns the null string as the option and the argument as the value.
6188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectnextOption never returns the null list until all the arguments have
6198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbeen processed.
6208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project=item $ignoreCase
6228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectIgnore case when matching options.  Default is 1 unless the option
6248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectdescriptions contain an upper-case letter.
6258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project=item $optionStart
6278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectA string of characters that can start options.  Default is "-".
6298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project=item $badOption
6318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectA reference to a function that is called when an unrecognized option
6338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectis encountered.  The function receives three arguments.  $_[0] is the
6348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectposition in @ARGV where the option came from.  $_[1] is the option as
6358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectthe user typed it (including the option start character).  $_[2] is
6368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projecteither undef or a string describing the reason the option was not
6378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectrecognized (Currently, the only possible value is 'ambiguous', for a
6388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectlong option with several possible matches).  The option has already
6398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbeen removed from @ARGV.  To put it back, you can say:
6408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    splice(@ARGV,$_[0],0,$_[1]);
6428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectThe function can do anything you want to @ARGV.  It should return
6448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectwhatever you want nextOption to return.
6458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectThe default is a function that prints an error message and exits the
6478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprogram.
6488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project=item $checkArg
6508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectA reference to a function that is called to make sure the argument
6528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projecttype is correct.  The function receives four arguments.  $_[0] is the
6538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectposition in @ARGV where the option came from.  $_[1] is the text
6548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfollowing the option, or undefined if there was no text following the
6558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectoption.  $_[2] is the name of the option as the user typed it
6568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project(including the option start character), suitable for error messages.
6578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project$_[3] is the argument type specifier.
6588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectThe function can do anything you want to @ARGV.  It should return
6608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectthe value for this option.
6618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectThe default is a function that prints an error message and exits the
6638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprogram if the argument is not the right type for the option.  You can
6648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectalso adjust the behavior of the default function by changing
6658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project$intRegexp or $floatRegexp.
6668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project=item $intRegexp
6688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectA regular expression that matches an integer.  Default is
6708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project'^[-+]?\d+$', which matches a string of digits preceded by an
6718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectoptional sign.  Unlike the other configuration variables, this cannot
6728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbe changed after nextOption is called, because the pattern is compiled
6738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectonly once.
6748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project=item $floatRegexp
6768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectA regular expression that matches a floating point number.  Default is
6788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project'^[-+]?(\d*\.?\d+|\d+\.)$', which matches the following formats:
6798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project"123", "123.", "123.45", and ".123" (plus an optional sign).  It does
6808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnot match exponential notation.  Unlike the other configuration
6818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvariables, this cannot be changed after nextOption is called, because
6828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectthe pattern is compiled only once.
6838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project=item $typeChars
6858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectA string of the characters which are legal argument types.  The
6878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectdefault is 'sif', for String, Integer, and Floating point arguments.
6888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectThe string should consist only of letters.  Upper case letters are
6898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectdiscouraged, since this will hamper the case-folding of options.  If
6908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectyou change this, you should set $checkType to a function that will
6918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectcheck arguments of your new type.  Unlike the other configuration
6928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvariables, this must be set I<before> calling init(), and cannot be
6938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectchanged afterwards.
6948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project=item $checkType
6968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectIf you add new types to $typeChars, you should set this to a function
6988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectwhich will check arguments of the new types.
6998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project=back
7018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project=head1 BUGS
7038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project=over 4
7058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project=item *
7078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectThis document should be expanded.
7098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project=item *
7118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectA long option must be at least two characters long.  Sorry.
7138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project=item *
7158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectThe C<!> argument specifier of Getopt::Long is not supported, but you
7178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectcould have options B<--foo> and B<--nofoo> and then do something like:
7188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    $opt_foo = 0 if $opt_nofoo;
7208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project=item *
7228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectThe C<@> argument specifier of Getopt::Long is not supported.  If you
7248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectwant your values pushed into an array, you'll have to use nextOption
7258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectand do it yourself.
7268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project=back
7288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project=head1 LICENSE
7308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectGetopt::Mixed is distributed under the terms of the GNU General Public
7328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectLicense as published by the Free Software Foundation; either version
7338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project2, or (at your option) any later version.
7348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectThis means it is distributed in the hope that it will be useful, but
7368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectI<without any warranty>; without even the implied warranty of
7378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectI<merchantability> or I<fitness for a particular purpose>.  See the
7388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectGNU General Public License for more details.
7398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSince Perl scripts are only compiled at runtime, and simply calling
7418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectGetopt::Mixed does I<not> bring your program under the GPL, the only
7428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectreal restriction is that you can't use Getopt::Mixed in an
7438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbinary-only distribution produced with C<dump> (unless you also
7448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprovide source code).
7458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project=head1 AUTHOR
7478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectChristopher J. Madsen E<lt>F<ac608@yfn.ysu.edu>E<gt>
7498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectThanks are also due to Andreas Koenig for helping Getopt::Mixed
7518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconform to the standards for Perl modules and for answering a bunch of
7528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectquestions.  Any remaining deficiencies are my fault.
7538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project=cut
755