GitHub284: Fix typo in xx-32.pl scripts.
[openssl.git] / util / su-filter.pl
1 #!/usr/bin/env perl
2 #
3 # su-filter.pl
4 #
5 use strict;
6
7 my $in_su = 0;
8 my $indent = 0;
9 my $out;
10 my $braces = 0;
11 my $arrcnt;
12 my $data;
13 my $tststr;
14 my $incomm = 0;
15
16 while(<>) {
17     $tststr = $_;
18     $incomm++ while $tststr =~ /\/\*/g;
19     $incomm-- while $tststr =~ /\*\//g;
20
21     if($in_su == 1) {
22         if(/}(.*);/) {
23             $out .= $_;
24             do_output($out);
25             $in_su = 0;
26         } elsif(/^ *\} [^\s]+(\[\d*\])* = \{/) {
27            $tststr = $1;
28            $arrcnt = 0;
29            $arrcnt++ while $tststr =~ /\[/g;
30            $in_su++;
31            $braces = 1;
32            /^(.* = \{)(.*)$/;
33            $data = $2;
34            $out .= $1."\n";
35         } else {
36             $out .= $_;
37         }
38     } elsif($in_su == 2) {
39         $data .= $_;
40         if(/};$/) {
41             #$data = "\n$data";
42             $data =~ s/\n */\n/g;
43             $data =~ s/};\n?//s;
44             my @strucdata = structureData($data);
45             $out .= displayData($indent, 0, \@strucdata);
46             $out .= "\n$indent};\n";
47             do_output($out);
48             $in_su = 0;
49         }
50     } elsif($incomm <= 0 && /( *)(static )?(const )?(union|struct) ([^\s]+ )?\{/) {
51         $in_su = 1;
52         $indent = $1;
53         $out = $_;
54         next;
55     } else {
56         do_output($_);
57     }
58 }
59
60
61 sub structureData {
62     my $data = $_[0];
63     my @datalist = split(/(\{|\}|,|"|#|\n|\/\*|\*\/|\(|\))/, $data);
64     my $item;
65     my $dataitem = "";
66     my @struclist = ();
67     my $substruc;
68     my $inquote = 0;
69     my $inbrace = 0;
70     my $preproc = 0;
71     my $comment = 0;
72     my $inparen = 0;
73
74
75     foreach $item (@datalist) {
76         if($comment) {
77             if($item eq "*/") {
78                 $comment = 0;
79                 $dataitem .= "*/";
80                 push @struclist, $dataitem;
81                 $dataitem = "";
82                 next;
83             }
84             $dataitem .= $item;
85             next;
86         }
87         if($inquote) {
88             $dataitem .= $item;
89             if($item eq "\"") {
90                 $inquote--;
91             }
92             next;
93         }
94         if($preproc) {
95             if($item eq "\n") {
96                 $preproc = 0;
97                 push @struclist, $dataitem;
98                 $dataitem = "";
99                 next;
100             }
101             $dataitem .= $item;
102             next;
103         }
104         if($inbrace) {
105             if($item eq "}") {
106                 $inbrace --;
107             
108                 if(!$inbrace) {
109                     $substruc = structureData($dataitem);
110                     $dataitem = $substruc;
111                     next;
112                 }
113             } elsif($item eq "{") {
114                 $inbrace++;
115             } elsif ($item eq "\"") {
116                 $inquote++;
117             }
118             $dataitem .= $item;
119             next;
120         }
121         if($inparen) {
122             if($item eq ")") {
123                 $inparen--;
124             }
125             $dataitem .= $item;
126             next;
127         }
128         if($item eq "\n") {
129             next;
130         }
131         if($item eq "#") {
132             $preproc = 1;
133             push @struclist, $dataitem;
134             $dataitem = "#";
135             next;
136         }
137         if($item eq "/*") {
138             $comment = 1;
139             push @struclist, $dataitem;
140             $dataitem= "/*";
141             next;
142         }
143         if($item eq "\"") {
144             $dataitem .= $item;
145             $inquote++;
146             next;
147         }
148         if($item eq "{") {
149             $inbrace++;
150             next;
151         }
152         if($item eq ",") {
153             push @struclist, $dataitem;
154             $dataitem = "";
155             next;
156         }
157         if($item eq "(") {
158             $dataitem .= $item;
159             $inparen++;
160             next;
161         }
162         if($item =~ /^\s*$/) {
163             next;
164         }
165         if(ref $dataitem eq 'ARRAY') {
166             push @struclist, $dataitem;
167             $dataitem = "";
168         }
169         $dataitem .= $item;
170     }
171     push @struclist, $dataitem;
172     return \@struclist;
173 }
174
175 sub displayData {
176     my $indent = shift;
177     my $depth = shift;
178     my $data = shift;
179     my $item;
180     my $out = "";
181     my $currline = "";
182     my $first = 1;
183     my $prevpreproc = 0;
184     my $prevcomment = 0;
185
186     foreach $item (@{$data}) {
187         if($item =~ /^\/\*/) {
188             #Comment
189             $item =~ s/\n/\n$indent/g;
190             if($out =~ /\n\s*$/s) {
191                 $out .= $item."\n".$indent;
192             } else {
193                 $out .= "\n".$indent.$item."\n".$indent;
194             }
195             $currline = $indent;
196             $prevcomment = 1;
197             next;
198         }
199         $item =~ s/^\s+//;
200         if($item =~ /^#/) {
201             #Pre-processor directive
202             if($out =~ /\n\s*$/s) {
203                 $out =~ s/\n\s*$/\n/;
204                 $out .= $item."\n".$indent;
205             } else {
206                 $out .= "\n".$item."\n".$indent;
207             }
208             $currline = $indent;
209             $prevpreproc = 1;
210             next;
211         }
212         if($first) {
213             $first = 0;
214             if($depth != 0) {
215                 $out .= $indent;
216                 $currline = $indent;
217             }
218         } else {
219             if(!$prevpreproc && !$prevcomment) {
220                 $out .= ", ";
221                 $currline .= ", ";
222                 if($depth == 1) {
223                     $out .= "\n";
224                     $currline = "";
225                 }
226                 if($depth == 1) {
227                     $out .= $indent;
228                     $currline .= $indent;
229                 }
230             }
231
232         }
233         $prevpreproc = 0;
234         $prevcomment = 0;
235
236         if (ref $item eq 'ARRAY') {
237             if($depth == 0) {
238                 $out .= displayData("$indent    ", $depth+1, $item);
239             } else {
240                 $out .= "{\n".displayData("$indent    ", $depth+1, $item)."\n".$indent."}";
241                 $currline = $indent."}";
242             }
243         } else {
244             if(length $currline.$item > 79) {
245                 $currline = $indent;
246                 $out .= "\n$indent";
247             }
248             $out .= $item;
249             $currline .= $item;
250         }
251     }
252     return $out;
253 }
254
255 sub do_output {
256     my $out = shift;
257     # Strip any trailing whitespace
258     $out =~ s/\s+\n/\n/g;
259     print $out;
260 }