Cleaning up code from a code generator
A good application of perltidy is to clean up code which has been produced
by a code generator. Here is a snippet advent.t
which was generated from Fortran source by a translation tool.
{
L9140:
if ($msccom::obj==$msccom::food) {
goto L8142;
}
if ($msccom::obj==$msccom::bird||$msccom::obj==$msccom::snake||$msccom::obj==$msccom::clam||$msccom::obj==$msccom::oyster||$msccom::obj==$msccom::dwarf||$msccom::obj==$msccom::dragon||$msccom::obj==$msccom::troll||$msccom::obj==$msccom::bear) {
$msccom::spk=71;
}
goto L2011;
#
# DRINK. IF NO OBJECT, ASSUME WATER AND LOOK FOR IT HERE. IF WATER IS
# THE BOTTLE, DRINK THAT, ELSE MUST BE AT A WATER LOC, SO DRINK STREAM.
#
L9150:
if ($msccom::obj==0&&$liqloc->($placom::loc)!=$msccom::water&&($liq->(0)!=$msccom::water||!$here->($msccom::bottle))) {
goto L8000;
}
if ($msccom::obj!=0&&$msccom::obj!=$msccom::water) {
$msccom::spk=110;
}
if ($msccom::spk==110||$liq->(0)!=$msccom::water||!$here->($msccom::bottle)) {
goto L2011;
}
$placom::prop->($msccom::bottle)=1;
$placom::place->($msccom::water)=0;
$msccom::spk=74;
goto L2011;
#
# RUB. YIELDS VARIOUS SNIDE REMARKS.
#
L9160:
if ($msccom::obj!=$placom::lamp) {
$msccom::spk=76;
}
goto L2011;
#
# THROW. SAME AS DISCARD UNLESS AXE. THEN SAME AS ATTACK EXCEPT IGNOR
# AND IF DWARF IS PRESENT THEN ONE MIGHT BE KILLED. (ONLY WAY TO DO SO
# AXE ALSO SPECIAL FOR DRAGON, BEAR, AND TROLL. TREASURES SPECIAL FOR
#
L9170:
if ($toting->($msccom::rod2)&&$msccom::obj==$msccom::rod&&!$toting->($msccom::rod)) {
$msccom::obj=$msccom::rod2;
}
}
The command perltidy advent.t
produces advent.t.tdy
containing this result:
{
L9140:
if ( $msccom::obj == $msccom::food ) {
goto L8142;
}
if ( $msccom::obj == $msccom::bird
|| $msccom::obj == $msccom::snake
|| $msccom::obj == $msccom::clam
|| $msccom::obj == $msccom::oyster
|| $msccom::obj == $msccom::dwarf
|| $msccom::obj == $msccom::dragon
|| $msccom::obj == $msccom::troll
|| $msccom::obj == $msccom::bear )
{
$msccom::spk = 71;
}
goto L2011;
#
# DRINK. IF NO OBJECT, ASSUME WATER AND LOOK FOR IT HERE. IF WATER IS
# THE BOTTLE, DRINK THAT, ELSE MUST BE AT A WATER LOC, SO DRINK STREAM.
#
L9150:
if ( $msccom::obj == 0
&& $liqloc->($placom::loc) != $msccom::water
&& ( $liq->(0) != $msccom::water || !$here->($msccom::bottle) ) )
{
goto L8000;
}
if ( $msccom::obj != 0 && $msccom::obj != $msccom::water ) {
$msccom::spk = 110;
}
if ( $msccom::spk == 110
|| $liq->(0) != $msccom::water
|| !$here->($msccom::bottle) )
{
goto L2011;
}
$placom::prop->($msccom::bottle) = 1;
$placom::place->($msccom::water) = 0;
$msccom::spk = 74;
goto L2011;
#
# RUB. YIELDS VARIOUS SNIDE REMARKS.
#
L9160:
if ( $msccom::obj != $placom::lamp ) {
$msccom::spk = 76;
}
goto L2011;
#
# THROW. SAME AS DISCARD UNLESS AXE. THEN SAME AS ATTACK EXCEPT IGNOR
# AND IF DWARF IS PRESENT THEN ONE MIGHT BE KILLED. (ONLY WAY TO DO SO
# AXE ALSO SPECIAL FOR DRAGON, BEAR, AND TROLL. TREASURES SPECIAL FOR
#
L9170:
if ( $toting->($msccom::rod2)
&& $msccom::obj == $msccom::rod
&& !$toting->($msccom::rod) )
{
$msccom::obj = $msccom::rod2;
}
}
Well, it still looks a lot like fortran, but it's much more legible.