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