#!/usr/bin/perl
# cleanup.pl by Silver - silver@ewtoo.org
# version 1.3
#
# this cleans up a clist.h file, you need to wrap the rest of the
# contents of clist.h around this
#
# Caveats:
# 1. Untested
# 2. Doesn't generate a complete clist.h file
#
# usage: cleanup.pl > outfile
#
use strict;
my %structs;
my @commands;
my ($key, $value);
my $define;
my %ifdef;
open(CLIST, "clist.h") || die "Can't open clist.h: $!";
while (<CLIST>)
{
if (/#ifdef (.+)/)
{
$define = $1;
}
if (/#endif/)
{
$define = "";
}
if (/( *){"(.+?)", *(.+?), *(.+?)},/)
{
push @commands, "$1\{\"$2\", $3, $4},^^$define";
# check syntax, if bad then report but continue anyway
print STDERR "Warning: '$2' cmd ('$3' fn) appears badly formed.\n" unless ($4 =~ /^.+?,.+?,.+?,.+?$/);
unless ($structs{$3})
{
$structs{$3} = $2;
}
else
{
$structs{$3} .= " $2";
}
$ifdef{$3} = $define if ($define);
}
}
close CLIST;
@commands = sort @commands;
my $lastchar = "";
$define = "";
foreach (sort keys %structs)
{
if (substr($_, 0, 1) ne $lastchar)
{
if ($define ne "")
{
print "#endif /* $define */\n";
$define = "";
}
print "\n/* " . substr($_, 0, 1) . " */\n";
$lastchar = substr($_, 0, 1);
}
# I don't know how to do this any other way
my @in = split(/ /, $structs{$_});
my %saw;
undef %saw;
my @out = grep(!$saw{$_}++, @in);
my $done = join(" ", @out);
if ($ifdef{$_})
{
if ($define ne $ifdef{$_})
{
print "#endif /* $define */\n" if ($define);
$define = $ifdef{$_};
print "#ifdef $define\n";
}
}
else
{
if ($define)
{
print "#endif /* $define */\n";
$define = "";
}
}
print " " if ($define);
print "extern command_func $_; /* $done */\n";
}
print "\n\n";
$lastchar = "";
$define = "";
foreach (@commands)
{
unless (substr($_, 0, 1) eq " ")
{
my $bit = substr($_, 2, 1);
if ($bit ne $lastchar && (isalpha($bit) || isalpha($lastchar)))
{
if ($define)
{
print "#endif /* $define */\n";
$define = "";
}
print "{0, 0, 0, 0, 0, 0, 0},\n\n";
print "/* $bit */\n";
$lastchar = $bit;
}
my @bits = split(/\^\^/, $_);
if ($bits[1])
{
if ($bits[1] ne $define)
{
if ($define)
{
print "#endif /* $define */\n";
}
$define = $bits[1];
print "#ifdef $bits[1]\n";
}
print " $bits[0]\n";
}
else
{
if ($define)
{
print "#endif /* $define */\n";
$define = "";
}
print "$bits[0]\n";
}
}
}
print "{0, 0, 0, 0, 0, 0, 0},\n";
exit(0);
sub isalpha
{
my $str = shift;
$str =~ /^[^\W\d_]+$/;
}