diff options
Diffstat (limited to 'ACE/bin/rm_exception_macros.pl')
-rwxr-xr-x | ACE/bin/rm_exception_macros.pl | 292 |
1 files changed, 292 insertions, 0 deletions
diff --git a/ACE/bin/rm_exception_macros.pl b/ACE/bin/rm_exception_macros.pl new file mode 100755 index 00000000000..1f671cf154f --- /dev/null +++ b/ACE/bin/rm_exception_macros.pl @@ -0,0 +1,292 @@ +eval '(exit $?0)' && eval 'exec perl -w -S $0 ${1+"$@"}' + & eval 'exec perl -w -S $0 $argv:q' + if 0; + +# ****************************************************************** +# Author: Chad Elliott +# Date: 1/24/2007 +# $Id$ +# Description: This script attempts to remove the ACE related exception +# macros from source code provided on the comand line. It +# is not perfect, but does handle a large number of cases. +# You may need to hand edit files after running this +# script. +# ****************************************************************** + +# ****************************************************************** +# Pragma Section +# ****************************************************************** + +use strict; +use FileHandle; +use File::Basename; + +# ****************************************************************** +# Data Section +# ****************************************************************** + +my(%macros) = ('ACE_ENV_TYPE' => 'CORBA::Environment', + 'ACE_TRY_ENV' => '_ACE_CORBA_Environment_variable', + 'ACE_EXCEPTION_TYPE' => 'CORBA::Exception', + 'ACE_DEFAULT_GET_ENV_METHOD' => 'TAO_default_environment', + 'ACE_DECLARE_NEW_ENV' => '', + 'ACE_DECLARE_NEW_CORBA_ENV' => '', + 'ACE_CHECK *\(.*\)' => '', + 'ACE_CHECK' => '', + 'ACE_CHECK_RETURN *\(.*\)' => '', + 'ACE_THROW_INT *\((.*)\)' => 'throw $1', + 'ACE_THROW *\((.*)\)' => 'throw $1', +# 'ACE_THROW_RETURN *\((.*),.+\)' => 'throw $1', + 'ACE_TRY' => 'try', + 'ACE_TRY_NEW_ENV' => 'try', + 'ACE_TRY_EX *\([^\)]+\)' => 'try', + 'ACE_TRY_CHECK' => '', + 'ACE_TRY_CHECK_EX *\([^\)]+\)' => '', + 'ACE_TRY_THROW *\((.*)\)' => 'throw $1', + 'ACE_TRY_THROW_EX *\((.*),.+\)' => 'throw $1', + 'ACE_CATCH *\((.*),(.+)\)' => 'catch (const $1& $2)', + 'ACE_CATCHANY' => 'catch (const CORBA::Exception& ex)', + 'ACE_CATCHALL' => 'catch (...)', + 'ACE_RETHROW' => 'throw', + 'ACE_RE_THROW' => 'throw', + 'ACE_RE_THROW_EX *\(.+\)' => 'throw', + 'ACE_ENDTRY' => '', + 'ACE_ENV_RAISE *\((.+)\)' => '$1->_raise ()', + 'ACE_PRINT_TAO_EXCEPTION *\(([^,]+),(.+)\)' => '$1._tao_print_exception ($2)', + 'ACE_PRINT_EXCEPTION *\(([^,]+),(.+)\)' => '$1._tao_print_exception ($2)', + 'TAO_INTERCEPTOR_CHECK_RETURN *\(.*\)' => '', + 'TAO_INTERCEPTOR_CHECK' => '', + ); +my(@keys) = sort { length($b) <=> length($a) } keys %macros; + +# ****************************************************************** +# Subroutine Section +# ****************************************************************** + +sub process_file { + my($file) = shift; + my($fh) = new FileHandle(); + my($status) = 0; + + if (open($fh, $file)) { + my(@lines) = (); + my($mod) = undef; + my($line) = ''; + my($cont_until_semicolon) = undef; + while(<$fh>) { + my($part) = $_; + $part =~ s/\s+$//; + + if ($cont_until_semicolon) { + if ($part =~ s/^\s+// && $line =~ /[,\)]$/) { + $part = ' ' . $part; + } + $line .= $part; + if (index($part, ';') >= 0) { + $cont_until_semicolon = undef; + } + else { + next; + } + } + else { + $line = $part; + } + + my($skip_blank) = undef; + foreach my $key (@keys) { + my($base) = undef; + if ($key =~ /^([^\s]+\s\*\\\()/) { + $base = $1; + } + if ($line =~ /^(\s*)?($key\s*[;]?)/) { + my($space) = $1; + my($rest) = $2; + my($first) = $3 || ''; + my($second) = $4 || ''; + my($val) = $macros{$key}; + while($val =~ /\$(\d+)/) { + my($num) = $1; + if ($num == 1) { + $first =~ s/^\s+//; + $first =~ s/\s+$//; + $val =~ s/\$1/$first/; + } + elsif ($num == 2) { + $second =~ s/^\s+//; + $second =~ s/\s+$//; + $val =~ s/\$2/$second/; + } + else { + $val =~ s/\$\d+//; + } + } + + $line =~ s/^(\s*)?($key\s*[;]?)//; + $val .= ';' if ($val ne '' && $rest =~ /;$/); + $line = $space . $val . $line; + $line =~ s/^\s+$//; + + ## Fix up problems where ACE_TRY_THROW is used + ## on a line by itself with the parenthesis following + ## on the second line. The parser gets confused and + ## thinks it needs to replace the ACE_TRY + if ($key eq 'ACE_TRY') { + $line =~ s/try_THROW/throw/g; + } + + my($len) = length($line); + if ($len > 78 || $line =~ /""/) { + my($level) = 0; + my($indouble) = 0; + my($pch) = ''; + my($fix_ace_text) = undef; + for(my $i = 0; $i < $len; $i++) { + my($ch) = substr($line, $i, 1); + if ($ch eq '"' && $pch ne '\\') { + $indouble ^= 1; + } + if (!$indouble) { + my($nch) = substr($line, $i + 1, 1); + if ($ch eq ',' || ($ch eq '"' && $nch eq '"') || $ch eq '(') { + $level++ if ($ch eq '('); + $fix_ace_text = (substr($line, 0, $i) =~ /ACE_TEXT\s*$/); + if ($nch ne ')' && !$fix_ace_text) { + my($add) = "\n" . $space . (' ' x $level); + my($start) = 0; + while(substr($line, $i + 1 + $start, 1) =~ /\s/) { + $start++; + } + substr($line, $i + 1, $start) = $add; + $i += length($add) - $start; + $len += length($add) - $start; + } + } + elsif ($ch eq ')') { + $level--; + if ($fix_ace_text) { + if (substr($line, $i) =~ /ACE_TEXT/) { + my($add) = "\n" . $space . (' ' x $level); + my($start) = 0; + while(substr($line, $i + 1 + $start, 1) =~ /\s/) { + $start++; + } + substr($line, $i + 1, $start) = $add; + $i += length($add) - $start; + $len += length($add) - $start; + } + $fix_ace_text = undef; + } + } + } + $pch = $ch; + } + } + + $mod = 1; + $skip_blank = 1; + last; + } + elsif (defined $base && + index($line, ';') == -1 && $line =~ /^(\s*)?$base/) { + $cont_until_semicolon = 1; + last; + } + } + + if ($line =~ s/ACE_ANY_EXCEPTION/ex/g) { + $mod = 1; + } + if (!$cont_until_semicolon) { + if ($line =~ s/(\s*)ACE_ENV(_SINGLE)?_ARG_DECL_WITH_DEFAULTS// || + $line =~ s/(\s*)ACE_ENV(_SINGLE)?_ARG_DECL_NOT_USED// || + $line =~ s/(\s*)ACE_ENV(_SINGLE)?_ARG_DECL// || + $line =~ s/(\s*)ACE_ENV(_SINGLE)?_ARG_(PARAMETER|NOT_USED)//) { + my($sp) = $1; + if ($line =~ /^\)/) { + if ($lines[$#lines] =~ /\/\/.*$/ || + $lines[$#lines] =~ /\/\*.*\*\/$/) { + $line = $sp . $line; + } + else { + $lines[$#lines] .= $line; + $line = ''; + } + } + $mod = 1; + $skip_blank = 1; + } + push(@lines, $line) if ($line ne '' || !$skip_blank); + } + } + close($fh); + + if ($mod) { + if (open($fh, ">$file")) { + foreach my $line (@lines) { + print $fh $line, "\n"; + } + close($fh); + } + else { + print "ERROR: Unable to write to $file\n"; + $status++; + } + } + } + else { + print "ERROR: Unable to open $file\n"; + $status++; + } + + return $status; +} + +sub process { + my($arg) = shift; + my($status) = 0; + + if (-d $arg) { + my($fh) = new FileHandle(); + if (opendir($fh, $arg)) { + foreach my $file (grep(!/^\.\.?$/, readdir($fh))) { + if ($file ne '.svn') { + $status += process($arg . '/' . $file); + } + } + closedir($fh); + } + } + elsif ($arg =~ /\.(h|hh|hpp|hxx|hh|cpp|cxx|cc|c|C|i|ipp|inl)$/) { + $status += process_file($arg); + } + + return $status; +} + +sub usageAndExit { + print "Usage: ", basename($0), " [directories or files]\n\n", + "Removes all exception related ACE macros.\n"; + exit(0); +} + +# ****************************************************************** +# Main Section +# ****************************************************************** + +my($status) = 0; + +if ($#ARGV == -1) { + usageAndExit(); +} + +foreach my $arg (@ARGV) { + if (index($arg, '-') == 0) { + usageAndExit(); + } + else { + $status += process($arg); + } +} + +exit($status); |