#!/usr/bin/perl -w

# mboxsplit - split a mailbox into separate files
#
# <@LICENSE>
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to you under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at:
# 
#     http://www.apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# </@LICENSE>

my $prog = $0;
$prog =~ s@.*/@@;

our ($opt_h, $opt_f, $opt_i, $opt_n);
use Getopt::Std;
getopts("hf:in:");

sub usage {
    my $status = shift;

    my $out = $status ? STDERR : STDOUT;
    print $out <<EOF;
usage: $prog [options] [mbox folders]

 -h         print this help
 -f format  set printf string to format
 -i         ignore leading data until reaching mbox separator
 -n n       set initial sequence number to n

mboxsplit splits mbox folders into separate files.  If no mbox folders
are specified, standard input is used.

"format" is a string formatted using the sprintf format used by Perl.
It should include a "%d" or other integer directive which will be
replaced by a sequence number (starting with 1 and counting upwards).
The default is "%d".

EOF
    exit($status);
}

usage(0) if $opt_h;

if (! $opt_f) {
    $opt_f = "%d";
}

my $file_no = defined($opt_n) ? $opt_n - 1 : 0;
my $file_open = 0;

while ($line = <>) {
    if ($file_open == 1 && $line =~ /^From /) {
	close(OUTFILE);
	$file_no++;
	$file_open = 0;
    }
    if ($file_open == 0) {
	if ($file_no == 0) {
	    next if $opt_i && $line !~ /^From /;
	    $file_no++;
	}
	open(OUTFILE, '>' . sprintf($opt_f, $file_no));
	$file_open = 1;
    }
    print OUTFILE $line;
}

if ($file_open == 1) {
    close(OUTFILE);
}
