"Fossies" - the Fresh Open Source Software Archive

Member "muscle/zlib/zlib/zlib2ansi" (8 Jun 2019, 3895 Bytes) of package /linux/privat/muscle7.30.zip:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) Perl source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file.

    1 #!/usr/bin/perl
    2 
    3 # Transform K&R C function definitions into ANSI equivalent.
    4 #
    5 # Author: Paul Marquess
    6 # Version: 1.0
    7 # Date: 3 October 2006
    8 
    9 # TODO
   10 #
   11 # Asumes no function pointer parameters. unless they are typedefed.
   12 # Assumes no literal strings that look like function definitions
   13 # Assumes functions start at the beginning of a line
   14 
   15 use strict;
   16 use warnings;
   17 
   18 local $/;
   19 $_ = <>;
   20 
   21 my $sp = qr{ \s* (?: /\* .*? \*/ )? \s* }x; # assume no nested comments
   22 
   23 my $d1    = qr{ $sp (?: [\w\*\s]+ $sp)* $sp \w+ $sp [\[\]\s]* $sp }x ;
   24 my $decl  = qr{ $sp (?: \w+ $sp )+ $d1 }xo ;
   25 my $dList = qr{ $sp $decl (?: $sp , $d1 )* $sp ; $sp }xo ;
   26 
   27 
   28 while (s/^
   29             (                  # Start $1
   30                 (              #   Start $2
   31                     .*?        #     Minimal eat content
   32                     ( ^ \w [\w\s\*]+ )    #     $3 -- function name
   33                     \s*        #     optional whitespace
   34                 )              # $2 - Matched up to before parameter list
   35 
   36                 \( \s*         # Literal "(" + optional whitespace
   37                 ( [^\)]+ )     # $4 - one or more anythings except ")"
   38                 \s* \)         # optional whitespace surrounding a Literal ")"
   39 
   40                 ( (?: $dList )+ ) # $5
   41 
   42                 $sp ^ {        # literal "{" at start of line
   43             )                  # Remember to $1
   44         //xsom
   45       )
   46 {
   47     my $all = $1 ;
   48     my $prefix = $2;
   49     my $param_list = $4 ;
   50     my $params = $5;
   51 
   52     StripComments($params);
   53     StripComments($param_list);
   54     $param_list =~ s/^\s+//;
   55     $param_list =~ s/\s+$//;
   56 
   57     my $i = 0 ;
   58     my %pList = map { $_ => $i++ }
   59                 split /\s*,\s*/, $param_list;
   60     my $pMatch = '(\b' . join('|', keys %pList) . '\b)\W*$' ;
   61 
   62     my @params = split /\s*;\s*/, $params;
   63     my @outParams = ();
   64     foreach my $p (@params)
   65     {
   66         if ($p =~ /,/)
   67         {
   68             my @bits = split /\s*,\s*/, $p;
   69             my $first = shift @bits;
   70             $first =~ s/^\s*//;
   71             push @outParams, $first;
   72             $first =~ /^(\w+\s*)/;
   73             my $type = $1 ;
   74             push @outParams, map { $type . $_ } @bits;
   75         }
   76         else
   77         {
   78             $p =~ s/^\s+//;
   79             push @outParams, $p;
   80         }
   81     }
   82 
   83 
   84     my %tmp = map { /$pMatch/;  $_ => $pList{$1}  }
   85               @outParams ;
   86 
   87     @outParams = map  { "    $_" }
   88                  sort { $tmp{$a} <=> $tmp{$b} }
   89                  @outParams ;
   90 
   91     print $prefix ;
   92     print "(\n" . join(",\n", @outParams) . ")\n";
   93     print "{" ;
   94 
   95 }
   96 
   97 # Output any trailing code.
   98 print ;
   99 exit 0;
  100 
  101 
  102 sub StripComments
  103 {
  104 
  105   no warnings;
  106 
  107   # Strip C & C++ coments
  108   # From the perlfaq
  109   $_[0] =~
  110 
  111     s{
  112        /\*         ##  Start of /* ... */ comment
  113        [^*]*\*+    ##  Non-* followed by 1-or-more *'s
  114        (
  115          [^/*][^*]*\*+
  116        )*          ##  0-or-more things which don't start with /
  117                    ##    but do end with '*'
  118        /           ##  End of /* ... */ comment
  119 
  120      |         ##     OR  C++ Comment
  121        //          ## Start of C++ comment //
  122        [^\n]*      ## followed by 0-or-more non end of line characters
  123 
  124      |         ##     OR  various things which aren't comments:
  125 
  126        (
  127          "           ##  Start of " ... " string
  128          (
  129            \\.           ##  Escaped char
  130          |               ##    OR
  131            [^"\\]        ##  Non "\
  132          )*
  133          "           ##  End of " ... " string
  134 
  135        |         ##     OR
  136 
  137          '           ##  Start of ' ... ' string
  138          (
  139            \\.           ##  Escaped char
  140          |               ##    OR
  141            [^'\\]        ##  Non '\
  142          )*
  143          '           ##  End of ' ... ' string
  144 
  145        |         ##     OR
  146 
  147          .           ##  Anything other char
  148          [^/"'\\]*   ##  Chars which doesn't start a comment, string or escape
  149        )
  150      }{$2}gxs;
  151 
  152 }