#! /usr/bin/perl

use Fcntl;
use Digest;

use strict;
use warnings;

# maskiert:
# "/tmp/ab\nc"
# \d41d8cd98f00b204e9800998ecf8427e  /tmp/ab\\nc
# "/tmp/ab\\c"
# \d41d8cd98f00b204e9800998ecf8427e  /tmp/ab\\\\c
# \n (newline), \\ (backslash)


# nicht maskiert:
# "/tmp/ab\tc"
# d41d8cd98f00b204e9800998ecf8427e  /tmp/ab	c
# \a (bell), \b (backspace), \t horizontal tab, \v (vertical tab),
# \f (form feed), \r (carrage return)
# \0 results in error message in filename

my (%mapChecksum) = (
    'md5sum' => 'MD5',
    'sha1sum' => 'SHA-1',
    'sha224sum' => 'SHA-224',
    'sha256sum' => 'SHA-256',
    'sha384sum' => 'SHA-384',
    'sha512sum' => 'SHA-512'
    );


my $p =$0;      # isolate name of script
$p =~ s/\A.*\/+(.+)/$1/
    if $p =~ /\//;

unless (exists $mapChecksum{$p})
{
    print STDERR "unknown checksum <$p>\n";
    exit 1;
}

while (my $fileToRead = shift @ARGV)
{
    unless (sysopen(IN, $fileToRead, O_RDONLY))
    {
	print STDERR "cannot open <$fileToRead>\n";
	exit 1;
    }

    my $md5 = Digest->new($mapChecksum{$p});
    my ($buffer, $n, $size);
    while ($n = sysread(IN, $buffer, 4096))
    {
	$md5->add($buffer);
    }
    close(IN);

    my $mask = '';
    my $checkSum = $md5->hexdigest();
    my $f = $fileToRead;
    if ($fileToRead =~ /[\n\\]/)
    {
	$mask = "\\";
	$f =~ s/\\/\\\\/g;
	$f =~ s/\n/\\n/g;
    }
    print "$mask$checkSum  $f\n";
}

exit 0;
