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