#! /usr/bin/env perl
use strict;
use warnings;
use File::Temp qw/tempfile/;
my $topdir = shift;
processallfiles($topdir);
print "Success\n";
sub processallfiles {
my $dir = shift;
my @files = glob "$dir/*.c $dir/*.h $dir/*.h.in $dir/*.pod *dir/*.pod.in";
open (my $STDOUT_ORIG, '>&', STDOUT);
foreach my $file (@files) {
my ($tmpfh, $tmpfile) = tempfile();
print "Processing $file\n";
open(STDOUT, '>>', $tmpfile);
open(INFILE, $file);
processfile(\*INFILE);
close(STDOUT);
rename($tmpfile, $file);
unlink($tmpfile);
# restore STDOUT
open (STDOUT, '>&', $STDOUT_ORIG);
}
#Recurse through subdirs
opendir my $dh, $dir or die "Cannot open directory";
while (defined(my $subdir = readdir $dh)) {
next unless -d "$dir/$subdir";
next if (rindex $subdir, ".", 0) == 0;
processallfiles("$dir/$subdir");
}
closedir $dh;
}
sub processfile {
my $fh = shift;
my $multiline = 0;
my @params;
my $indent;
my $paramstr = "";
foreach my $line (<$fh>) {
chomp($line);
if (!$multiline) {
if ($line =~ /^(.+)_with_libctx\((.*[^\\])$/) {
my $preline = $1;
my $postline = $2;
#Strip trailing whitespace
$postline =~ s/\s+$//;
print $preline.'_ex(';
my @rets = extracttoclose($postline);
if (@rets) {
print "$postline\n";
$multiline = 0;
} else {
$multiline = 1;
$paramstr = $postline;
$indent = (length $preline) + (length '_ex(');
}
} else {
#Any other reference to _with_libctx we just replace
$line =~ s/_with_libctx/_ex/g;
print $line."\n";
}
} else {
#Strip leading whitespace
$line =~ s/^\s+//;
#Strip trailing whitespace
$line =~ s/\s+$//;
my @rets = extracttoclose($paramstr.$line);
if (@rets) {
my $pre = shift @rets;
my $post = shift @rets;
@params = split(",", $pre);
my @params = grep(s/^\s*|\s*$//g, @params);
formatparams($indent, @params);
print ')'.$post."\n";
$multiline = 0;
} else {
$paramstr .= $line;
}
}
}
die "End of multiline not found" if $multiline;
}
sub formatparams {
my $indent = shift;
my @params = @_;
if (@params) {
my $param = shift @params;
my $lensofar += $indent + (length $param) + 1;
print "$param";
print "," if @params;
while (@params) {
my $param = shift @params;
if (($lensofar + (length $param) + 2) > 80) {
print "\n".(" " x $indent);
print $param;
$lensofar = $indent + (length $param) + 1;
} else {
print ' '.$param;
$lensofar += (length $param) + 2;
}
print "," if @params;
}
}
}
sub extracttoclose {
my $inline = shift;
my $outline = "";
while ($inline =~ /^([^\)]*?)\((.*)$/) {
my @rets = extracttoclose($2);
if (!@rets) {
return ();
}
my $inside = shift @rets;
my $post = shift @rets;
$outline .= $1.'('.$inside.')';
$inline = $post;
}
if ($inline =~ /^(.*?)\)(.*)$/) {
return ($outline.$1, $2);
}
return ();
}