1 1.1 christos #! /usr/bin/env perl 2 1.1 christos 3 1.1 christos use strict; 4 1.1 christos use warnings; 5 1.1 christos use File::Temp qw/tempfile/; 6 1.1 christos 7 1.1 christos my $topdir = shift; 8 1.1 christos 9 1.1 christos processallfiles($topdir); 10 1.1 christos print "Success\n"; 11 1.1 christos 12 1.1 christos sub processallfiles { 13 1.1 christos my $dir = shift; 14 1.1 christos my @files = glob "$dir/*.c $dir/*.h $dir/*.h.in $dir/*.pod *dir/*.pod.in"; 15 1.1 christos 16 1.1 christos open (my $STDOUT_ORIG, '>&', STDOUT); 17 1.1 christos 18 1.1 christos foreach my $file (@files) { 19 1.1 christos my ($tmpfh, $tmpfile) = tempfile(); 20 1.1 christos 21 1.1 christos print "Processing $file\n"; 22 1.1 christos open(STDOUT, '>>', $tmpfile); 23 1.1 christos open(INFILE, $file); 24 1.1 christos processfile(\*INFILE); 25 1.1 christos close(STDOUT); 26 1.1 christos rename($tmpfile, $file); 27 1.1 christos unlink($tmpfile); 28 1.1 christos # restore STDOUT 29 1.1 christos open (STDOUT, '>&', $STDOUT_ORIG); 30 1.1 christos } 31 1.1 christos 32 1.1 christos #Recurse through subdirs 33 1.1 christos opendir my $dh, $dir or die "Cannot open directory"; 34 1.1 christos 35 1.1 christos while (defined(my $subdir = readdir $dh)) { 36 1.1 christos next unless -d "$dir/$subdir"; 37 1.1 christos next if (rindex $subdir, ".", 0) == 0; 38 1.1 christos processallfiles("$dir/$subdir"); 39 1.1 christos } 40 1.1 christos closedir $dh; 41 1.1 christos } 42 1.1 christos 43 1.1 christos sub processfile { 44 1.1 christos my $fh = shift; 45 1.1 christos my $multiline = 0; 46 1.1 christos my @params; 47 1.1 christos my $indent; 48 1.1 christos my $paramstr = ""; 49 1.1 christos 50 1.1 christos foreach my $line (<$fh>) { 51 1.1 christos chomp($line); 52 1.1 christos if (!$multiline) { 53 1.1 christos if ($line =~ /^(.+)_with_libctx\((.*[^\\])$/) { 54 1.1 christos my $preline = $1; 55 1.1 christos my $postline = $2; 56 1.1 christos #Strip trailing whitespace 57 1.1 christos $postline =~ s/\s+$//; 58 1.1 christos print $preline.'_ex('; 59 1.1 christos my @rets = extracttoclose($postline); 60 1.1 christos if (@rets) { 61 1.1 christos print "$postline\n"; 62 1.1 christos $multiline = 0; 63 1.1 christos } else { 64 1.1 christos $multiline = 1; 65 1.1 christos $paramstr = $postline; 66 1.1 christos $indent = (length $preline) + (length '_ex('); 67 1.1 christos } 68 1.1 christos } else { 69 1.1 christos #Any other reference to _with_libctx we just replace 70 1.1 christos $line =~ s/_with_libctx/_ex/g; 71 1.1 christos print $line."\n"; 72 1.1 christos } 73 1.1 christos } else { 74 1.1 christos #Strip leading whitespace 75 1.1 christos $line =~ s/^\s+//; 76 1.1 christos #Strip trailing whitespace 77 1.1 christos $line =~ s/\s+$//; 78 1.1 christos my @rets = extracttoclose($paramstr.$line); 79 1.1 christos if (@rets) { 80 1.1 christos my $pre = shift @rets; 81 1.1 christos my $post = shift @rets; 82 1.1 christos @params = split(",", $pre); 83 1.1 christos my @params = grep(s/^\s*|\s*$//g, @params); 84 1.1 christos formatparams($indent, @params); 85 1.1 christos print ')'.$post."\n"; 86 1.1 christos $multiline = 0; 87 1.1 christos } else { 88 1.1 christos $paramstr .= $line; 89 1.1 christos } 90 1.1 christos } 91 1.1 christos } 92 1.1 christos 93 1.1 christos die "End of multiline not found" if $multiline; 94 1.1 christos } 95 1.1 christos 96 1.1 christos sub formatparams { 97 1.1 christos my $indent = shift; 98 1.1 christos my @params = @_; 99 1.1 christos 100 1.1 christos if (@params) { 101 1.1 christos my $param = shift @params; 102 1.1 christos my $lensofar += $indent + (length $param) + 1; 103 1.1 christos 104 1.1 christos print "$param"; 105 1.1 christos print "," if @params; 106 1.1 christos 107 1.1 christos while (@params) { 108 1.1 christos my $param = shift @params; 109 1.1 christos 110 1.1 christos if (($lensofar + (length $param) + 2) > 80) { 111 1.1 christos print "\n".(" " x $indent); 112 1.1 christos print $param; 113 1.1 christos $lensofar = $indent + (length $param) + 1; 114 1.1 christos } else { 115 1.1 christos print ' '.$param; 116 1.1 christos $lensofar += (length $param) + 2; 117 1.1 christos } 118 1.1 christos print "," if @params; 119 1.1 christos } 120 1.1 christos } 121 1.1 christos } 122 1.1 christos 123 1.1 christos sub extracttoclose { 124 1.1 christos my $inline = shift; 125 1.1 christos my $outline = ""; 126 1.1 christos 127 1.1 christos while ($inline =~ /^([^\)]*?)\((.*)$/) { 128 1.1 christos my @rets = extracttoclose($2); 129 1.1 christos if (!@rets) { 130 1.1 christos return (); 131 1.1 christos } 132 1.1 christos my $inside = shift @rets; 133 1.1 christos my $post = shift @rets; 134 1.1 christos $outline .= $1.'('.$inside.')'; 135 1.1 christos $inline = $post; 136 1.1 christos } 137 1.1 christos if ($inline =~ /^(.*?)\)(.*)$/) { 138 1.1 christos return ($outline.$1, $2); 139 1.1 christos } 140 1.1 christos return (); 141 1.1 christos } 142