#!/usr/bin/perl
$^W=1;
use strict;

# usage: $0: RE [file ...]

# somewhat like (at least thus far most basic functionality of) grep(1),
# but rather than operate by lines, operate by mail messages,
# input file format expected to be in mbox format,
# messages delimited by: "^From "

# exit/return values:
# 0 - 1 or more matches found
# 1 - no matches found
# 2 - syntax error(s)
# other non-zero values - other error(s)

my $rc=1; # Return Code - exit/return value (start with no matches found)

if($#ARGV < 0){
	warn "usage: $0 regular_expression [file ...]";
	exit 2;
}

my $RE=shift;
my $msg=''; # our mailbox message

# $/="\nFrom "; won't quit suffice, so we read line-by-line
# and assemble each message.

while(<>){
	if(/\AFrom /){
		# start of new message
		# process collected message so far
		if($msg =~ /(?:$RE)/){
			print $msg or die;
			$rc=0;
		};
		# reinitialize for new message
		$msg=$_;
	}else{
		# continuation of existing message
		$msg .= $_;
	};
};

# process last message
if($msg =~ /(?:$RE)/){
	print $msg or die;
	$rc=0;
};

exit $rc;
