#!/usr/local/bin/jperl --

# 
# vmgrep: VM (on Emacs) でのファイルフォルダからのメール検索
# 
#     Jun.12,'96. OSHIRO Naoki.
# 
#     $Log:$
#

$pat=shift(@ARGV); # 検索パターン取得
print STDERR "Search: $pat\n";

for (;;) {
    $pat_sw=0;
    $vm_head="";
    $block="";

    while (<>) {
	$block.=$_;
	last if /^[^\b]+:/; # メールヘッダ待ち
    }
    last if (eof(ARGV));

    for (;;) {
	$pat_sw=1 if /$pat/i;
	last unless /^([^\b]+:|[ \t])/;
	last if (eof(ARGV));

	# VM ヘッダの１，３行目は無視
	if (/^X-VM-v5-Data:/) { # VM のヘッダ待ち
	    $_=<>; $block.=$_; # ２行目
	    $vm_head=$_;
	    $_=<>; $block.=$_; # ３行目
	}

	# 次行取り込み
	$_=<>;
	$block.=$_;
    }
    unless ($vm_head) { # vm_head がなければとりあえず，次ループへ．．．
	next;
    }

    $vm_head=~s/^\t\[//;
    $vm_head=~s/\]\s*$//;
    @vm_head=&parse_vm_head(*vm_head);
    $line=@vm_head[10];
print STDERR "line:$line\n" if ($line eq 'nil');
    for ($i=0; $i<=$line; $i++) {
	$pat_sw=1 if /$pat/;
	$_=<>;
	$block.=$_;
    }
    print $block if ($pat_sw);

    $block="";
}

sub parse_vm_head {
    local(*head)=@_;
    local(@head);
    local($pre_head);

    $pre_head=$head;
    while ($head) {
	$tmp="???";
	if ($head=~s/^\"//) {
	    $head=~s/\\"/\x255/g; # \" の退避
	    $head=~s/^(([^\"]| )+)?\"([ )])// || $head=~s/^(([^\"]| )+)\"//;
	    $head=~s/\x255/\\"/g; # \" の復帰
	    $head="$3$head" if ($3 eq ')');
	    push(@head, $1);
	} elsif ($head=~s/^\(//) {
            $tmp=join(' ', &parse_vm_head);
	    push(@head, $tmp);
	} elsif ($head=~s/^\) ?//) {
	    return @head;
	} else {
	    $head=~s/^([^ ]+)[\s\b\)\]]// || $head=~s/^([^ ]+)$//;
            push(@head, $1);
	}
	if ($pre_head eq $head) {
	    die "Warning: Cannot parse header. --> $head\n";
	}
    }
    return @head;
}

# major-mode: perl
