#!/usr/bin/perl
#
# Alex Pleiner, "German Ninja", 2004, This code is free (GPL)
#
# usage: sa30-check.pl < orig.cf > new.cf

use strict;

## config as given by Bob Menschel
my $name_length        = 22;
my $description_length = 50; # ???

my $name_offset        = 10;
my $rule_offset        = 35;

## main
my $info = "";
my %names;

while (<>)
  {
    print, next if /^\#/;   ## ignore comment
    print, next if /^\s*$/; ## ignore empty line
    print, next unless /\s*(score|body|full|rawbody|meta|header|describe|uri|tflags)/; 
                            ## ignore blacklist_from et al.
    formated_print(split(/\s+/, $_, 3));
  }

print <<EOT, $info if $info;
#
# The following rules have been changed:
#
EOT

## sub land
sub formated_print
  {
    my ($key, $name, $text) = @_;
    $text =~ s/[\n\r]+$//; ## remove trailing whitespace and cr/lf
    $text =~ s/\s+$//;

    print $key, " "x($name_offset-length($key));
    print shorten_name($name);
    print shorten_text($key,$name,$text);
    print "\n";
  }


sub shorten_name
  {
    my ($name) = @_;
    return $name . " "x($rule_offset-$name_offset-length($name)) if length($name) <= $name_length;
    my $new_name = $names{$name} || substr($name, 0, $name_length);
    LOOP: while (1)
      {
	foreach (keys %names)
	  {
	    next if $_ eq $name;
	    $new_name = unique($name), next LOOP if $new_name eq $names{$_};
	  }
	last;
      }
    $names{$name} = $new_name;

    $info .= "# rulename $new_name $name\n"; ## save modification
    return $new_name . " "x($rule_offset-$name_offset-length($new_name));
  }

sub shorten_text
  {
    my ($key, $name, $text) = @_;
    if ($key eq "meta")
      {
	$text =~ s/$_/$names{$_}/g foreach keys %names
      }
    return $text unless $key eq "describe"; ## not description
    return $text if length($text) <= $description_length;

    $info .= "# describ $name $text\n"; ## save modification
    return substr($text, 0, $description_length);

  }

## this should be more intelligent
my $i = 1;
sub unique
  {
    my ($name) = @_;
    $name =~ /^(_*)/;
    return $1 . "FIXME_" . $i++;
  }
