#!/usr/bin/perl -w

# Tentakel-Coder v1.1
# (C) 2001 by Christian Garbs <mitch@cgarbs.de>
# Licensed under GNU GPL

# $Id: tentakelcoder.pl,v 1.5 2001/09/30 12:40:10 mitch Exp $

use strict;
sub encode($);
sub decode($);

if ( (! defined $ARGV[0]) or ($ARGV[0] ne "-e" and $ARGV[0] ne "-d") ) {
    print << "EOF";
Tentakel-Coder v1.1 (C) 2001 by Christian Garbs <mitch\@cgarbs.de>
Usage: tentakelcoder.pl (-d|-e) [file1] [file2] [...]
option -d:  decode
option -e:  encode
EOF
    ;
    exit 0;
}

my $action = shift;
my $kopf = "o";
my $fuss = ")";
my @zahlen = ( 11, 7, 3, 1 );
my %tentakel =     ( '_' =>  11, '~' =>   7, '-' =>   3, '=' =>   1 );
my %tentakel_rev = (  11 => '_',   7 => '~',   3 => '-',   1 => '=' );
my @tentakel_rev_keys = ( 11, 7, 3, 1 );

if ($action eq "-e") {
    print encode($_) foreach <>;
}  else {
    print decode($_) foreach <>;
}

exit 0;

sub encode($) {
    my $rest = shift;
    my $ret;
    for my $idx (0 .. (length $rest)-1)
    { 
	my $num = ord substr $rest, $idx, 1;
	my $tentakel="";
	while ($num) {
	    my $i = $zahlen[int rand 4];
	    if ($i <= $num) {
		$num -= $i;
	      SWITCH: {
		  $tentakel .= "_", last SWITCH  if $i == 11;
		  $tentakel .= "~", last SWITCH  if $i == 7;
		  $tentakel .= "-", last SWITCH  if $i == 3;
		  $tentakel .= "=";
	      }
	    }
	}
	$ret .= "$fuss$tentakel$kopf\n";
    }
    return $ret;
}

sub decode($) {
    my $rest = shift;
    my $ret = "";
    $rest =~ /\)(.*)o/;
    if (defined $1) {
	my $num = ( $1 =~ y/_// ) * 11;
	$num += ( $1 =~ y/~// ) *  7;
	$num += ( $1 =~ y/-// ) *  3;
	$num += ( $1 =~ y/=// ) *  1;
	$ret = chr $num;
    }
    return $ret;
}
