diff options
Diffstat (limited to 'ACE/bin/doxygen-convert-h.pl')
-rwxr-xr-x | ACE/bin/doxygen-convert-h.pl | 527 |
1 files changed, 527 insertions, 0 deletions
diff --git a/ACE/bin/doxygen-convert-h.pl b/ACE/bin/doxygen-convert-h.pl new file mode 100755 index 00000000000..3fcfc64abe0 --- /dev/null +++ b/ACE/bin/doxygen-convert-h.pl @@ -0,0 +1,527 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +# $Id$ +# doxygen-convert-h.pl is a script that would be used to convert old +# documented style ACE/TAO header files to doxygen style. + +# TODO List: +# (Search for @todo in this script) + +use File::Copy; +use Getopt::Std; + +############################################################################## +# Parse the options + +if (!getopts ('dDhsu') || $opt_h) { + print "doxygen-convert-h.pl [-dDhsu] filename\n"; + print "\n"; + print " -d debug script\n"; + print " -D really verbose debug\n"; + print " -h display this help\n"; + print " -s print result to stdout\n"; + print " -u turn off file verification\n"; + exit (1); +} + +## if verbose debug, also regular debug +$opt_d = 1 if (defined $opt_D); + +############################################################################## +# Find the files + +@files = (); + +foreach $arg (@ARGV) { + my @results = glob $arg; + if ($#results < 0) { + print STDERR "File not Found: $arg\n" + } + push @files, @results; +} + +############################################################################## +# Subroutines used to change the file. + +$fail = 0; + +sub verify (@) +{ + my (@contents) = @_; + + print "Verification\n" if (defined $opt_d); + + my $found_id = 0; + my $found_filename = 0; + + foreach $line (@contents) { + $found_id = 1 if ($line =~ /\$Id\:/); + $found_filename = 1 if ($line =~ /\= FILENAME/); + } + + return 0 if ($found_id == 1 && $found_filename == 1); + + # failed + return 1; +} + +sub format_description (@) +{ + my (@description) = @_; + my @after = (); + + my $line; + + if ($#description < 1) { + foreach $line (@description) { + $line =~ s/\/\// \* \@brief /; + push @after, $line; + } + } + else { + foreach $line (@description) { + $line =~ s/\/\// \*/; + $line =~ s/\* /\* /; + push @after, $line; + } + } + + return @after; +} + +sub fix_file_header (@) +{ + my (@before) = @_; + my @after = (); + my @description = (); + my $id = "\$Id\$\n"; + my $authors = ""; + + my $state = 'before'; + ## state = before, filename, description, author, after, done + + print "Fixing File Header\n" if (defined $opt_d); + + LOOP: foreach $line (@before) { + printf ("%10s %s", $state, $line) if (defined $opt_D); + + if ($state eq 'done') { + push @after, $line; + next LOOP; + } + + if ($state eq 'before') { + if ($line =~ /\-\*\- C\+\+ \-\*\-/) { + push @after, $line; + } + elsif ($line =~ /\$Id\:(.*)\n/) { + $id = "\$Id\:$1"; + } + elsif ($line =~ /===================/) { + push @after, "//========================================". + "=====================================\n"; + push @after, "/**\n"; + } + elsif ($line =~ /\= FILENAME/) { + $state = 'filename'; + next LOOP; + } + elsif ($line !~ /^\s*\/\//) { + push @after, $line; + } + } + + if ($state eq 'filename') { + if ($line =~ /\/\/ (.+)/) { + push @after, " * \@file $1\n"; + push @after, " *\n"; + push @after, " * $id\n"; + push @after, " *\n"; + } + elsif ($line =~ /\= DESCRIPTION/) { + $state = 'description'; + next LOOP; + } + elsif ($line =~ /\= AUTHOR/) { + $state = 'author'; + next LOOP; + } + elsif ($line =~ /===================/) { + $state = 'after'; + ### Fall through so the after can put the ending in + } + } + + if ($state eq 'description') { + if ($line =~ /\= AUTHOR/) { + push @after, format_description (@description); + @description = (); + push @after, " *\n"; + $state = 'author'; + next LOOP; + } + elsif ($line =~ /===================/) { + push @after, format_description (@description); + @description = (); + push @after, " *\n"; + $state = 'after'; + ### Fall through + } + push @description, $line; + } + if ($state eq 'author') { + if ($line =~ /\/\/ (.+)\n/) { + $authors .= $1; + } + elsif ($line =~ /===================/ + || $line =~ /\= DESCRIPTION/) { + ## print the authors + + if ($authors ne "") { + @authors = split /\,/, $authors; + + foreach $author (@authors) { + if ($author =~ /^ (.*)/) { + $author = $1; + } + push @after, " * \@author $author\n"; + } + } + + if ($line =~ /\= DESCRIPTION/) { + push @after, " *\n"; + $state = 'description'; + next LOOP; + } + else { + $state = 'after'; + ## Fall through + } + } + } + + if ($state eq 'after') { + if ($line =~ /===================/) { + ## print the rest + push @after, " */\n"; + push @after, "//========================================". + "=====================================\n"; + push @after, "\n"; + $state = 'done'; + } + + next LOOP; + } + } + + return @after; +} + + +sub fix_class_headers (@) +{ + my (@before) = @_; + my @after = (); + my @store = (); + my $classname = ""; + + my $state = 'outside'; + ## state = + ## outside = not in class + ## template = stored template line + ## class = started collecting lines, in case of a class + ## header = after a class foo, but before any methods + + print "Fixing class headers\n" if (defined $opt_d); + + LOOP: foreach $line (@before) { + printf ("%10s %s", $state, $line) if (defined $opt_D); + + if ($state eq 'outside') { + if ($line =~ /^\s*template/) { + push @store, $line; + $state = 'template'; + next LOOP; + } + elsif ($line =~ /^\s*class/) { + $state = 'class'; + ## Fall through + } + else { + push @after, $line; + } + + } + + if ($state eq 'template') { + if ($line =~ /^\s*class/) { + $state = 'class'; + ## Fall through + } + else { + push @after, @store; + @store = (); + push @after, $line; + $state = 'outside'; + next LOOP; + } + } + + if ($state eq 'class') { + if ($line =~ /^\s*class(.*)\n/) { + push @store, $line; + my @s = split / /, $1; + if ($s[1] =~ /export$/i) { + $classname = $s[2]; + } + else { + $classname = $s[1]; + } + } + elsif ($line =~ /^\s*\{/) { + push @store, $line; + } + elsif ($line =~ /^\s*\/\//) { + $state = 'header'; + ### Fall through + } + else { + push @after, @store; + @store = (); + push @after, $line; + $state = 'outside'; + next LOOP; + } + } + + if ($state eq 'header') { + if ($line =~ /^\s*\/\//) { + push @headers, $line; + } + else { + my $prefix = ''; + + $line =~ /^(\s*)[\w\/]/; ### used to get indent + my $indent = $1; + push @after, "$indent/**\n"; + push @after, "$indent * \@class $classname\n"; + + foreach $header (@headers) { + if ($header =~ /\= TITLE/) { + push @after, "$indent *\n"; + $prefix = "$indent * \@brief"; + } + elsif ($header =~ /\= DESCRIPTION/) { + push @after, "$indent *\n"; + $prefix = "$indent *"; + } + elsif ($header !~ /\/\/\s*\n/) { + my $myline = $header; + $myline =~ s/\s*\/\/\s*/$prefix /; + push @after, $myline; + $prefix = "$indent *"; + + } + } + push @after, "$indent */\n"; + @headers = (); + + push @after, @store; + push @after, $line; + @store = (); + $state = 'outside'; + next LOOP; + } + } + } + + return @after; +} + + +sub format_comment (@) +{ + my (@comments) = @_; + my @after = (); + + my $line; + + if ($#comments < 2) { + foreach $line (@comments) { + $line =~ s/\/\//\/\/\//; + push @after, $line; + } + } + else { + my $line = $comments[0]; + $line =~ /^(\s*)\//; + my $indent = $1; + + push @after, "$indent/**\n"; + foreach $line (@comments) { + $line =~ s/\/\// */; + push @after, $line; + } + push @after, "$indent */\n"; + } + + return @after; +} + +sub fix_class_members (@) +{ + my (@before) = @_; + my @after = (); + my @method = (); + my @comment = (); + + my $classfound = 0; + my $classlevel = 0; + my $level = 0; + + print "Fixing class methods\n" if (defined $opt_d); + + LOOP: foreach $line (@before) { + if ($line =~ /\{/ && $line !~ /^\s*\/\//) { + $level++; + } + + if ($line =~ /^\s*class/ + && $line !~ /\;/ + && $level == $classlevel) + { + $classlevel++; + } + + if ($line =~ /\}/ && $line !~ /^\s*\/\//) { + if ($classlevel == $level) { + $classlevel--; + } + $level--; + } + + printf ("%2d%2d", $level, $classlevel) if (defined $opt_D); + + if ($level == $classlevel && $level > 0) { + if ($line =~ /^\s*public/ + || $line =~ /^\s*private/ + || $line =~ /\s*protected/ + || $line =~ /^\s*\n$/ + || $line =~ /^\s*\{/ + || $line =~ /^\s*\}/ + || $line =~ /^\s*\#/) + { + push @after, format_comment (@comment); + push @after, @method; + @comment = (); + @method = (); + + print " $line" if (defined $opt_D); + push @after, $line; + } + elsif ($line =~ /^\s*\/\//) { + print "C $line" if (defined $opt_D); + + if ($#method >= 0) { + push @comment, $line; + } + else { + push @after, $line; + } + } + else { + print "M $line" if (defined $opt_D); + push @method, $line; + } + + } + else { + push @after, format_comment (@comment); + push @after, @method; + @comment = (); + @method = (); + + print " $line" if (defined $opt_D); + push @after, $line; + } + } + + if ($level > 0 || $classlevel > 0) { + $fail = 1; + $failmessage = "Brace level recognition failed" + } + + return @after; +} + +############################################################################## +# Read in the files. + +FILELOOP: foreach $file (@files) { + print "\n" if (defined $opt_d); + print "$file\n"; + print "\n" if (defined $opt_d); + + $fail = 0; + + my @contents = (); + + ### Read file into @contents + print "Reading\n" if (defined $opt_d); + + unless (open (FILE, "<$file")) { + print STDERR "$file: $!\n"; + next FILELOOP; + } + + @contents = <FILE>; + + close (FILE); + + ### Verify file + print "Verifying file\n" if (defined $opt_d); + + if (!defined $opt_u) { + if (verify (@contents) == 1) { + print "$file did not pass verification\n"; + next FILELOOP; + } + elsif (defined $opt_d) { + print "Passed verification\n"; + } + } + + ### Fix up parts of it + print "Fixing file\n" if (defined $opt_d); + + @contents = fix_file_header (@contents); + @contents = fix_class_headers (@contents); + @contents = fix_class_members (@contents); + + if ($fail != 0) { + print "$file: $failmessage\n"; + } + else { + if (defined $opt_s) { + print @contents; + } + elsif (!defined $opt_D) { + ### Save @contents back to the file + print "Saving\n" if (defined $opt_d); + + unless (open (FILE, ">$file")) { + print STDERR "$file: $!\n"; + next FILELOOP; + } + + foreach $line (@contents) { + print FILE $line; + } + + close (FILE); + } + } +} + |