# (C) 2003-2007 Willem Jan Hengeveld # Web: http://www.xs4all.nl/~itsme/ # http://wiki.xda-developers.com/ # # attempt to make complicated template symbols more readable # # $Id: $ # use strict; use warnings; use Getopt::Long; my $verbose=0; GetOptions( "v" => \$verbose ); # tool to go from this: # # public: __thiscall boost::spirit::binary,class boost::spirit::strlit >,class boost::spirit::rule >::const_iterator,struct boost::spirit::scanner_policies >,struct boost::spirit::nil_t,struct boost::spirit::nil_t> >,class boost::spirit::rule >::const_iterator,struct boost::spirit::scanner_policies >,struct boost::spirit::nil_t,struct boost::spirit::nil_t> >,struct boost::spirit::sequence,class boost::spirit::strlit >,class boost::spirit::rule >::const_iterator,struct boost::spirit::scanner_policies >,struct boost::spirit::nil_t,struct boost::spirit::nil_t> >,class boost::spirit::rule >::const_iterator,struct boost::spirit::scanner_policies >,struct boost::spirit::nil_t,struct boost::spirit::nil_t> > >,struct boost::spirit::sequence,class boost::spirit::strlit >,class boost::spirit::rule >::const_iterator,struct boost::spirit::scanner_policies >,struct boost::spirit::nil_t,struct boost::spirit::nil_t> >,class boost::spirit::rule >::const_iterator,struct boost::spirit::scanner_policies >,struct boost::spirit::nil_t,struct boost::spirit::nil_t> > >,class boost::spirit::rule >::const_iterator,struct boost::spirit::scanner_policies >,struct boost::spirit::nil_t,struct boost::spirit::nil_t>,struct boost::spirit::parser,class boost::spirit::strlit >,class boost::spirit::rule >::const_iterator,struct boost::spirit::scanner_policies >,struct boost::spirit::nil_t,struct boost::spirit::nil_t> >,class boost::spirit::rule >::const_iterator,struct boost::spirit::scanner_policies >,struct boost::spirit::nil_t,struct boost::spirit::nil_t> >,struct boost::spirit::sequence,class boost::spirit::strlit >,class boost::spirit::rule >::const_iterator,struct boost::spirit::scanner_policies >,struct boost::spirit::nil_t,struct boost::spirit::nil_t> >,class boost::spirit::rule >::const_iterator,struct boost::spirit::scanner_policies >,struct boost::spirit::nil_t,struct boost::spirit::nil_t> > >,struct boost::spirit::sequence,class boost::spirit::strlit >,class boost::spirit::rule >::const_iterator,struct boost::spirit::scanner_policies >,struct boost::spirit::nil_t,struct boost::spirit::nil_t> >,class boost::spirit::rule >::const_iterator,struct boost::spirit::scanner_policies >,struct boost::spirit::nil_t,struct boost::spirit::nil_t> > >,class boost::spirit::rule >::const_iterator,struct boost::spirit::scanner_policies >,struct boost::spirit::nil_t,struct boost::spirit::nil_t> > > >::binary,class boost::spirit::strlit >,class boost::spirit::rule >::const_iterator,struct boost::spirit::scanner_policies >,struct boost::spirit::nil_t,struct boost::spirit::nil_t> >,class boost::spirit::rule >::const_iterator,struct boost::spirit::scanner_policies >,struct boost::spirit::nil_t,struct boost::spirit::nil_t> >,struct boost::spirit::sequence,class boost::spirit::strlit >,class boost::spirit::rule >::const_iterator,struct boost::spirit::scanner_policies >,struct boost::spirit::nil_t,struct boost::spirit::nil_t> >,class boost::spirit::rule >::const_iterator,struct boost::spirit::scanner_policies >,struct boost::spirit::nil_t,struct boost::spirit::nil_t> > >,struct boost::spirit::sequence,class boost::spirit::strlit >,class boost::spirit::rule >::const_iterator,struct boost::spirit::scanner_policies >,struct boost::spirit::nil_t,struct boost::spirit::nil_t> >,class boost::spirit::rule >::const_iterator,struct boost::spirit::scanner_policies >,struct boost::spirit::nil_t,struct boost::spirit::nil_t> > >,class boost::spirit::rule >::const_iterator,struct boost::spirit::scanner_policies >,struct boost::spirit::nil_t,struct boost::spirit::nil_t>,struct boost::spirit::parser,class boost::spirit::strlit >,class boost::spirit::rule >::const_iterator,struct boost::spirit::scanner_policies >,struct boost::spirit::nil_t,struct boost::spirit::nil_t> >,class boost::spirit::rule >::const_iterator,struct boost::spirit::scanner_policies >,struct boost::spirit::nil_t,struct boost::spirit::nil_t> >,struct boost::spirit::sequence,class boost::spirit::strlit >,class boost::spirit::rule >::const_iterator,struct boost::spirit::scanner_policies >,struct boost::spirit::nil_t,struct boost::spirit::nil_t> >,class boost::spirit::rule >::const_iterator,struct boost::spirit::scanner_policies >,struct boost::spirit::nil_t,struct boost::spirit::nil_t> > >,struct boost::spirit::sequence,class boost::spirit::strlit >,class boost::spirit::rule >::const_iterator,struct boost::spirit::scanner_policies >,struct boost::spirit::nil_t,struct boost::spirit::nil_t> >,class boost::spirit::rule >::const_iterator,struct boost::spirit::scanner_policies >,struct boost::spirit::nil_t,struct boost::spirit::nil_t> > >,class boost::spirit::rule >::const_iterator,struct boost::spirit::scanner_policies >,struct boost::spirit::nil_t,struct boost::spirit::nil_t> > > >(struct boost::spirit::alternative,class boost::spirit::strlit >,class boost::spirit::rule >::const_iterator,struct boost::spirit::scanner_policies >,struct boost::spirit::nil_t,struct boost::spirit::nil_t> >,class boost::spirit::rule >::const_iterator,struct boost::spirit::scanner_policies >,struct boost::spirit::nil_t,struct boost::spirit::nil_t> >,struct boost::spirit::sequence,class boost::spirit::strlit >,class boost::spirit::rule >::const_iterator,struct boost::spirit::scanner_policies >,struct boost::spirit::nil_t,struct boost::spirit::nil_t> >,class boost::spirit::rule >::const_iterator,struct boost::spirit::scanner_policies >,struct boost::spirit::nil_t,struct boost::spirit::nil_t> > >,struct boost::spirit::sequence,class boost::spirit::strlit >,class boost::spirit::rule >::const_iterator,struct boost::spirit::scanner_policies >,struct boost::spirit::nil_t,struct boost::spirit::nil_t> >,class boost::spirit::rule >::const_iterator,struct boost::spirit::scanner_policies >,struct boost::spirit::nil_t,struct boost::spirit::nil_t> > > const &,class boost::spirit::rule >::const_iterator,struct boost::spirit::scanner_policies >,struct boost::spirit::nil_t,struct boost::spirit::nil_t> const &) # # to this: # # A=class boost::spirit::rule >::const_iterator,struct boost::spirit::scanner_policies >,struct boost::spirit::nil_t,struct boost::spirit::nil_t> # B=struct boost::spirit::sequence,class boost::spirit::strlit >,A >,A > # C=struct boost::spirit::alternative,B > # D=struct boost::spirit::parser > # # public: __thiscall boost::spirit::binary::binary(C const &,A const &) # # # do this by first replacing [a-z:]+<[^>]+> with new symbol, until everything is a symbol. # then expand again symbols which occur only once. # # while (<>) { s/\s+$//; process($_); } sub process { my $symbol= shift; # first build symbol table, replacing template with symbol. my %symtab; my $n= 0; while ($symbol =~ /((?:\w+\s+)*[_a-z0-9:]+<[^<>]+>)/) { my $s= $1; $symtab{++$n}= $s; $s =~ s/[*+?{().^\$\\\[]/\\$&/g; # escape regexp chars in $s $symbol =~ s/$s/ #${n}# /g; } # now calc the xrefs, how often is each symbol used. my %ref; for my $n (keys %symtab) { my $s= " #${n}# "; $ref{$n}= scalar @{[$symbol =~ /($s)/g]}; $ref{$n}+= scalar @{[$_ =~ /($s)/g]} for values %symtab; } #printf("#%d# : %d\n", $_, $ref{$_}) for keys %ref; # if everything has 1 ref, print the result now. if ($verbose ||!grep { $ref{$_}!=1 } keys %ref) { printf("#%d#: %s\n", $_, $symtab{$_}) for sort { $a<=>$b } keys %symtab; printf("%s\n", $symbol); } # now reexpand symbols that are only used once. for my $n (grep { $ref{$_}==1 } keys %ref) { #printf("%d : %d : %s\n", $n, $count{$n}, $symtab{$n}); my $s= $symtab{$n}; $symtab{$_} =~ s/ #${n}# /$s/g for keys %symtab; $symbol =~ s/ #${n}# /$s/g; delete $symtab{$n}; } # and output the result. if (keys %symtab) { printf("#%d#: %s\n", $_, $symtab{$_}) for sort { $a<=>$b } keys %symtab; printf("%s\n", $symbol); } }