DbGetopt.pm
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:5k
源码类别:

通讯编程

开发平台:

Visual C++

  1. #!/home/johnh/BIN/perl5 -w
  2. #
  3. # DbGetopt.pm
  4. # Copyright (C) 1995-1998 by John Heidemann <johnh@ficus.cs.ucla.edu>
  5. # $Id: DbGetopt.pm,v 1.2 2005/09/16 04:41:55 tomh Exp $
  6. #
  7. # This program is distributed under terms of the GNU general
  8. # public license, version 2.  See the file COPYING
  9. # in $dblib for details.
  10. # The copyright of this module includes the following
  11. # linking-with-specific-other-licenses addition:
  12. # In addition, as a special exception, the copyright holders of
  13. # this module give you permission to combine (via static or
  14. # dynamic linking) this module with free software programs or
  15. # libraries that are released under the GNU LGPL and with code
  16. # included in the standard release of ns-2 under the Apache 2.0
  17. # license or under otherwise-compatible licenses with advertising
  18. # requirements (or modified versions of such code, with unchanged
  19. # license).  You may copy and distribute such a system following the
  20. # terms of the GNU GPL for this module and the licenses of the
  21. # other code concerned, provided that you include the source code of
  22. # that other code when and as the GNU GPL requires distribution of
  23. # source code.
  24. # Note that people who make modified versions of this module
  25. # are not obligated to grant this special exception for their
  26. # modified versions; it is their choice whether to do so.  The GNU
  27. # General Public License gives permission to release a modified
  28. # version without this exception; this exception also makes it
  29. # possible to release a modified version which carries forward this
  30. # exception.
  31. #
  32. #
  33. package DbGetopt;
  34. =head1 NAME
  35. DbGetopt -- the currently preferred method of parsing args in jdb
  36. =head1 SYNOPSIS
  37.     use DbGetopt;
  38.     $opts = new DbGetopts("ab:", @ARGV);
  39.     while ($opts->getopt()) {
  40. if ($opts->opt eq 'b') {
  41.     $b = $opts->optarg;
  42. }
  43.     };
  44.     @other_args = $opts->rest;
  45. =head1 CREDITS
  46. Taken from:
  47. getoptk.pl -- getopt-like processing for Perl scripts, by
  48. Brian Katzung  12 June 1993
  49. <katzung@katsun.chi.il.us>,
  50. and much hacked.
  51. Perl5-ized by John Heidemann <johnh@isi.edu>.
  52. =cut
  53. #'
  54. require 5.000;
  55. require Exporter;
  56. @EXPORT = qw();
  57. @EXPORT_OK = qw();
  58. ($VERSION) = ('$Revision: 1.2 $' =~ / (d+.d+) /);
  59. use Carp qw(croak);
  60. =head2 new("optionslist", @ARGV)
  61. Instantiate a new object.
  62. =cut
  63. #' font-lock hack
  64. sub new {
  65.     my($class) = shift @_;
  66.     my($options, $optlistref) = @_;
  67.     croak("DbGetopt::new: no options.n") if (!defined($options));
  68.     croak("DbGetopt::new: no option list or wrong type.n") if (!defined($optlistref) || ref($optlistref) ne 'ARRAY');
  69.     my $self = bless {
  70. opt => undef,
  71. opterr => 1,
  72. optarg => undef,
  73. _nextopt => '',
  74. _spec => $options,
  75. _optlistref => $optlistref,
  76.     }, $class;
  77.     return $self;
  78. }
  79. # from LWP::MemberMixin
  80. sub _elem {
  81.     my($self, $elem, $val) = @_;
  82.     my $old = $self->{$elem};
  83.     $self->{$elem} = $val if defined $val;
  84.     return $old;
  85. }
  86. sub _elem_array {
  87.     my($self) = shift @_;
  88.     my($elem) = shift @_;
  89.     return wantarray ? @{$self->{$elem}} : $self->{$elem}
  90.         if ($#_ == -1);
  91.     if (ref($_[0])) {
  92.         $self->{$elem} = $_[0];
  93.     } else {
  94. $self->{$elem} = ();
  95. push @{$self->{$elem}}, @_;
  96.     };
  97.     # always return array refrence
  98.     return $self->{$elem};
  99. }
  100. =head2 opt, optarg, opterr, rest
  101. Return the currently parsed option, that options's argument,
  102. the error status, or any remaining options.
  103. =cut
  104. # '
  105. sub opt { return shift->_elem('opt', @_); }
  106. sub opterr { return shift->_elem('opterr', @_); }
  107. sub optarg { return shift->_elem('optarg', @_); }
  108. sub rest { return shift->_elem_array('_optlistref', @_); }
  109. =head2 getopt
  110. Get the next option, returning undef if out.
  111. =cut
  112. sub getopt {
  113.     my($self) = shift;
  114.     my($withArgs) = $self->{_spec};
  115.     my($next);
  116.     my($option, $i);
  117.     my($argvref) = $self->{_optlistref};
  118.     #
  119.     # Fetch the next option string if necessary.
  120.     #
  121.     if (($next = $self->{'_nextopt'}) eq '') {
  122. #
  123. # Stop if there are no more arguments, if we see '--',
  124. # or if the next argument doesn't look like an option
  125. # string.
  126. #
  127. return undef
  128.     if (($#{$argvref} < 0) || (${$argvref}[0] eq '-') || (${$argvref}[0] !~ /^-/));
  129. if (${$argvref}[0] eq '--') {
  130.     shift(@{$argvref});
  131.     return undef;
  132. }
  133. #
  134. # Grab the next argument and remove it from @ARGV.
  135. #
  136. $next = shift @{$argvref};
  137. $next = substr($next, 1);
  138.     };
  139.     #
  140.     # Peel off the next option.
  141.     #
  142.     $option = substr($next, 0, 1);
  143.     $next = substr($next, 1);
  144.     $i = index($withArgs, $option);
  145.     if ($i == -1) {
  146. #
  147. # Unknown option.
  148. #
  149. croak("unknown option '$option'") if ($self->{'opterr'});
  150. # # put the argument back on ARGV
  151. # unshift (@ARGV, "-$option$next");
  152. $self->{'opt'} = '?';
  153. return 1;
  154.     };
  155.     if (substr($withArgs, $i+1, 1) eq ':') {
  156. #
  157. # The option takes an argument.  Take the argument
  158. # from the remainder of the option string, or use
  159. # the next argument if the option string is empty.
  160. #
  161. if ($next ne '') {
  162.     $self->{'optarg'} = $next;
  163.     $next = '';
  164. } else {
  165.     $self->{'optarg'} = shift(@{$argvref});
  166. };
  167.     };
  168.     #
  169.     # Save the remainder of the option string and return
  170.     # the current option.
  171.     #
  172.     $self->{'_nextopt'} = $next;
  173.     $self->{'opt'} = $option;
  174.     return 1;
  175. }
  176. =head2 ungetopt
  177. Push the current option back on the options stream.
  178. (May not exactly preserve original option parsing.)
  179. =cut
  180. sub ungetopt {
  181.     my($self) = shift;
  182.     my($opt) = $self->{'opt'};
  183.     $opt .= $self->{_nextopt} if ($self->{_nextopt} ne '');
  184.     unshift @{$self->{'_optlistref'}}, "-$opt";
  185. }
  186. # suppress warnings
  187. my($bogus) = $VERSION;
  188. 1;