#! /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 (); }