#

;# getopts.pl - a better getopt.pl

;# Usage:
;#      do Getopts('a:bc');  # -a takes arg. -b & -c not. Sets opt_* as a side
;#                           # effect (opt_questionmark instead of opt_?).

sub Getopts {
    local($argumentative) = @_;
    local(@args,$_,$first,$rest);
    local($errs) = 0;
    local($[) = 0;

    @args = split( / */, $argumentative );
    while(@ARGV && ($_ = $ARGV[0]) =~ /^-(.)(.*)/) {
	($first,$rest) = ($1,$2);
	$pos = index($argumentative,$first);
	if($pos >= $[) {
	    if($args[$pos+1] eq ':') {
		shift(@ARGV);
		if($rest eq '') {
		    $rest = shift(@ARGV);
		}
		######## make sure that opt arg is provided; trips on args
		######## starting with -    14 apr 1993 levine@ics.uci.edu
		if($rest ne '' && index($rest, '-')) {
		    if($first eq '?') {
		        $opt_questionmark = $rest;
		    }
		    else {
		        eval "\$opt_$first = \$rest;";
		    }
		}
		else {
		    print STDERR "Option requires an argument: $first\n";
		}
	    }
	    else {
		if($first eq '?') {
		    $opt_questionmark = 1;
		}
		else {
		    eval "\$opt_$first = 1";
		}
		if($rest eq '') {
		    shift(@ARGV);
		}
		else {
		    $ARGV[0] = "-$rest";
		}
	    }
	}
	else {
	    print STDERR "Unknown option: $first\n";
	    ++$errs;
	    if($rest ne '') {
		$ARGV[0] = "-$rest";
	    }
	    else {
		shift(@ARGV);
	    }
	}
    }
    $errs == 0;
}

1;


