Rit.pl - Restore Interpreted Tabulation of a Bleached Program
Damian Conway has written a wonderful and useful module called Bleach.pm, which I downloaded and ran to my great amusement. However, it is a bit more destructive than most programs laying about around here. So I wrote a program to restore a bleached program. I won't describe how Bleach.pm works, or how my program works, because I don't understand either one of them!

One of the more interesting problems I faced with this program was how to deal with the licensing, since my program is clearly based on Damian's original Bleach.pm. I found that Damian's Bleach.pm module uses the Artistic License, which has this statement:

3.You may otherwise modify your copy of this Package in any way, provided that you insert a prominent
     notice in each changed file stating how and when you changed that file, and provided that you do at least
     ONE of the following: 

       a.place your modifications in the Public Domain or otherwise make them Freely Available, such as by
         posting said modifications to Usenet or an equivalent medium, or placing the modifications on a
         major archive site such as uunet.uu.net, or by allowing the Copyright Holder to include your
         modifications in the Standard Version of the Package. 

So I figured that I can put this code here as long as I make my program Freely Available under the Artistic License. Feel free to contact me if you think I got this wrong.

Here is my code:

# Program to restore a bleached Perl program.
#          Copyright (c) 2001, Tom Anderson. All Rights Reserved.
#        This module is free software. It may be used, redistributed
#       and/or modified under the terms of the Perl Artistic License
#            (see http://www.perl.com/perl/misc/Artistic.html)
#          Based on Bleach.pm, Copyright (c) 2001, Damian Conway
#          This program is available at http://tomacorp.com/perl/rit/index.html
use Getopt::Std;
our $opt_f;
if ($opt_f eq "")
  print "Usage: Rit.pl -f bleached_code.pl\n";
open(FN, $opt_f) or die "Can't open $opt_f";
my $tie = " \t"x8;
sub whiten { local $_ = unpack "b*", pop; tr/01/ \t/; s/(.{9})/$1\n/g; $tie.$_ }
sub brighten { local $_ = pop; s/^$tie|[^ \t]//g; tr/ \t/01/; pack "b*", $_}
sub dirty { $_[0] =~ /\S/ }
sub dress { $_[0] =~ /^$tie/ }
(my $shirt = join "", ) =~ s/.*^\s*use\s+Bleach\s*;\n//sm;
print brighten $shirt;           

To see what this program is good for, first get Bleach.pm from CPAN and try it out. After using Bleach.pm in a small test program, examine the source code of your program. It will have been changed in a way that hides the source code. Rit.pl restores the hidden source code to its former visibility. I wrote Rit.pl because I like the bleach module, but I feared that I might accidentally lose some source code when I used it. I thought to myself, "I should delete this from my system. But I how can I bear to delete Damian's code?" So I wrote Rit.pl to make the effects of Bleach.pm reversible.

To write this program I traced the execution of Bleach.pm with the excellent ptkdb perl debugger, and found a critical spot in the code where I could insert a print statement to make the program do almost exactly what I wanted. With a little more effort I had Rit.pl.

Using the debugger this way is a generally useful technique for adding functionality to perl programs, especially ones that you don't understand.


By toma