1#!/usr/bin/perl
2
3$file = $ARGV[0];
4
5if ($file =~ /\.cpp/) {
6  while (<>) {
7    print $_;
8  }
9}
10else {
11  @lines = <>;
12  chomp(@lines);
13  $brace = 0;
14
15  for ($i = 0; $i < scalar @lines; ++$i) {
16    $_ = $lines[$i];
17
18    # adjust brace level
19    $stm = $_;
20    if ($$incmt) {
21      if (m#^([^*]|\*+[^/*])*\*+/(.*)$#) {
22        $stm = $1;
23        $$incmt = 0;
24      }
25      else {
26        $stm = "";
27      }
28    }
29    $stm =~ s#//.*##;
30    $stm =~ s#/\*([^*]|\*+[^/*])*\*+/##g;
31    if ($stm =~ m#^(([^/]|/[^*])*)/\*#) {
32      $$incmt = 1;
33      $stm = $1;
34    }
35
36    ++$brace if $stm =~ /\{/;
37    --$brace, $enum = 0 if $stm =~ /}/;
38
39
40    # skip message handlers
41    if ($lines[$i] =~ /^\s*long\s+on\w+\(\s*FXObject\s*\*\s*\w*\s*,\s*FXSelector\s*\w*\s*,\s*void\s*\*\s*\w*\s*\);/) {
42      #splice @lines, $i, 0, ("  /** \@name Message Handlers */", "  //\@{ ");
43      #$j = $i+2;
44      #while ($lines[$j] =~ /^\s*long\s+on\w+\(\s*FXObject\s*\*\s*\w*\s*,\s*FXSelector\s*\w*\s*,\s*void\s*\*\s*\w*\s*\);/) {
45      #  ++$j;
46      #}
47      #splice @lines, $j, 0, ("  //\@} ");
48      #$i = $j;
49      $lines[$i]="";
50    }
51
52
53    $skip = 0 if $brace <= 1;
54    $skip = 1 if $stm =~ /^\s*public\s*:\s*$/;
55    $skip = 2 if $stm =~ /^\s*protected\s*:\s*$/;
56    $skip = 3 if $stm =~ /^\s*private\s*:\s*$/;
57    $enum = 1 if $stm =~ /^\s*enum\s+\w*\s*\{[^}]*$/;
58    if ($skip > 1) {
59      splice @lines, $i, 1, ();
60      --$i;
61      next;
62    }
63
64    if (($lines[$i] =~ /^\*\// || @lines[$i] =~ m#///#)&& $lines[$i+1] =~ /^class/ && scalar @tags > 0 ) {
65      if (@lines[$i] =~ m#///\s*(.*)$#) {
66        @lines[$i] = "/** $1";
67        splice @lines, $i+1, 0, ("*/");
68        ++$i;
69      }
70      splice @lines, $i, 0, ("* ", "* See also: ", @tags);
71      $i += scalar @tags + 2;
72    }
73
74
75    if ($enum == 1 && m#///?\s*.*$#) {
76      $lines[$i] =~ s#///?#///<#;
77    }
78
79    if ($skip <= 1) {
80
81      if ($brace == 1 && $lines[$i] =~ m|^\s*///?| && $lines[$i+1] =~ m|^\s*enum|) {
82        $lines[$i] =~ m|^\s*///?\s*(.+)|;
83        $cmt = $1;
84        ($tag) = $file =~ /(\w+)\.\w+$/;
85        $tag .= "_" . $group++;
86        $tag =~ s#[ .:\\/]#_#g;
87        push @tags, "* \\li \\ref $tag \"$cmt\".";
88        splice @lines, $i, 0, ("/** \\addtogroup $tag $cmt", " * \@{", " */");
89        $i += 3;
90        $j = $i;
91        while (!($lines[$j] =~ /\};/)) { ++$j; }
92        splice @lines, $j+1, 0, ("/** @} */");
93      }
94
95      if ($brace == 3 && $lines[$i] =~ m#^\s*enum\s+\{#) {
96        $j = $i;
97        $delete = 1;
98        while (!($lines[$j] =~ m#\}\s*;#)) {
99          $delete = 0 if $lines[$j] =~ m#///?#;
100          ++$j;
101        }
102        if ($delete) {
103          splice @lines, $i, $j-$i+1;
104          $enum = 0;
105        }
106      }
107    }
108
109  }
110
111  foreach (@lines) {
112    print $_ . "\n";
113  }
114}