#!/usr/bin/env perl ############################################################################# # Copyright (c) 2003 Pelle Johansson. # # All rights reserved. # # # # This file is part of the moftpd package. Use and distribution of # # this software is governed by the terms in the file LICENCE, which # # should have come with this package. # ############################################################################# # $moftpd: make_table.pl 1251 2005-03-06 22:24:29Z morth $ $forwardName = shift(@ARGV); $reverseName = shift(@ARGV); $maxseq = 0; while (<>) { chomp; s/[ \t]*\#.*//; if (/([^ ]+) +(.*)/) { $ucode = $1; @seq = split / +/, $2; $maxseq = scalar (@seq) if (scalar (@seq) > $maxseq); if ($maxseq > 4) { print STDERR "Can't have longer sequences than 4. Edit table.[ch] and " . "this file to change this.\n"; exit 1; } $fortable{$ucode} = [@seq]; $revtable{$seq[0]} = [@{$revtable{$seq[0]}}, [@seq[1 .. $#seq], $ucode]]; } } sub hexcmp { my $lendiff = length ($a) - length ($b); return $lendiff if $lendiff; $a cmp $b; } if ($forwardName ne "none") { print "const int num$forwardName" . "s = " . keys (%fortable) . ";\n"; print "const int $forwardName" . "[][6] = \n"; print "{\n"; foreach $key (sort hexcmp (keys (%fortable))) { print " { 0x$key, 0x" . join (', 0x', @{$fortable{$key}}) . ", 0 }, \n"; } print "};\n\n"; } if ($reverseName ne "none") { @tables = ( "_" , \%revtable ); $output = "const int num$reverseName" . "s = " . keys (%revtable) . ";\n"; $output .= "const int max$reverseName" . "Depth = $maxseq;\n\n"; $output .= "const sized_table_t $reverseName = { " . keys (%revtable) . ", $reverseName" . "_ };\n\n"; while (($tag, $table, @tables) = @tables) { next if ($tags{$tag}); $tags{$tag} = 1; $text = "const table_t $reverseName$tag" . "[] = \n{\n"; foreach $key (sort hexcmp (keys (%$table))) { $val = $$table{$key}; if (scalar (@$val) > 1 || scalar (@{$$val[0]}) > 1) { my %newtable = (); foreach $arr (@$val) { if (scalar (@$arr) > 1) { $newtable{$$arr[0]} = [@{$newtable{$$arr[0]}}, [@$arr[1 .. $#$arr]]]; } elsif (scalar (@$arr)) { $newtable{"0 "} = [[$$arr[0]]]; } } $text .= " { 0x$key, { " . keys(%newtable) . ", $reverseName$tag$key } },\n"; @tables = (@tables, "$tag$key", \%newtable); } else { $text .= " { 0x$key, { 0x" . $$val[0]->[0] . ", NULL } },\n"; } } $text .= "};\n\n"; $output = $text . $output; } print $output; }