diff options
author | Andreas Gruenbacher <agruen@suse.de> | 2005-09-18 08:13:07 +0000 |
---|---|---|
committer | Andreas Gruenbacher <agruen@suse.de> | 2005-09-18 08:13:07 +0000 |
commit | e9a3bc5476ec8e98e01fb4423577b42a09890d15 (patch) | |
tree | fc2062f327a56b3055fd792c0a869099c2d2bf10 /compat/getopt.in | |
parent | ba3107e66e526602a6fb08d451a82850bcba19f4 (diff) | |
download | quilt-e9a3bc5476ec8e98e01fb4423577b42a09890d15.tar.gz |
- Forgot to add new files to the repository.
Diffstat (limited to 'compat/getopt.in')
-rw-r--r-- | compat/getopt.in | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/compat/getopt.in b/compat/getopt.in new file mode 100644 index 0000000..d66bb5c --- /dev/null +++ b/compat/getopt.in @@ -0,0 +1,98 @@ +#! @PERL@ -w + +# This script is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# See the COPYING and AUTHORS files for more details. + +use strict; + +my ($opts,$args) = split(/ -- /, join(' ',@ARGV)); + +# there is no reason to parse +# the opts if there are no args. +if (! $args) { + print ' -- '; + exit; +} + +my $short_opts = ''; +my @long_opts; + +# nothing fancy to see here; this script provides minimal compatibility +# with the getopt from util-linux until a cross platform binary exists. +if ($opts =~ /^-o ([a-zA-Z:]*)( --long .*)*/) { + $short_opts = $1; + if ($2) { + my $long_opts = $2; + $long_opts =~ s/^\s*--long //g; + $long_opts =~ s/ --long /,/g; + @long_opts = split(/,/,$long_opts); + } +} + +my @words=split(/\s+/,$args); + +my @barewords; +my @options; + +# set the the previous option name when a param is required +my $need_param; + +foreach my $word (@words) { + # allow '-' to be an option value + if (!$need_param && $word !~ /^-./) { + push @barewords, $word; + next; + } + if ($need_param) { + die "expecting param for $need_param" if $word =~ /^-./; + push @options, $word; + $need_param = undef; + next; + } + # process short options + if ($word =~ s/^-([^-])/$1/) { + my @letters = reverse(split(//,$word)); + while (@letters) { + my $letter = pop @letters; + my $found = grep(/$letter/, $short_opts); + push @options, '-'.$letter; + die "illegal option: $letter" if !$found; + if (grep(/$letter:/, $short_opts)) { + if (scalar(@letters) == 0) { + $need_param = $letter; + } else { + # short options can have numerical args + # embedded in the short option list: -UO + die "unexpected character after option $letter" + if ($letters[$#letters] !~ /[0-9]/); + my @digits; + while (scalar(@letters) && ($letters[$#letters] =~ /[0-9]/)) { + push @digits, pop @letters; + } + push @options, join('',reverse @digits); + } + } + } + } + # process long options + if ($word =~ s/^--//) { + my $param = ''; + if ($word =~ /(.*)=(.*)/) { + $word = $1; + $param = $2; + } + my ($found) = grep(/^$word:?$/,@long_opts); + die "illegal option: $word" if !$found; + die "$word: unexpected paramater $param" if $found !~ /:$/ && $param ne ''; + + $need_param = $word if $found =~ /:$/ && $param eq ''; + push @options, "--$word"; + push @options, $param if $param; + } +} + +print "@options -- @barewords" + |