package Net::NNTP::Functions;
# -*- Perl -*- 		# Fri Oct 10 10:17:44 CDT 2003 
#############################################################################
# Written by Tim Skirvin <tskirvin@killfile.org>.  Copyright 2003, Tim
# Skirvin.  Redistribution terms are below.
#############################################################################
use vars qw( $VERSION ); $VERSION = "0.2a";     

=head1 NAME

Net::NNTP::Functions - code to implement NNTP-standard functions

=head1 SYNOPSIS

  use Net::NNTP::Functions;

  my ($first1, $last1) = messagespec( "4-12" );	 # Returns (4, 12)
  my ($first2, $last2) = messagespec( 4 );	 # Returns (4, undef)
  my ($first3, $last3) = messagespec( [4, 12] ); # Returns (4, 12)
  my ($first4, $last4) = messagespec( "4-3" );   # Returns (4, -1)

  my $match = wildmat( 'rec.*', $string );

=head1 DESCRIPTION 

The NNTP specification, as described by Net::NNTP, defines two
speficiations: C<MESSAGE-SPEC>, for defining a range of messages, and
C<PATTERN>, for pattern-matching over NNTP.  These functions attempt to
implement this behaviour.

=cut

###############################################################################
### main() ####################################################################
###############################################################################

use strict;
use Exporter;

use vars qw( @EXPORT @EXPORT_OK @ISA );
@ISA    = "Exporter";
@EXPORT = qw( messagespec wildmat );

###############################################################################
### Methods ###################################################################
###############################################################################

=head2 Functions 

=over 4

=item messagespec ( ARRAYREF | MESSAGEID | MESSAGENUMBER )

Returns an array (or array reference) of two items (FIRST and LAST for
reference), based on the passed item.  If we get an C<ARRAYREF>, it's
assumed to be list of two items FIRST and LAST; if it's a C<MESSAGEID> or
C<MESSAGENUMBER> then FIRST is the value, and LAST is 'undef';

If the LAST item is less than FIRST, then we set LAST to '-1'.  This
allows later functions to (correctly) interpret this for a list of all
items after FIRST.

=cut

sub messagespec {
  my ($spec) = @_;
  my ($first, $last);

  if (ref $spec) {      		  	# List of two numbers
    ($first, $last) = @{$spec};
    $last = -1 if ($last < $first);
  } elsif ($spec =~ m/^\s*(\d+)\s*-?\s*(\d+)\s*$/) { # Two numbers
    $first = $1;  $last = $2;
    $last = -1 if ($last < $first);
  } else {      				# Message-ID or a single number
    $first = $spec;  $last = undef;
  }
  wantarray ? ($first, $last) : [ $first, $last ];
}

=item wildmat ( EXPRESSION, STRING )

Implements the WILDMAT format, as described in the Net::NNTP page (which I
won't repeat here).

Doesn't currently implement the entire functionality; all that currently
works is the anchoring, '*', and '?'.  Ranges of characters ('[]') and
invertings ('^') don't work.  (Correction: they might work, I haven't
tried).

Taken from
http://cvs.trainedmonkey.com/viewcvs.cgi/colobus/colobus?rev=1.41 .

=cut

sub wildmat ($$) {
  my ($expr, $string) = @_;
  $expr =~ s/(?<!\\)\./\\./g;	# Escape '.'
  $expr =~ s/(?<!\\)\$/\\\$/g;	# Escape '$'
  $expr =~ s/(?<!\\)\?/./g;	# '?' functionality
  $expr =~ s/(?<!\\)\*/.*/g;	# '*' functionality
  return $string =~ /^$expr$/;
}

=back

=head1 SEE ALSO

B<Net::NNTP>, specifically its manual page sections on WILDMAT and
MESSAGESPEC.

=head1 TODO

Write the rest of the functionality for wildmat().

=head1 AUTHOR

Tim Skirvin <tskirvin@killfile.org>.  wildmat() in its current form was
written by Jim Winstead Jr.

=head1 COPYRIGHT

Copyright 2003 by Tim Skirvin <tskirvin@killfile.org>.  This code may be
distributed under the same terms as Perl itself.

=cut

1;

###############################################################################
### Version History ###########################################################
###############################################################################

# v0.2a - Fri Oct 10 10:17:44 CDT 2003 
## First commented version.
