su-filter.pl 6.1 KB

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