#!/usr/bin/perl -w
# (C) 2003-2007 Willem Jan Hengeveld <itsme@xs4all.nl>
# Web: http://www.xs4all.nl/~itsme/
#      http://wiki.xda-developers.com/
#
# $Id$
#
use strict;

# this script base64 encodes or decodes stdin.

#todo: strip ----BEGIN <desc>---...---END <desc>---  wrapper

use MIME::Base64;

use Getopt::Long;

my $direction="encode";
my $binarymode= 0;
my $separatelines= 0;   # keep line structure of input.
my $urlcode=0;
# note: facebook, youtube use a modified version with  tr "+/"  "-_"
GetOptions(
    "u|decode" => sub { $direction="decode"; },
    "e|encode" => sub { $direction="encode"; },
    "y" => \$urlcode,
    "b" => \$binarymode,
    "l" => \$separatelines,
) or die usage();
sub usage {
    return <<__EOF__
Usage: base64 [-u|-e] [-b] [-l]
__EOF__
}
if ($direction eq "encode") {
    if ($binarymode) {
        binmode STDIN;
    }
    do_encode();
}
elsif ($direction eq "decode") {
    if ($binarymode) {
        binmode STDOUT;
    }
    do_decode();
}
else {
    die "must specify either '-u' or '-e'\n";
}
exit(0);

sub do_encode {
    $/=undef;
    while(<>) {
        my $enc= encode_base64($_);
        $enc =~ tr{+/}{-_} if ($urlcode);
        print $enc;
    }
}

sub do_decode {
    while(<>) {
        chomp;
        for my $word (split /(\s+)/) {
            if ($word =~ /\s/) {
                print $word if ($separatelines);
            }
            else {
                $word =~ tr{-_}{+/} if ($urlcode);
                print decode_base64($word);
            }
        }
    }
}

