Home | History | Annotate | Line # | Download | only in zlib
zlib2ansi revision 1.1
      1  1.1  christos #!/usr/bin/perl
      2  1.1  christos 
      3  1.1  christos # Transform K&R C function definitions into ANSI equivalent.
      4  1.1  christos #
      5  1.1  christos # Author: Paul Marquess
      6  1.1  christos # Version: 1.0
      7  1.1  christos # Date: 3 October 2006
      8  1.1  christos 
      9  1.1  christos # TODO
     10  1.1  christos #
     11  1.1  christos # Asumes no function pointer parameters. unless they are typedefed.
     12  1.1  christos # Assumes no literal strings that look like function definitions
     13  1.1  christos # Assumes functions start at the beginning of a line
     14  1.1  christos 
     15  1.1  christos use strict;
     16  1.1  christos use warnings;
     17  1.1  christos 
     18  1.1  christos local $/;
     19  1.1  christos $_ = <>;
     20  1.1  christos 
     21  1.1  christos my $sp = qr{ \s* (?: /\* .*? \*/ )? \s* }x; # assume no nested comments
     22  1.1  christos 
     23  1.1  christos my $d1    = qr{ $sp (?: [\w\*\s]+ $sp)* $sp \w+ $sp [\[\]\s]* $sp }x ;
     24  1.1  christos my $decl  = qr{ $sp (?: \w+ $sp )+ $d1 }xo ;
     25  1.1  christos my $dList = qr{ $sp $decl (?: $sp , $d1 )* $sp ; $sp }xo ;
     26  1.1  christos 
     27  1.1  christos 
     28  1.1  christos while (s/^
     29  1.1  christos             (                  # Start $1
     30  1.1  christos                 (              #   Start $2
     31  1.1  christos                     .*?        #     Minimal eat content
     32  1.1  christos                     ( ^ \w [\w\s\*]+ )    #     $3 -- function name
     33  1.1  christos                     \s*        #     optional whitespace
     34  1.1  christos                 )              # $2 - Matched up to before parameter list
     35  1.1  christos 
     36  1.1  christos                 \( \s*         # Literal "(" + optional whitespace
     37  1.1  christos                 ( [^\)]+ )     # $4 - one or more anythings except ")"
     38  1.1  christos                 \s* \)         # optional whitespace surrounding a Literal ")"
     39  1.1  christos 
     40  1.1  christos                 ( (?: $dList )+ ) # $5
     41  1.1  christos 
     42  1.1  christos                 $sp ^ {        # literal "{" at start of line
     43  1.1  christos             )                  # Remember to $1
     44  1.1  christos         //xsom
     45  1.1  christos       )
     46  1.1  christos {
     47  1.1  christos     my $all = $1 ;
     48  1.1  christos     my $prefix = $2;
     49  1.1  christos     my $param_list = $4 ;
     50  1.1  christos     my $params = $5;
     51  1.1  christos 
     52  1.1  christos     StripComments($params);
     53  1.1  christos     StripComments($param_list);
     54  1.1  christos     $param_list =~ s/^\s+//;
     55  1.1  christos     $param_list =~ s/\s+$//;
     56  1.1  christos 
     57  1.1  christos     my $i = 0 ;
     58  1.1  christos     my %pList = map { $_ => $i++ }
     59  1.1  christos                 split /\s*,\s*/, $param_list;
     60  1.1  christos     my $pMatch = '(\b' . join('|', keys %pList) . '\b)\W*$' ;
     61  1.1  christos 
     62  1.1  christos     my @params = split /\s*;\s*/, $params;
     63  1.1  christos     my @outParams = ();
     64  1.1  christos     foreach my $p (@params)
     65  1.1  christos     {
     66  1.1  christos         if ($p =~ /,/)
     67  1.1  christos         {
     68  1.1  christos             my @bits = split /\s*,\s*/, $p;
     69  1.1  christos             my $first = shift @bits;
     70  1.1  christos             $first =~ s/^\s*//;
     71  1.1  christos             push @outParams, $first;
     72  1.1  christos             $first =~ /^(\w+\s*)/;
     73  1.1  christos             my $type = $1 ;
     74  1.1  christos             push @outParams, map { $type . $_ } @bits;
     75  1.1  christos         }
     76  1.1  christos         else
     77  1.1  christos         {
     78  1.1  christos             $p =~ s/^\s+//;
     79  1.1  christos             push @outParams, $p;
     80  1.1  christos         }
     81  1.1  christos     }
     82  1.1  christos 
     83  1.1  christos 
     84  1.1  christos     my %tmp = map { /$pMatch/;  $_ => $pList{$1}  }
     85  1.1  christos               @outParams ;
     86  1.1  christos 
     87  1.1  christos     @outParams = map  { "    $_" }
     88  1.1  christos                  sort { $tmp{$a} <=> $tmp{$b} }
     89  1.1  christos                  @outParams ;
     90  1.1  christos 
     91  1.1  christos     print $prefix ;
     92  1.1  christos     print "(\n" . join(",\n", @outParams) . ")\n";
     93  1.1  christos     print "{" ;
     94  1.1  christos 
     95  1.1  christos }
     96  1.1  christos 
     97  1.1  christos # Output any trailing code.
     98  1.1  christos print ;
     99  1.1  christos exit 0;
    100  1.1  christos 
    101  1.1  christos 
    102  1.1  christos sub StripComments
    103  1.1  christos {
    104  1.1  christos 
    105  1.1  christos   no warnings;
    106  1.1  christos 
    107  1.1  christos   # Strip C & C++ coments
    108  1.1  christos   # From the perlfaq
    109  1.1  christos   $_[0] =~
    110  1.1  christos 
    111  1.1  christos     s{
    112  1.1  christos        /\*         ##  Start of /* ... */ comment
    113  1.1  christos        [^*]*\*+    ##  Non-* followed by 1-or-more *'s
    114  1.1  christos        (
    115  1.1  christos          [^/*][^*]*\*+
    116  1.1  christos        )*          ##  0-or-more things which don't start with /
    117  1.1  christos                    ##    but do end with '*'
    118  1.1  christos        /           ##  End of /* ... */ comment
    119  1.1  christos 
    120  1.1  christos      |         ##     OR  C++ Comment
    121  1.1  christos        //          ## Start of C++ comment //
    122  1.1  christos        [^\n]*      ## followed by 0-or-more non end of line characters
    123  1.1  christos 
    124  1.1  christos      |         ##     OR  various things which aren't comments:
    125  1.1  christos 
    126  1.1  christos        (
    127  1.1  christos          "           ##  Start of " ... " string
    128  1.1  christos          (
    129  1.1  christos            \\.           ##  Escaped char
    130  1.1  christos          |               ##    OR
    131  1.1  christos            [^"\\]        ##  Non "\
    132  1.1  christos          )*
    133  1.1  christos          "           ##  End of " ... " string
    134  1.1  christos 
    135  1.1  christos        |         ##     OR
    136  1.1  christos 
    137  1.1  christos          '           ##  Start of ' ... ' string
    138  1.1  christos          (
    139  1.1  christos            \\.           ##  Escaped char
    140  1.1  christos          |               ##    OR
    141  1.1  christos            [^'\\]        ##  Non '\
    142  1.1  christos          )*
    143  1.1  christos          '           ##  End of ' ... ' string
    144  1.1  christos 
    145  1.1  christos        |         ##     OR
    146  1.1  christos 
    147  1.1  christos          .           ##  Anything other char
    148  1.1  christos          [^/"'\\]*   ##  Chars which doesn't start a comment, string or escape
    149  1.1  christos        )
    150  1.1  christos      }{$2}gxs;
    151  1.1  christos 
    152  1.1  christos }
    153