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