Home | History | Annotate | Line # | Download | only in util
      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