Provide script for filtering data initialisers for structs/unions. indent just can...
authorMatt Caswell <matt@openssl.org>
Tue, 20 Jan 2015 12:37:42 +0000 (12:37 +0000)
committerMatt Caswell <matt@openssl.org>
Thu, 22 Jan 2015 09:20:07 +0000 (09:20 +0000)
Reviewed-by: Tim Hudson <tjh@openssl.org>
util/openssl-format-source
util/su-filter.pl [new file with mode: 0644]

index 881eb0a..1e0185d 100755 (executable)
@@ -124,6 +124,7 @@ do
              | perl -np \
                -e 's/(STACK_OF|LHASH_OF)_([^ \t,]+)_( |\/)/$1($2)$3/g;' \
                -e 's/(STACK_OF|LHASH_OF)_([^ \t,]+)_$/$1($2)/g;' \
+             | perl util/su-filter.pl \
              > "$tmp"
          else
            expand "$j" | indent $INDENT_ARGS > "$tmp"
diff --git a/util/su-filter.pl b/util/su-filter.pl
new file mode 100644 (file)
index 0000000..854644b
--- /dev/null
@@ -0,0 +1,253 @@
+#!/usr/bin/env perl
+#
+# su-filter.pl
+#
+use strict;
+
+my $in_su = 0;
+my $indent = 0;
+my $out;
+my $braces = 0;
+my $arrcnt;
+my $data;
+my $tststr;
+my $incomm = 0;
+
+while(<>) {
+    $tststr = $_;
+    $incomm++ while $tststr =~ /\/\*/g;
+    $incomm-- while $tststr =~ /\*\//g;
+
+    if($in_su == 1) {
+        if(/}(.*);/) {
+            $out .= $_;
+            print $out;
+            $in_su = 0;
+        } elsif(/^ *\} [^\s]+(\[\d*\])* = \{/) {
+           $tststr = $1;
+           $arrcnt = 0;
+           $arrcnt++ while $tststr =~ /\[/g;
+           $in_su++;
+           $braces = 1;
+           /^(.* = \{)(.*)$/;
+           $data = $2;
+           $out .= $1."\n";
+        } else {
+            $out .= $_;
+        }
+    } elsif($in_su == 2) {
+        $data .= $_;
+        if(/};$/) {
+            #$data = "\n$data";
+            $data =~ s/\n */\n/g;
+            $data =~ s/};\n?//s;
+            my @strucdata = structureData($data);
+            $out .= displayData($indent, 0, \@strucdata);
+            $out .= "\n$indent};\n";
+            print $out;
+            $in_su = 0;
+        }
+    } elsif($incomm <= 0 && /( *)(static )?(const )?(union|struct) ([^\s]+ )?\{/) {
+        $in_su = 1;
+        $indent = $1;
+        $out = $_;
+        next;
+    } else {
+        print $_;
+    }
+}
+
+
+sub structureData {
+    my $data = $_[0];
+    my @datalist = split(/(\{|\}|,|"|#|\n|\/\*|\*\/|\(|\))/, $data);
+    my $item;
+    my $dataitem = "";
+    my @struclist = ();
+    my $substruc;
+    my $inquote = 0;
+    my $inbrace = 0;
+    my $preproc = 0;
+    my $comment = 0;
+    my $inparen = 0;
+
+
+    foreach $item (@datalist) {
+        if($comment) {
+            if($item eq "*/") {
+                $comment = 0;
+                $dataitem .= "*/";
+                push @struclist, $dataitem;
+                $dataitem = "";
+                next;
+            }
+            $dataitem .= $item;
+            next;
+        }
+        if($inquote) {
+            $dataitem .= $item;
+            if($item eq "\"") {
+                $inquote--;
+            }
+            next;
+        }
+        if($preproc) {
+            if($item eq "\n") {
+                $preproc = 0;
+                push @struclist, $dataitem;
+                $dataitem = "";
+                next;
+            }
+            $dataitem .= $item;
+            next;
+        }
+        if($inbrace) {
+            if($item eq "}") {
+                $inbrace --;
+            
+                if(!$inbrace) {
+                    $substruc = structureData($dataitem);
+                    $dataitem = $substruc;
+                    next;
+                }
+            } elsif($item eq "{") {
+                $inbrace++;
+            } elsif ($item eq "\"") {
+                $inquote++;
+            }
+            $dataitem .= $item;
+            next;
+        }
+        if($inparen) {
+            if($item eq ")") {
+                $inparen--;
+            }
+            $dataitem .= $item;
+            next;
+        }
+        if($item eq "\n") {
+            next;
+        }
+        if($item eq "#") {
+            $preproc = 1;
+            push @struclist, $dataitem;
+            $dataitem = "#";
+            next;
+        }
+        if($item eq "/*") {
+            $comment = 1;
+            push @struclist, $dataitem;
+            $dataitem= "/*";
+            next;
+        }
+        if($item eq "\"") {
+            $dataitem .= $item;
+            $inquote++;
+            next;
+        }
+        if($item eq "{") {
+            $inbrace++;
+            next;
+        }
+        if($item eq ",") {
+            push @struclist, $dataitem;
+            $dataitem = "";
+            next;
+        }
+        if($item eq "(") {
+            $dataitem .= $item;
+            $inparen++;
+            next;
+        }
+        if($item =~ /^\s*$/) {
+            next;
+        }
+        if(ref $dataitem eq 'ARRAY') {
+            push @struclist, $dataitem;
+            $dataitem = "";
+        }
+        $dataitem .= $item;
+    }
+    push @struclist, $dataitem;
+    return \@struclist;
+}
+
+sub displayData {
+    my $indent = shift;
+    my $depth = shift;
+    my $data = shift;
+    my $item;
+    my $out = "";
+    my $currline = "";
+    my $first = 1;
+    my $prevpreproc = 0;
+    my $prevcomment = 0;
+
+    foreach $item (@{$data}) {
+        if($item =~ /^\/\*/) {
+            #Comment
+            $item =~ s/\n/\n$indent/g;
+            if($out =~ /\n\s*$/s) {
+                $out .= $item."\n".$indent;
+            } else {
+                $out .= "\n".$indent.$item."\n".$indent;
+            }
+            $currline = $indent;
+            $prevcomment = 1;
+            next;
+        }
+        $item =~ s/^\s+//;
+        if($item =~ /^#/) {
+            #Pre-processor directive
+            if($out =~ /\n\s*$/s) {
+                $out =~ s/\n\s*$/\n/;
+                $out .= $item."\n".$indent;
+            } else {
+                $out .= "\n".$item."\n".$indent;
+            }
+            $currline = $indent;
+            $prevpreproc = 1;
+            next;
+        }
+        if($first) {
+            $first = 0;
+            if($depth != 0) {
+                $out .= $indent;
+                $currline = $indent;
+            }
+        } else {
+            if(!$prevpreproc && !$prevcomment) {
+                $out .= ", ";
+                $currline .= ", ";
+                if($depth == 1) {
+                    $out .= "\n";
+                    $currline = "";
+                }
+                if($depth == 1) {
+                    $out .= $indent;
+                    $currline .= $indent;
+                }
+            }
+
+        }
+        $prevpreproc = 0;
+        $prevcomment = 0;
+
+        if (ref $item eq 'ARRAY') {
+            if($depth == 0) {
+                $out .= displayData("$indent    ", $depth+1, $item);
+            } else {
+                $out .= "{\n".displayData("$indent    ", $depth+1, $item)."\n".$indent."}";
+                $currline = $indent."}";
+            }
+        } else {
+            if(length $currline.$item > 79) {
+                $currline = $indent;
+                $out .= "\n$indent";
+            }
+            $out .= $item;
+            $currline .= $item;
+        }
+    }
+    return $out;
+}