#!/bin/sh
# -*- perl -*-
# This code allows us to start perl from our path or an environment variable
# rather than hardcoding a path into the #! line.  It works from sh or csh.
(exit $?0) && eval 'exec ${QPERLQ-perl} -x $0 ${1+"$@"}'
if (! $?QPERLQ) setenv QPERLQ perl
exec $QPERLQ -x $0 $argv:q

#!/usr/local/bin/perl -w
#
# $Id: decode_multi,v 1.1 1997/02/17 18:58:44 ejb Exp $
# $Source: /home/ejb/scripts/RCS/decode_multi,v $
# $Author: ejb $
#

require 5.002;
use strict;

my $whoami = ($0 =~ m,([^/]*)$,) ? $1 : $0;
#my $dirname = ($0 =~ m,(.*)/[^/]+$,) ? $1 : ".";

my $st_top = 0;
my $st_uuencode = 1;
my $st_mime = 2;
my $state = $st_top;

my $mst_top = 0;
my $mst_body = 1;
my $mst_end = 2;
my $mime_state = $mst_top;

my $failures = 0;

while (<>)
{
    if ($state == $st_uuencode)
    {
	print DECODE;
	if (m/^end$/)
	{
	    $state = $st_top;
	    close(DECODE);
	    if ($? != 0)
	    {
		warn "$whoami: uudecode failed with status $?\n";
		$failures++;
	    }
	}
    }
    elsif ($state == $st_mime)
    {
	if ($mime_state == $mst_top)
	{
	    if (m/^\s*$/)
	    {
		$mime_state = $mst_body;
	    }
	}
	elsif ($mime_state == $mst_body)
	{
	    if (m/^\s*$/)
	    {
		$mime_state = $mst_end;
		close(DECODE);
		if ($? != 0)
		{
		    warn "$whoami: mimencode failed with status $?\n";
		    $failures++;
		}
	    }
	    else
	    {
		print DECODE;
	    }
	}
	elsif ($mime_state == $mst_end)
	{
	    $state = $st_top;
	}
    }
    elsif (m/^begin [0-7]{3,4} (.+)/)
    {
	my $filename = $1;
	&rename_if_necessary($filename);
	print "Creating $filename\n";
	if (open(DECODE, "|uudecode 2>/dev/null"))
	{
	    print DECODE;
	    $state = $st_uuencode;
	}
	else
	{
	    warn "$whoami: unable to run uudecode: $!\n";
	    $failures++;
	}
    }
    elsif (m/^Content-Type: .*; name=\"([^\"]+)\"/)
    {
	my $filename = $1;
	&rename_if_necessary($filename);
	print "Creating $filename\n";
	if (open(DECODE, "|mimencode -u > $filename"))
	{
	    $state = $st_mime;
	    $mime_state = $mst_top;
	}
	else
	{
	    warn "$whoami: unable to run mimencode: $!\n";
	    $failures++;
	}
    }
}
if ($state != $st_top)
{
    close(DECODE);
    warn "$whoami: file ended prematurely\n";
}

exit ($failures ? 2 : 0);

sub rename_if_necessary
{
    my $filename = shift;
    
    if (-e $filename)
    {
	if (rename $filename, "$filename.old-$$")
	{
	    print "$whoami: renamed $filename to $filename.old-$$\n";
	}
	else
	{
	    die "$whoami: $filename exists and can't be " .
		"renamed to $filename.old-$$\n";
	}
    }
}

