#!/usr/bin/perl

use warnings; use strict;

our %headers_to_keep = map {lc($_), 1} @ARGV;
our $weed_sigs = 1;

our @pb = ();
our $eof = 0;

envelope();


sub envelope {
	get() or goto \&finished;
	/^From / or die "not mailbox format\n";
	put();
	goto \&headers;
}

sub headers {
	while(1) {
		get() or die "eof in headers";
		if (/^$/) { last }
		pb();
		header();
	}
	put();
	goto \&body;
}

sub header {
	get() or die "eof in header";
	/^(.+?): / or die "bad header: $_";
	my ($k) = ($1);
	$k = lc($k);
	my $keep = $headers_to_keep{$k};

	if ($keep) { put(); }
	while(1) {
		get() or die "eof in headers";
		if (/^\s+\S/) {
			if ($keep) { put(); }
		} else {
			pb();
			last;
		}
	}
}

sub body {
	my $in_sig = 0;
	while(1) {
		get();

		if ($eof or /^From /) {
			pb();
			if ($in_sig && $weed_sigs) {
				$_ = "\n";
				put();
			}
			goto \&envelope;
		}

		if (/^-- $/) {
			$in_sig = 1;
		}

		unless ($in_sig && $weed_sigs) {
			put();
		}
	}
}

sub finished {
	exit();
}

sub get {
	$_ = @pb ? shift @pb : <STDIN>;
	$eof = !defined $_;
	return !$eof;
}

sub put {
	print $_;
}

sub pb {
	unshift @pb, $_;
	undef $_;
}
