| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 | #!/usr/bin/perl# Transform K&R C function definitions into ANSI equivalent.## Author: Paul Marquess# Version: 1.0# Date: 3 October 2006# TODO## Asumes no function pointer parameters. unless they are typedefed.# Assumes no literal strings that look like function definitions# Assumes functions start at the beginning of a lineuse strict;use warnings;local $/;$_ = <>;my $sp = qr{ \s* (?: /\* .*? \*/ )? \s* }x; # assume no nested commentsmy $d1    = qr{ $sp (?: [\w\*\s]+ $sp)* $sp \w+ $sp [\[\]\s]* $sp }x ;my $decl  = qr{ $sp (?: \w+ $sp )+ $d1 }xo ;my $dList = qr{ $sp $decl (?: $sp , $d1 )* $sp ; $sp }xo ;while (s/^            (                  # Start $1                (              #   Start $2                    .*?        #     Minimal eat content                    ( ^ \w [\w\s\*]+ )    #     $3 -- function name                    \s*        #     optional whitespace                )              # $2 - Matched up to before parameter list                \( \s*         # Literal "(" + optional whitespace                ( [^\)]+ )     # $4 - one or more anythings except ")"                \s* \)         # optional whitespace surrounding a Literal ")"                ( (?: $dList )+ ) # $5                $sp ^ {        # literal "{" at start of line            )                  # Remember to $1        //xsom      ){    my $all = $1 ;    my $prefix = $2;    my $param_list = $4 ;    my $params = $5;    StripComments($params);    StripComments($param_list);    $param_list =~ s/^\s+//;    $param_list =~ s/\s+$//;    my $i = 0 ;    my %pList = map { $_ => $i++ }                split /\s*,\s*/, $param_list;    my $pMatch = '(\b' . join('|', keys %pList) . '\b)\W*$' ;    my @params = split /\s*;\s*/, $params;    my @outParams = ();    foreach my $p (@params)    {        if ($p =~ /,/)        {            my @bits = split /\s*,\s*/, $p;            my $first = shift @bits;            $first =~ s/^\s*//;            push @outParams, $first;            $first =~ /^(\w+\s*)/;            my $type = $1 ;            push @outParams, map { $type . $_ } @bits;        }        else        {            $p =~ s/^\s+//;            push @outParams, $p;        }    }    my %tmp = map { /$pMatch/;  $_ => $pList{$1}  }              @outParams ;    @outParams = map  { "    $_" }                 sort { $tmp{$a} <=> $tmp{$b} }                 @outParams ;    print $prefix ;    print "(\n" . join(",\n", @outParams) . ")\n";    print "{" ;}# Output any trailing code.print ;exit 0;sub StripComments{  no warnings;  # Strip C & C++ coments  # From the perlfaq  $_[0] =~    s{       /\*         ##  Start of /* ... */ comment       [^*]*\*+    ##  Non-* followed by 1-or-more *'s       (         [^/*][^*]*\*+       )*          ##  0-or-more things which don't start with /                   ##    but do end with '*'       /           ##  End of /* ... */ comment     |         ##     OR  C++ Comment       //          ## Start of C++ comment //       [^\n]*      ## followed by 0-or-more non end of line characters     |         ##     OR  various things which aren't comments:       (         "           ##  Start of " ... " string         (           \\.           ##  Escaped char         |               ##    OR           [^"\\]        ##  Non "\         )*         "           ##  End of " ... " string       |         ##     OR         '           ##  Start of ' ... ' string         (           \\.           ##  Escaped char         |               ##    OR           [^'\\]        ##  Non '\         )*         '           ##  End of ' ... ' string       |         ##     OR         .           ##  Anything other char         [^/"'\\]*   ##  Chars which doesn't start a comment, string or escape       )     }{$2}gxs;}
 |