123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260 |
- #!/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 .= $_;
- do_output($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";
- do_output($out);
- $in_su = 0;
- }
- } elsif($incomm <= 0 && /( *)(static )?(const )?(union|struct) ([^\s]+ )?\{/) {
- $in_su = 1;
- $indent = $1;
- $out = $_;
- next;
- } else {
- do_output($_);
- }
- }
- 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;
- }
- sub do_output {
- my $out = shift;
- # Strip any trailing whitespace
- $out =~ s/\s+\n/\n/g;
- print $out;
- }
|