Blame util/su-filter.pl

Packit Service 084de1
#! /usr/bin/env perl
Packit Service 084de1
# Copyright 2015-2016 The OpenSSL Project Authors. All Rights Reserved.
Packit Service 084de1
#
Packit Service 084de1
# Licensed under the OpenSSL license (the "License").  You may not use
Packit Service 084de1
# this file except in compliance with the License.  You can obtain a copy
Packit Service 084de1
# in the file LICENSE in the source distribution or at
Packit Service 084de1
# https://www.openssl.org/source/license.html
Packit Service 084de1
Packit Service 084de1
use strict;
Packit Service 084de1
Packit Service 084de1
my $in_su = 0;
Packit Service 084de1
my $indent = 0;
Packit Service 084de1
my $out;
Packit Service 084de1
my $braces = 0;
Packit Service 084de1
my $arrcnt;
Packit Service 084de1
my $data;
Packit Service 084de1
my $tststr;
Packit Service 084de1
my $incomm = 0;
Packit Service 084de1
Packit Service 084de1
while(<>) {
Packit Service 084de1
    $tststr = $_;
Packit Service 084de1
    $incomm++ while $tststr =~ /\/\*/g;
Packit Service 084de1
    $incomm-- while $tststr =~ /\*\//g;
Packit Service 084de1
Packit Service 084de1
    if($in_su == 1) {
Packit Service 084de1
        if(/}(.*);/) {
Packit Service 084de1
            $out .= $_;
Packit Service 084de1
            do_output($out);
Packit Service 084de1
            $in_su = 0;
Packit Service 084de1
        } elsif(/^ *\} [^\s]+(\[\d*\])* = \{/) {
Packit Service 084de1
           $tststr = $1;
Packit Service 084de1
           $arrcnt = 0;
Packit Service 084de1
           $arrcnt++ while $tststr =~ /\[/g;
Packit Service 084de1
           $in_su++;
Packit Service 084de1
           $braces = 1;
Packit Service 084de1
           /^(.* = \{)(.*)$/;
Packit Service 084de1
           $data = $2;
Packit Service 084de1
           $out .= $1."\n";
Packit Service 084de1
        } else {
Packit Service 084de1
            $out .= $_;
Packit Service 084de1
        }
Packit Service 084de1
    } elsif($in_su == 2) {
Packit Service 084de1
        $data .= $_;
Packit Service 084de1
        if(/};$/) {
Packit Service 084de1
            #$data = "\n$data";
Packit Service 084de1
            $data =~ s/\n */\n/g;
Packit Service 084de1
            $data =~ s/};\n?//s;
Packit Service 084de1
            my @strucdata = structureData($data);
Packit Service 084de1
            $out .= displayData($indent, 0, \@strucdata);
Packit Service 084de1
            $out .= "\n$indent};\n";
Packit Service 084de1
            do_output($out);
Packit Service 084de1
            $in_su = 0;
Packit Service 084de1
        }
Packit Service 084de1
    } elsif($incomm <= 0 && /( *)(static )?(const )?(union|struct) ([a-zA-Z_\$][\$0-9a-zA-Z_]+ )?\{/) {
Packit Service 084de1
        $in_su = 1;
Packit Service 084de1
        $indent = $1;
Packit Service 084de1
        $out = $_;
Packit Service 084de1
        next;
Packit Service 084de1
    } else {
Packit Service 084de1
        do_output($_);
Packit Service 084de1
    }
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
Packit Service 084de1
sub structureData {
Packit Service 084de1
    my $data = $_[0];
Packit Service 084de1
    my @datalist = split(/(\{|\}|,|"|#|\n|\/\*|\*\/|\(|\))/, $data);
Packit Service 084de1
    my $item;
Packit Service 084de1
    my $dataitem = "";
Packit Service 084de1
    my @struclist = ();
Packit Service 084de1
    my $substruc;
Packit Service 084de1
    my $inquote = 0;
Packit Service 084de1
    my $inbrace = 0;
Packit Service 084de1
    my $preproc = 0;
Packit Service 084de1
    my $comment = 0;
Packit Service 084de1
    my $inparen = 0;
Packit Service 084de1
Packit Service 084de1
Packit Service 084de1
    foreach $item (@datalist) {
Packit Service 084de1
        if($comment) {
Packit Service 084de1
            if($item eq "*/") {
Packit Service 084de1
                $comment = 0;
Packit Service 084de1
                $dataitem .= "*/";
Packit Service 084de1
                push @struclist, $dataitem;
Packit Service 084de1
                $dataitem = "";
Packit Service 084de1
                next;
Packit Service 084de1
            }
Packit Service 084de1
            $dataitem .= $item;
Packit Service 084de1
            next;
Packit Service 084de1
        }
Packit Service 084de1
        if($inquote) {
Packit Service 084de1
            $dataitem .= $item;
Packit Service 084de1
            if($item eq "\"") {
Packit Service 084de1
                $inquote--;
Packit Service 084de1
            }
Packit Service 084de1
            next;
Packit Service 084de1
        }
Packit Service 084de1
        if($preproc) {
Packit Service 084de1
            if($item eq "\n") {
Packit Service 084de1
                $preproc = 0;
Packit Service 084de1
                push @struclist, $dataitem;
Packit Service 084de1
                $dataitem = "";
Packit Service 084de1
                next;
Packit Service 084de1
            }
Packit Service 084de1
            $dataitem .= $item;
Packit Service 084de1
            next;
Packit Service 084de1
        }
Packit Service 084de1
        if($inbrace) {
Packit Service 084de1
            if($item eq "}") {
Packit Service 084de1
                $inbrace --;
Packit Service 084de1
Packit Service 084de1
                if(!$inbrace) {
Packit Service 084de1
                    $substruc = structureData($dataitem);
Packit Service 084de1
                    $dataitem = $substruc;
Packit Service 084de1
                    next;
Packit Service 084de1
                }
Packit Service 084de1
            } elsif($item eq "{") {
Packit Service 084de1
                $inbrace++;
Packit Service 084de1
            } elsif ($item eq "\"") {
Packit Service 084de1
                $inquote++;
Packit Service 084de1
            }
Packit Service 084de1
            $dataitem .= $item;
Packit Service 084de1
            next;
Packit Service 084de1
        }
Packit Service 084de1
        if($inparen) {
Packit Service 084de1
            if($item eq ")") {
Packit Service 084de1
                $inparen--;
Packit Service 084de1
            }
Packit Service 084de1
            $dataitem .= $item;
Packit Service 084de1
            next;
Packit Service 084de1
        }
Packit Service 084de1
        if($item eq "\n") {
Packit Service 084de1
            next;
Packit Service 084de1
        }
Packit Service 084de1
        if($item eq "#") {
Packit Service 084de1
            $preproc = 1;
Packit Service 084de1
            push @struclist, $dataitem;
Packit Service 084de1
            $dataitem = "#";
Packit Service 084de1
            next;
Packit Service 084de1
        }
Packit Service 084de1
        if($item eq "/*") {
Packit Service 084de1
            $comment = 1;
Packit Service 084de1
            push @struclist, $dataitem;
Packit Service 084de1
            $dataitem= "/*";
Packit Service 084de1
            next;
Packit Service 084de1
        }
Packit Service 084de1
        if($item eq "\"") {
Packit Service 084de1
            $dataitem .= $item;
Packit Service 084de1
            $inquote++;
Packit Service 084de1
            next;
Packit Service 084de1
        }
Packit Service 084de1
        if($item eq "{") {
Packit Service 084de1
            $inbrace++;
Packit Service 084de1
            next;
Packit Service 084de1
        }
Packit Service 084de1
        if($item eq ",") {
Packit Service 084de1
            push @struclist, $dataitem;
Packit Service 084de1
            $dataitem = "";
Packit Service 084de1
            next;
Packit Service 084de1
        }
Packit Service 084de1
        if($item eq "(") {
Packit Service 084de1
            $dataitem .= $item;
Packit Service 084de1
            $inparen++;
Packit Service 084de1
            next;
Packit Service 084de1
        }
Packit Service 084de1
        if($item =~ /^\s*$/) {
Packit Service 084de1
            next;
Packit Service 084de1
        }
Packit Service 084de1
        if(ref $dataitem eq 'ARRAY') {
Packit Service 084de1
            push @struclist, $dataitem;
Packit Service 084de1
            $dataitem = "";
Packit Service 084de1
        }
Packit Service 084de1
        $dataitem .= $item;
Packit Service 084de1
    }
Packit Service 084de1
    push @struclist, $dataitem;
Packit Service 084de1
    return \@struclist;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
sub displayData {
Packit Service 084de1
    my $indent = shift;
Packit Service 084de1
    my $depth = shift;
Packit Service 084de1
    my $data = shift;
Packit Service 084de1
    my $item;
Packit Service 084de1
    my $out = "";
Packit Service 084de1
    my $currline = "";
Packit Service 084de1
    my $first = 1;
Packit Service 084de1
    my $prevpreproc = 0;
Packit Service 084de1
    my $prevcomment = 0;
Packit Service 084de1
Packit Service 084de1
    foreach $item (@{$data}) {
Packit Service 084de1
        if($item =~ /^\/\*/) {
Packit Service 084de1
            #Comment
Packit Service 084de1
            $item =~ s/\n/\n$indent/g;
Packit Service 084de1
            if($out =~ /\n\s*$/s) {
Packit Service 084de1
                $out .= $item."\n".$indent;
Packit Service 084de1
            } else {
Packit Service 084de1
                $out .= "\n".$indent.$item."\n".$indent;
Packit Service 084de1
            }
Packit Service 084de1
            $currline = $indent;
Packit Service 084de1
            $prevcomment = 1;
Packit Service 084de1
            next;
Packit Service 084de1
        }
Packit Service 084de1
        $item =~ s/^\s+//;
Packit Service 084de1
        if($item =~ /^#/) {
Packit Service 084de1
            #Pre-processor directive
Packit Service 084de1
            if($out =~ /\n\s*$/s) {
Packit Service 084de1
                $out =~ s/\n\s*$/\n/;
Packit Service 084de1
                $out .= $item."\n".$indent;
Packit Service 084de1
            } else {
Packit Service 084de1
                $out .= "\n".$item."\n".$indent;
Packit Service 084de1
            }
Packit Service 084de1
            $currline = $indent;
Packit Service 084de1
            $prevpreproc = 1;
Packit Service 084de1
            next;
Packit Service 084de1
        }
Packit Service 084de1
        if($first) {
Packit Service 084de1
            $first = 0;
Packit Service 084de1
            if($depth != 0) {
Packit Service 084de1
                $out .= $indent;
Packit Service 084de1
                $currline = $indent;
Packit Service 084de1
            }
Packit Service 084de1
        } else {
Packit Service 084de1
            if(!$prevpreproc && !$prevcomment) {
Packit Service 084de1
                $out .= ", ";
Packit Service 084de1
                $currline .= ", ";
Packit Service 084de1
                if($depth == 1) {
Packit Service 084de1
                    $out .= "\n";
Packit Service 084de1
                    $currline = "";
Packit Service 084de1
                }
Packit Service 084de1
                if($depth == 1) {
Packit Service 084de1
                    $out .= $indent;
Packit Service 084de1
                    $currline .= $indent;
Packit Service 084de1
                }
Packit Service 084de1
            }
Packit Service 084de1
Packit Service 084de1
        }
Packit Service 084de1
        $prevpreproc = 0;
Packit Service 084de1
        $prevcomment = 0;
Packit Service 084de1
Packit Service 084de1
        if (ref $item eq 'ARRAY') {
Packit Service 084de1
            if($depth == 0) {
Packit Service 084de1
                $out .= displayData("$indent    ", $depth+1, $item);
Packit Service 084de1
            } else {
Packit Service 084de1
                $out .= "{\n".displayData("$indent    ", $depth+1, $item)."\n".$indent."}";
Packit Service 084de1
                $currline = $indent."}";
Packit Service 084de1
            }
Packit Service 084de1
        } else {
Packit Service 084de1
            if(length $currline.$item > 79) {
Packit Service 084de1
                $currline = $indent;
Packit Service 084de1
                $out .= "\n$indent";
Packit Service 084de1
            }
Packit Service 084de1
            $out .= $item;
Packit Service 084de1
            $currline .= $item;
Packit Service 084de1
        }
Packit Service 084de1
    }
Packit Service 084de1
    return $out;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
sub do_output {
Packit Service 084de1
    my $out = shift;
Packit Service 084de1
    # Strip any trailing whitespace
Packit Service 084de1
    $out =~ s/\s+\n/\n/g;
Packit Service 084de1
    print $out;
Packit Service 084de1
}