diff options
Diffstat (limited to 'bin/perltest2cpp.pl')
-rwxr-xr-x | bin/perltest2cpp.pl | 2251 |
1 files changed, 0 insertions, 2251 deletions
diff --git a/bin/perltest2cpp.pl b/bin/perltest2cpp.pl deleted file mode 100755 index bbaefa6808c..00000000000 --- a/bin/perltest2cpp.pl +++ /dev/null @@ -1,2251 +0,0 @@ -eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' - & eval 'exec perl -S $0 $argv:q' - if 0; - -# ****************************************************************** -# Author: Chad Elliott (elliott_c@ociweb.com) -# Date: 4/4/2001 -# $Id$ -# Description: Generate run_test.cpp from run_test.pl for VxWorks -# ****************************************************************** - -# ****************************************************************** -# Pragma Section -# ****************************************************************** - -use strict; -use FileHandle; -use File::Basename; - -# ****************************************************************** -# Data Section -# ****************************************************************** - -my($firstExecutable) = 1; -my($needMain) = 0; -my($indent) = 0; -my($pindent) = 0; -my($taodebug) = undef; -my(@cppheader) = (); -my(@cppsubs) = (); -my(@cppbody) = (); -my(@subs) = (); -my($timefactor) = 2; -my($insub) = 0; -my($indsc) = 0; -my(%argsList) = (); -my($shortString) = 256; -my($unknownArgCount) = 20; -my($defaultTimeout) = 60; -my($status) = 0; -my($lineCount) = 0; -my($needReadLine) = 1; -my($needReadFile) = 1; -my(%timeoutVars) = (); - -my($UNDEFINED_VARIABLE) = 1; -my($UNKNOWN_VARIABLE_TYPE) = 2; -my($UNSUPPORTED_CONSTRUCT) = 3; - -# ****************************************************************** -# Subroutine Section -# ****************************************************************** - -sub generateError { - my($error) = shift; - my($extra) = shift; - if ($error == $UNDEFINED_VARIABLE) { - print STDERR "Error: Undefined variable ($extra) at line $lineCount\n"; - $status++; - } - elsif ($error == $UNKNOWN_VARIABLE_TYPE) { - print STDERR "Error: Unknown variable type " . - "for ($extra) at line $lineCount\n"; - $status++; - } - elsif ($error == $UNSUPPORTED_CONSTRUCT) { - print STDERR "Error: Unsupported construct ($extra) at line $lineCount\n"; - $status++; - } -} - - -sub getIndent { - if ($pindent != $indent) { - my($str) = " " x ($pindent * 2); - $pindent = $indent; - return $str; - } - return " " x ($indent * 2); -} - - -sub concatenate { - my($value) = shift; - my($length) = length($value); - my($indouble) = 0; - my($insingle) = 0; - - for(my $i = 0; $i < $length; $i++) { - my($ch) = substr($value, $i, 1); - if (!$insingle && $ch eq '"') { - $indouble ^= 1; - } - elsif (!$indouble && $ch eq '\'') { - $insingle ^= 1; - } - elsif ($ch eq '.' && !$indouble && !$insingle) { - my($rc) = undef; - my($lc) = $i; - for($i++; $i < $length; $i++) { - my($a) = substr($value, $i, 1); - if ($a !~ /\s/) { - if ($a eq '\'' || $a eq '"') { - $rc = $i + 1; - } - elsif ($a eq '$') { - $rc = $i; - } - last; - } - } - for($lc--; $lc >= 0; $lc--) { - my($a) = substr($value, $lc, 1); - if ($a !~ /\s/) { - if ($a ne '\'' && $a ne '"') { - $lc++; - } - last; - } - } - if (defined $rc) { - my($rold) = substr($value, $rc - 1, 1); - my($lold) = substr($value, $lc, 1); - - substr($value, $lc, $rc - $lc) = ""; - $length = length($value); - my($front) = substr($value, 0, $lc); - my($back) = substr($value, $lc); - if ($lold eq '"') { - if ($rold eq '"') { - $indouble ^= 1; - } - else { - if ($back !~ /\"/) { - $indouble = 1; - } - } - } - elsif ($lold =~ /\s/ && $rold eq '"' && $front =~ /\"/) { - $indouble ^= 1; - } - elsif ($lold eq '\'') { - if ($rold eq '\'') { - $insingle ^= 1; - } - else { - if ($back !~ /\'/) { - $insingle = 1; - } - } - } - elsif ($lold =~ /\s/ && $rold eq '\'' && $front =~ /\'/) { - $insingle ^= 1; - } - - if ($back =~ /^([\$\@][^\s;]+)/) { - my($target) = $1; - if ($indouble) { - $back =~ s/[\$\@][^\s;]+/$target\"/; - } - elsif ($insingle) { - $back =~ s/[\$\@][^\s;]+/$target\'/; - } - $value = $front . $back; - $length++; - } - - $i = $lc - 1; -######################################################### -# Fix for $debug = $debug . " -d"; -######################################################### - if (!$indouble && !$insingle && - substr($value, 0, $i) !~ /$rold/) { - for(my $j = $i; $j >= 0; $j--) { - my($ich) = substr($value, $j, 1); - if ($ich eq '$') { - substr($value, $j, 1) = "$rold\$"; - $i++; - if ($rold eq '"') { - $indouble ^= 1; - } - else { - $insingle ^= 1; - } - last; - } - } - } -######################################################### - } - } - } - - if ($indouble || $insingle) { - print "DEBUG1: $value\n" . - " indouble = $indouble insingle = $insingle\n\n"; - } - - return $value; -} - - -sub typeToCPPType { - my($str) = shift; - if ($str eq "%d") { - return "int"; - } - if ($str eq "%f") { - return "float"; - } - if ($str eq "%s") { - return "char"; - } - return "void"; -} - -my(@mainList) = (); -sub getMainList { - if (!defined $mainList[0]) { - my($fh) = new FileHandle(); - if (open($fh, "Makefile")) { - my($line) = ""; - while(<$fh>) { - $line .= $_; - if ($line =~ /\\\s*$/) { - $line =~ s/\\\s*$//; - } - else { - if ($line =~ /BIN(_UNCHECKED|2)?\s*[\+]?=/ && - $line !~ /\$\(/ && $line !~ /run_test/) { - if ($line =~ /\s*=\s*(.*)/) { - my($bins) = $1; - if ($bins =~ /patsubst/) { - ## TBD: Fix for pattern substitution - } - else { - foreach my $main (split(/\s+/, $bins)) { - $main =~ s/\-/_/g; - push(@mainList, $main . "_main"); - } - } - } - } - $line = ""; - } - } - close($fh); - } - } - return @mainList; -} - - -my(%declared) = ("!" => "%s"); -my(%decscope) = ("!" => -1); -sub addParameterToCurrentSub { - my($var) = shift; - my($type) = shift; - if (!defined $type) { - $type = "char*"; - } - - for(my $i = $#cppsubs; $i >= 0; $i--) { - if ($cppsubs[$i] =~ /\/\*params\*\//) { - if ($cppsubs[$i] =~ /\(\/\*params/) { - $cppsubs[$i] =~ s/\/\*params/$type $var \/\*params/; - } - else { - $cppsubs[$i] =~ s/\/\*params/, $type $var \/\*params/; - } - $declared{$var} = "%s"; - $decscope{$var} = $indent; - last; - } - } -} - - -sub getTop { - my($os) = "OSNAME"; - my($top) = "// \$Id\$\n\n" . - "#include <ace/OS.h>\n" . - "#include <ace/Get_Opt.h>\n" . - "#include <tao/debug.h>\n" . - "#include <tests/TestUtils/TestCombinedThreads.h>\n\n" . - "static const char* $os = \"VxWorks\";\n\n"; - - $declared{$os} = "%s"; - $decscope{$os} = -1; - - foreach my $main (getMainList()) { - $top .= "TEST_MAIN_FUNC_DECLARE($main);\n"; - } - $top .= "\n" . - "static int\nunlocated_main(int, char**)\n" . - "{\n" . - " ACE_OS::printf(\"Translation of this module did \"\n" . - " \"not work. Please check the code.\\n\");\n" . - " return 0;\n" . - "}\n\n\n" . - - "TEST_MAIN_TYPE_FUNC\n" . - "translateStringToMainFunction(const char* string)\n" . - "{\n" . - " ACE_UNUSED_ARG(string);\n"; - foreach my $main (getMainList()) { - my($stripped) = $main; - $stripped =~ s/_main//; - $top .= " if (ACE_OS_String::strcmp(string, \"$stripped\") == 0) {\n" . - " return $main;\n" . - " }\n"; - } - $top .= " return unlocated_main;\n" . - "}\n\n"; - - return $top; -} - - -sub incrementIndent { - $pindent = $indent; - $indent++; -} - - -sub decrementIndent { - $indent--; - foreach my $key (keys %decscope) { - if ($decscope{$key} > $indent) { - delete $declared{$key}; - delete $decscope{$key}; - } - } - $pindent = $indent; -} - -sub getMainBeginning { - return "\n\nint main(int argc, char* argv[])\n" . - "{\n" . - " // Silence the compiler\n" . - " ACE_UNUSED_ARG(argc);\n" . - " ACE_UNUSED_ARG(argv);\n" . - " ACE_UNUSED_ARG(OSNAME);\n" . - " translateStringToMainFunction(\"\");\n\n"; -} - - -sub getMainEnding { - my($ending) = " return 0;\n}\n\n"; - decrementIndent(); - return $ending; -} - - -my($currentBuild) = ""; -sub buildLine { - my($line) = shift; - my($length) = length($line); - my($previous) = ""; - my($insideDouble) = 0; - my($insideSingle) = 0; - my($copy) = ""; - - $currentBuild .= $line; - for(my $i = 0; $i < $length; $i++) { - my($ch) = substr($line, $i, 1); - if ($previous ne '\\') { - if (!$insideSingle && $ch eq '"') { - $insideDouble ^= 1; - } - elsif (!$insideDouble && $ch eq '\'') { - $insideSingle ^= 1; - } - } - - if (($ch eq ';' || $ch eq '{' || $ch eq '}') && - (!$insideDouble && !$insideSingle)) { - $copy = $currentBuild; - $currentBuild = ""; - last; - } - $previous = $ch; - } - - return $copy; -} - - -sub stringToArray { - my($str) = shift; - my(@array) = (); - my($length) = length($str); - my($previous) = 0; - for(my $i = 0; $i < $length; $i++) { - my($ch) = substr($str, $i, 1); - if ($ch =~ /\s/) { - push(@array, substr($str, $previous, $i - $previous)); - $previous = $i; - while(substr($str, $i, 1) =~ /\s/) { - $i++; - } - push(@array, substr($str, $previous, $i - $previous)); - $previous = $i; - } - } - push(@array, substr($str, $previous)); - return @array; -} - - -sub lineNeedsToSplit { - my($line) = shift; - if ($line =~ /ACE_OS/) { - if ($line =~ /(ACE_OS.*\((\w+),\s*)(.*)(\);)/ && - $line !~ /argv\[[^\]]+\]/) { - return $1, $2, $3, $4; - } - } - elsif ($line =~ /(.*\s+(\w+)\[.*\]\s+=\s+)(.*)(;)$/) { - return $1, $2, $3, $4; - } - return undef; -} - - -my($genstr) = 0; -sub splitProcessArguments { - my($av) = shift; - my($line) = shift; - my($assign) = shift; - my($argcount) = 0; - my(@array) = stringToArray($av); - my($stillString) = 0; - my($needACE) = 1; - my($needClosing) = 0; - my($stored) = ""; - - for(my $a = 0; $a <= $#array; $a++) { - $array[$a] =~ s/^[\"\']//; - $array[$a] =~ s/[\"\']$//; - if ($array[$a] =~ /\"\s*$/ || $array[$a] eq "") { - } - else { - my($needQuotes) = 1; - $argcount++; - if ($array[$a] =~ /\$/) { - $needQuotes = 0; - if ($array[$a] !~ /^\$/) { - ## Part string, part variable - my($foo) = $array[$a]; - $foo =~ /([^\$]+)(\$\w+)/; - my($p1) = $1; - my($source) = $2; - $p1 =~ s/^\"//; - $stillString = 1; - splice(@array, $a + 1, 1, $source); - $array[$a] = $p1; - } - else { - $stillString = 0; - $needACE = 1; - } - } - else { - $stillString = 1; - } - $array[$a] =~ s/[\$\"\']//g; - if ($needACE) { - if ($needClosing) { - if ($stored ne "") { - $$line .= $stored; - $stored = ""; - } - $$line .= "\");\n" . (" " x (2 * $indent)); - } - setNeedMain(); - $stored = "ACE_OS_String::strcat($assign, "; - if ($needQuotes) { - $stored .= "\""; - } - $needACE = 0; - $needClosing = 0; - } - if ($stored ne "") { - if (defined $declared{$array[$a]} && - $declared{$array[$a]} ne "%s") { - my($newstr) = "char genstr$genstr" . "[64] = \"\";\n" . - getIndent() . - "ACE_OS::sprintf(genstr$genstr, \"%d\", " . - "$array[$a]);\n"; - $stored = "$newstr$stored"; - $array[$a] = "genstr$genstr"; - $genstr++; - } - $$line .= $stored; - $stored = ""; - } - if ($stillString) { - $$line .= "$array[$a]"; - $needClosing = 1; - } - else { - $$line .= "$array[$a]);\n" . (" " x (2 * $indent)); - if ($a != $#array) { - setNeedMain(); - $stored = "ACE_OS_String::strcat($assign, \""; - $stillString = 1; - $needACE = 0; - $needClosing = 1; - } - else { - $needClosing = 0; - } - } - } - } - if ($needClosing) { - if ($stored ne "") { - $$line .= $stored; - $stored = ""; - } - $$line .= "\");\n"; - } - return $argcount; -} - - -my($gencount) = 0; -sub splitArguments { - my($av) = shift; - my($line) = shift; - my($sep) = shift; - my($argcount) = 0; - my(@array) = (); - if (defined $sep) { - @array = split($sep, $av); - for(my $i = 0; $i <= $#array; $i++) { - $array[$i] =~ s/^\s+//; - $array[$i] =~ s/\s+$//; - if ($array[$i] eq "") { - splice(@array, $i, 1); - } - } - } - else { - @array = split(/\s+/, $av); - } - for(my $a = 0; $a <= $#array; $a++) { - if ($array[$a] =~ /-ORBDebugLevel/i) { - $a++; - $array[$a] =~ s/[\$\"\']//g; - if (defined $declared{$array[$a]} && - $declared{$array[$a]} eq "%d") { - $taodebug = $array[$a]; - } - elsif ($array[$a] =~ /^[-+]?\d+$/) { - $taodebug = $array[$a]; - } - else { - $taodebug = "ACE_OS::atoi(\"$array[$a]\")"; - } - } - elsif ($array[$a] eq '"') { - } - else { - my($needQuotes) = 1; - $argcount++; - if ($array[$a] =~ /\$/) { - $needQuotes = 0; - if ($array[$a] !~ /^\$/) { - ## Part string, part variable - my($foo) = $array[$a]; - $foo =~ /([^\$]+)\$(\w+)/; - my($p1) = $1; - my($source) = $2; - $p1 =~ s/^\"//; - my($old) = $$line; - my($str) = "gen_partial$gencount"; - $$line = "char $str" . "[BUFSIZ] = \"$p1\";\n" . - (" " x (2 * $indent)); - if (defined $declared{$source} && $declared{$source} eq "%s") { - setNeedMain(); - $$line .= "ACE_OS_String::strcat($str"; - } - elsif (defined $declared{$source} && $declared{$source} eq "%d") { - setNeedMain(); - $$line .= "char gen_partial" . ($gencount + 1) . - "[$shortString] = \"\";\n" . - (" " x (2 * $indent)) . - "ACE_OS::sprintf(gen_partial" . ($gencount + 1) . - ", \"%d\", $source);\n" . (" " x (2 * $indent)) . - "ACE_OS_String::strcat($str"; - $gencount++; - $source = "gen_partial$gencount"; - } - else { - $$line .= "// *** Unknown source type for: "; - generateError($UNKNOWN_VARIABLE_TYPE, $source); - } - $$line .= ", $source);\n" . (" " x (2 * $indent)) . $old; - $array[$a] = $str; - $gencount++; - } - } - $array[$a] =~ s/[\$\"\']//g; - if ($needQuotes) { - $array[$a] = "\"$array[$a]\""; - } - $$line .= "$array[$a], "; - } - } - return $argcount; -} - -sub handleAssignment { - my($line) = shift; - my($concat) = (/\$(\w+)\s*\.=\s*(.*);/); - - if ($line =~ /\$(\w+)\s*[\.]?=\s*(.*);/) { - ## Regular assignment - my($var) = $1; - my($val) = $2; - - if ($val =~ /time/) { - if (!defined $declared{$var}) { - $declared{$var} = "%d"; - $decscope{$var} = $indent; - $line = "time_t "; - } - else { - $line = ""; - } - $line .= "$var = time(NULL);"; - } - elsif ($val =~ /^new\s+([\w:]+)\s*\((.*)\)/) { - my($params) = $2; - if ($1 eq "PerlACE::Process") { - if (!defined $declared{$var}) { - $declared{$var} = 0; - } - else { - $declared{$var}++; - } - if ($params =~ /.*\s*(,\s*.*)?/) { - my($mv) = undef; - my($av) = ""; - if ($params =~ /(.*)\s*,\s*([\"\$].*)/) { - $mv = $1; - $av = $2; - } - elsif ($params =~ /(.*)/) { - $mv = $1; - } -#if ($av eq "") { -# print "DEBUG4: '$mv' '$av'\n"; -#} - my($argcount) = 1; - my($argvar) = $var; - if ($declared{$argvar} != 0) { - $argvar .= $declared{$argvar}; - } - $line = "char* $argvar" . "Args[] = { "; - if ($mv =~ /\$(\w+)/) { - $mv = $1; - } - $line .= "$mv, "; - my($arguments) = ""; - splitArguments($av, \$arguments); - ## Determine if the result of splitArguments - ## should be added to $argcount - $argsList{$var} = $argcount; - - ## Is there a splitable variable in the argument list? - my($resplit) = 1; - if ($arguments =~ /^\w+,\s*$/ || $arguments =~ /,\s*\w+\s*,/) { - my(@arr) = split(/\n/, $arguments); - foreach my $test (split(",", $arr[$#arr])) { - $test =~ s/^\s+//; - $test =~ s/\s+$//; - if (defined $declared{$test} && $declared{$test} eq "%s" && - $test !~ /ior/ && $test !~ /conf/ && $test !~ /gen_/) { - $resplit = 0; - last; - } - } - if (!$resplit) { - $line =~ s/\[\]/\[$unknownArgCount\]/; - $line .= "0 };\n"; - for(my $l = 0; $l < $#arr; $l++) { - if ($l == 0) { - $line .= (" " x (2 * $indent)); - } - $line .= "$arr[$l]\n"; - } - $arguments = $arr[$#arr]; - $arguments =~ s/^(\w)/\$$1/; - $arguments =~ s/,\s*(\w)/, \$$1/g; - $line .= (" " x (2 * $indent)) . - handleArguments($line, $var, $arguments, ","); - } - } - if ($resplit) { - splitArguments($av, \$line); - $line .= "0 };\n"; - } - - $line .= (" " x (2 * $indent)) . - ($declared{$var} > 0 ? "$var = TAO_TestCombinedThreads" : - "TAO_TestCombinedThreads $var") . - "(" . - ($mv =~ /\"(.*)\"/ ? $mv = "$1" ."_main" : - "translateStringToMainFunction($mv)") . - ", $argvar" . "Args);"; - } - if (!$insub && $line =~ /ACE_OS/) { - setNeedMain(); - } - } - } - elsif ($val =~ /->/) { - if (!defined $declared{$var}) { - $declared{$var} = "%d"; - $decscope{$var} = ($firstExecutable ? -1 : $indent); - $line = ($firstExecutable && !$insub ? "static " : "") . - typeToCPPType($declared{$var}) . " "; - } - else { - $line = ""; - } - $line .= "$var = "; - if ($val =~ /Spawn/) { - my($wait) = ""; - if ($val =~ /\((.*)\)/) { - my($tout) = $1; - if ($tout =~ /^\d+$/ && $tout > $defaultTimeout) { - $defaultTimeout = $tout; - } - $wait = "($tout * $timefactor)"; - } - my($spvar, $spval) = handleSpawn($val); - $line = "$spvar$spval\n" . (" " x (2 * $indent)) . - $line . "$spvar.wait($wait);"; - } - elsif ($val =~ /[\$]?([\w\[\]\$]+)->WaitKill/) { - my($var) = $1; - my($ovar) = $var; - my($op) = "."; - my($tfix) = $var; - $var =~ s/\$//g; - $tfix =~ s/\[.*//; - if ($var =~ /\[/) { - $ovar =~ s/[\[\]\$]//g; - $op = "->"; - } -# elsif ($declared{$tfix} != 0) { -# $var .= $declared{$tfix}; -# } - handleWaitKill($val, $ovar); - $line .= "$var$op" . "wait($ovar" . "Timeout);"; - } - elsif ($val =~ /WaitKill/) { - handleWaitKill($val); - $line .= "0;"; - } - } - elsif ($val =~ /[\"\']([^\"\']+)?[\"\']/ || $val =~ /(\w+)\[([^\]]+)\]/) { - my($value) = ""; - my($needQuotes) = 1; - if ($val =~ /[\"\'](.*)[\"\']/) { -# Quoted double quotes don't work with this regexp 8/21/2001 -# $val =~ /[\"\']([^\"\']+)[\"\']/) { - $value = $1; - } - elsif ($val =~ /(\w+)\[([^\]]+)\]/) { - $value = $1 . "[$2]"; - $needQuotes = 0; - } - - my($pre) = ""; - my($post) = ""; - my($edit) = $val; - $edit =~ s/\\\"//g; - $edit =~ s/\\\'//g; - my($fch) = substr($edit, 0, 1); - - if (($fch eq '"' || $fch eq '\'') && $edit =~ /$fch$/) { - } - elsif ($edit =~ /(\w+)\s+[\"\'][^\"\']+[\"\']/) { - $pre = "$1 "; - } - if (!defined $declared{$var}) { - $declared{$var} = "%s"; - $decscope{$var} = ($firstExecutable ? -1 : $indent); - $line = ($firstExecutable && !$insub ? "static " : "") . - typeToCPPType($declared{$var}) . " "; - if ($pre ne "") { - $post = "[BUFSIZ]"; - } - else { - $post = "[$shortString]"; - } - $line .= "$var$post = "; - if ($needQuotes) { - $line .= "$pre\"$value\";"; - } - else { - if (defined $declared{$value} && $declared{$value} ne "%s") { - $line .= "\"\"; ACE_OS::sprintf($var, \"$declared{$value}\", $value);"; - } - else { - $line .= "\"\"; ACE_OS_String::strcpy($var, $value);"; - } - } - } - else { - if (defined $declared{$var} && $declared{$var} eq "%d") { - $line = "$var = ACE_OS::atoi($pre"; - } - elsif (defined $declared{$var} && $declared{$var} eq "%f") { - $line = "$var = ACE_OS::atof($pre"; - } - else { - setNeedMain(); - $line = "ACE_OS_String::str" . ($concat ? "cat" : "cpy") . - "($var, $pre"; - } - if ($needQuotes) { - $line .= "\"$value\");"; - } - else { - $line .= "$value);"; - } - } - - if ($line =~ /[^\\]\$/) { - my($left, $var, $right, $end) = lineNeedsToSplit($line); - if (defined $left) { - my($newStr) = ""; - - setNeedMain(); - splitProcessArguments($right, \$newStr, $var); - $line = ($left =~ /strcat/ ? "" : - $left . "\"\"$end\n" . (" " x (2 * $indent))) . - $newStr; - } - else { - $line =~ s/\$//g; - } - } - } - elsif ($val =~ /^[+\-\d]+$/) { - if (!defined $declared{$var}) { - $declared{$var} = "%d"; - $decscope{$var} = ($firstExecutable ? -1 : $indent); - $line = ($firstExecutable && !$insub ? "static " : "") . - typeToCPPType($declared{$var}) . " "; - } - else { - $line = ""; - } - $line .= "$var = $val;"; - } - elsif ($val =~ /^[+\-\d\.]+$/) { - if (!defined $declared{$var}) { - $declared{$var} = "%f"; - $decscope{$var} = ($firstExecutable ? -1 : $indent); - $line = ($firstExecutable && !$insub ? "static " : "") . - typeToCPPType($declared{$var}) . " "; - } - else { - $line = ""; - } - $line .= "$var = $val;"; - } - elsif ($val =~ /TAO_TestCombinedThreads.*[+\-\d]+/) { - if (!defined $declared{$var}) { - $declared{$var} = "%d"; - $decscope{$var} = ($firstExecutable ? -1 : $indent); - $line = ($firstExecutable && !$insub ? "static " : "") . - typeToCPPType($declared{$var}) . " "; - } - else { - $line = ""; - } - $line .= "$var = $val;"; - } - elsif ($val =~ /shift/) { - $line = "// Parameters converted from: $var = $val;"; - if ($insub) { - addParameterToCurrentSub($var); - } - } - elsif ($val =~ /[+\-\d\s\w]+/) { ## Come up with a better regexp - ## for var to var assignment - ## Strip of \* from FILE handles - $val =~ s/\\\*//g; - - $val =~ s/\$//g; - my($type) = "%d"; - my($vtype) = $declared{$val}; - - if (!defined $vtype) { - $vtype = $type; - } - - if (!defined $declared{$var}) { - $declared{$var} = $vtype; - $decscope{$var} = ($firstExecutable ? -1 : $indent); - $line = ($firstExecutable && !$insub ? "static " : "") . - typeToCPPType($declared{$var}) . " "; - } - else { - $line = ""; - } - - if (defined $vtype && $type ne $vtype) { - if ($type eq "%d") { - $line .= "$var = "; - if ($vtype eq "%s") { - $line .= "ACE_OS::atoi("; - } - elsif ($vtype eq "%f") { - $line .= "int("; - } - else { - $line .= "("; - } - } - elsif ($type eq "%s") { - $line .= "ACE_OS::sprintf($var, \"$vtype\", "; - } - elsif ($type eq "%f") { - $line .= "$var = "; - if ($vtype eq "%s") { - $line .= "ACE_OS::atof("; - } - elsif ($vtype eq "%d") { - $line .= "float("; - } - else { - $line .= "("; - } - } - else { - $line .= "$var = ("; - } - } - else { - $line .= "$var = "; - } - $line .= $val; - if (defined $vtype && $type ne $vtype) { - $line .= ")"; - } - $line .= ";"; - } - else { - if (!$declared{$var}) { - $declared{$var} = "%x"; - $decscope{$var} = $indent; - $line = "// Assignment: "; - } - else { - $line = ""; - } - $line .= "$var = $val;"; - } - } - elsif ($line =~ /\@(\w+)\s*=\s*(.*);/) { - my($var) = $1; - my($val) = $2; - my($arrtype) = "char*"; - my($count) = 0; - - $val =~ s/^\(//; - $val =~ s/\)$//; - - ## This is horrible code - CAE - ## By convention only, the processes are called SV and CL. - if ($var =~ /^[A-Z]+$/) { - $arrtype = "TAO_TestCombinedThreads*"; - } - - if (!$declared{$var}) { - $declared{$var} = "%s"; - $decscope{$var} = $indent; - - $line = "$arrtype $var\[\] = { "; - foreach my $v (split(/,/, $val)) { - $v =~ s/^\s+//; - $v =~ s/\s+$//; - my($embedded) = handleEmbeddedVar($v); - if ($v ne $embedded) { - $v = "gen_partial$gencount"; - $line = ($count != 0 ? getIndent() : "") . - "static char $v" . "[BUFSIZ] = \"\";\n" . - (" " x (2 * $indent)) . - "ACE_OS::sprintf($v, $embedded);\n" . $line; - if ($count != 0) { - $v = ", $v"; - } - $gencount++; - } - else { - if ($count != 0) { - $line .= getIndent(); - $v = ", $v"; - } - } - ## - $line .= $v; - $count++; - } - if ($count == 0) { - $line = "$arrtype $var" . "[256] = { 0 };"; - $declared{$var} = "%x"; - } - else { - $line .= " };\n" . - (" " x (2 * $indent)) . - "int $var" . "_length = $count;\n" . - (" " x (2 * $indent)) . - "ACE_UNUSED_ARG($var" . "_length);"; - $declared{$var . "_length"} = "%d"; - $decscope{$var . "_length"} = $indent; - } - } - else { - $line = ""; - foreach my $v (split(/,/, $val)) { - $v =~ s/^\s+//; - $v =~ s/\s+$//; - my($embedded) = handleEmbeddedVar($v); - if ($v ne $embedded) { - $v = "gen_partial$gencount"; - $line = ($count != 0 ? getIndent() : "") . - "static char $v" . "[BUFSIZ] = \"\";\n" . - (" " x (2 * $indent)) . - "ACE_OS::sprintf($v, $embedded);\n" . $line; - $gencount++; - } - if ($count != 0) { - $line .= getIndent(); - } - ## - $line .= $var . "[$count] = $v;\n"; - $count++; - } - } - } - elsif ($line =~ /\$(\w+)\s*(\[[^\]]+\])\s*([\.]?=)\s*(.*);/) { - my($name) = $1; - my($index) = $2; - my($op) = $3; - my($value) = $4; - my($fake) = handleAssignment("\$$name $op $value;"); - - $index =~ s/\$//g; - if ($fake =~ /TAO_TestCombinedThreads/) { - $line = $fake; - $line =~ s/\w+\s+=/$name$index = new/; - ## Need to reset this because of the above call to handleAssignemnt - $declared{$name} = "%x"; - } - elsif ($fake =~ /$name[\s,=]+(.*)[\);]+/) { - $value = $1; - $value =~ s/\)$//; - $line = "$name$index $op $value;"; - } - else { - $line = "// Unconverted Assignment: $line"; - generateError($UNSUPPORTED_CONSTRUCT, "assignment"); - } - } - else { - $line = "// Unsupported Assignment: $line"; - generateError($UNSUPPORTED_CONSTRUCT, "assignment"); - } - return $line; -} - - -sub setNeedMain { - if ($firstExecutable && !$insub) { - $needMain = 1; - $firstExecutable = 0; - incrementIndent(); - ## Fix up so the first line in main() is properly indented - $pindent = $indent; - } -} - - -my($foreachcount) = 0; -sub handleForeach { - my($line) = shift; - setNeedMain(); - - incrementIndent(); - - my($newline) = "{ // Unsupported foreach"; - if ($line =~ /foreach\s+\$(\w+)\s*\((.*)\)/) { - - my($var) = $1; - my($var_count) = $var . "_count"; - my($arg) = $2; - - $newline = "for(int $var_count = "; - if ($arg =~ /\@ARGV/) { - $newline .= "1; $var_count < argc; $var_count++) {\n" . - (" " x (2 * $indent)) . - "char* $var = argv[$var_count];"; - $declared{$var} = "%s"; - $decscope{$var} = $indent; - } - else { - $arg =~ s/\@//; - if ($arg !~ /^\w+$/) { - my($arrtype) = "char*"; - my($avar) = "gen_foreach$foreachcount"; - $foreachcount++; - if (!$declared{$avar}) { - $declared{$avar} = "%s"; - $decscope{$avar} = $indent; - } - my($dcount) = $arg; - $dcount =~ s/[^,]//g; - $newline = "$arrtype $avar\[\] = { $arg };\n" . - (" " x (2 * ($indent - 1))) . "int $avar" . - "_length = " . (length($dcount) + 1) . ";\n" . - (" " x (2 * ($indent - 1))) . $newline; - $arg = $avar; - } - $newline .= "0; $var_count < $arg" . "_length; $var_count++) {\n" . - (" " x (2 * $indent)) . - "char* $var = $arg" . "[$var_count];"; - $declared{$var} = "%s"; - $decscope{$var} = $indent; - } - } - else { - generateError($UNSUPPORTED_CONSTRUCT, "foreach"); - } - - return $newline; -} - - -sub handleFor { - my($line) = shift; - setNeedMain(); - - my($newline) = "{ // Unsupported for"; - if ($line =~ /for\s*\(\$(\w+)/) { - $newline = $line; - if (!defined $declared{$1}) { - $declared{$1} = "%d"; - $decscope{$1} = $indent; - $newline = typeToCPPType($declared{$1}) . - " $1;\n" . (" " x (2 * $indent)) . $newline; - } - $newline =~ s/\$//g; - } - else { - generateError($UNSUPPORTED_CONSTRUCT, "for"); - } - - if ($newline =~ /argc/ && $newline =~ /=\s*0\s*;/) { - $newline =~ s/=\s*0\s*;/= 1;/; - } - - incrementIndent(); - - return $newline; -} - - -sub convertFILEtoInt { - my($name) = shift; - $name =~ s/STDIN/fileno(stdin)/g; - $name =~ s/STDOUT/fileno(stdout)/g; - $name =~ s/STDERR/fileno(stderr)/g; - return $name; -} - -my($genopen) = 0; -sub handleOpen { - my($line) = shift; - my($fromIf) = shift; - my($above) = undef; - $fromIf = (defined $fromIf ? $fromIf : 0); - - if ($line =~ /(.*(!)?)open\s*\((.*),\s*(.*)\)(.*)/) { - my($before) = $1; - my($fh) = $3; - my($file) = $4; - my($after) = $5; - my($newline) = ""; - - $fh = convertFILEtoInt($fh); - ## Dup'ing - if ($file =~ /\"\>\&(.*)\"/) { - my($other) = convertFILEtoInt($1); - if ($fh =~ /fileno/) { - $newline = "ACE_OS::dup2($fh, $other)"; - } - else { - if (!defined $declared{$fh}) { - $declared{$fh} = "%d"; - $decscope{$fh} = $indent - ($fromIf ? 1 : 0); - $newline = "int "; - } - $newline .= "$fh = ACE_OS::dup($other)"; - } - } - ## Regular open (write) - elsif ($file =~ /\">(.*)\"/) { - my($other) = $1; - $other =~ s/\$//g; - my($name) = "genopen$genopen"; - if ($fh =~ /fileno/) { - $genopen++; - $newline = "ACE_OS::dup2($fh, $name)"; - } - else { - $name = $fh; - $newline = $name; - } - $above = (defined $declared{$name} ? "" : "int ") . - "$name = " . - "ACE_OS::open($other, O_WRONLY|O_CREAT, " . - "S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);\n"; - if (!defined $declared{$name}) { - $declared{$name} = "%d"; - $decscope{$name} = $indent - ($fromIf ? 1 : 0); - } - } - ## Regular open (read) - elsif ($file =~ /(.*)/) { - my($other) = $1; - $other =~ s/\$//g; - $other =~ s/[\"\']//g; - $other =~ s/\<//g; - my($name) = $fh; - $newline = $name; - $above = (defined $declared{$name} ? "" : "int ") . - "$name = " . - "ACE_OS::open($other, O_RDONLY);\n"; - if (!defined $declared{$name}) { - $declared{$name} = "%d"; - $decscope{$name} = $indent - ($fromIf ? 1 : 0); - } - } - $line = (!$fromIf && defined $above ? $above : "") . - "$before$newline$after"; - } - else { - generateError($UNSUPPORTED_CONSTRUCT, "open"); - } - return $line, $above; -} - -sub handleIf { - my($line) = shift; - setNeedMain(); - - my($newline) = $line; - $newline =~ s/if\s*\(.*/if \(/; - - my($conditions) = undef; - if ($line =~ /if\s*\((.+)\)\s*{/) { - $conditions = $1; - } - - if ($line =~ /elsif/) { - $newline =~ s/elsif/else if/; - } - if ($line !~ /}.*{/) { - incrementIndent(); - } - - foreach my $inside (split(/(\&\&|\|\|)/, $conditions)) { - if ($inside eq '&&' || $inside eq '||') { - $newline .= " $inside "; - } -# elsif ($inside =~ /\$\^O\s+[nltgeq]+\s+[\"\']MSWin32[\"\']/) { -# $newline .= "0"; -# } - elsif ($inside =~ /open\s*\(.*\)/) { - my($above) = undef; - ($inside, $above) = handleOpen($inside, 1); - if (defined $above) { - $newline = $above . getIndent() . $newline; - } - $newline .= " $inside "; - } - elsif ($inside =~ /(.*)\s+([nltgeq]+)\s+(.*)/) { - my($left) = $1; - my($op) = $2; - my($right) = $3; - my($var) = undef; - my($constant) = undef; - - if ($left =~ /\$(\w+)/) { - $var = $1; - } - elsif ($right =~ /\$(\w+)/) { - $var = $1; - } - if ($left =~ /\$?(\w+\[[^\]]+\])/) { - $var = $1; - $var =~ s/\$//g; - } - elsif ($right =~ /\$?(\w+\[[^\]]+\])/) { - $var = $1; - $var =~ s/\$//g; - } - - if ($left =~ /\"[^\"]*\"/) { - $constant = $left; - } - elsif ($right =~ /\"[^\"]*\"/) { - $constant = $right; - } - if ($left =~ /\'([^\']*)\'/) { - $constant = "\"$1\""; - } - elsif ($right =~ /\'([^\']*)\'/) { - $constant = "\"$1\""; - } - if (defined $var && defined $constant) { - my($check) = undef; - if ($op eq 'eq') { - $check = "== 0"; - } - elsif ($op eq 'ne') { - $check = "!= 0"; - } - elsif ($op eq 'lt') { - $check = "< 0"; - } - elsif ($op eq 'le') { - $check = "<= 0"; - } - elsif ($op eq 'gt') { - $check = "> 0"; - } - elsif ($op eq 'ge') { - $check = ">= 0"; - } - - $inside =~ s/.*\s+$op\s+.*/\($var != 0 && ACE_OS_String::strcmp\($var, $constant\) $check\)/; - $newline .= "$inside"; - } - } - elsif ($inside =~ /([^!<=]+)\s*([!<>=]+)\s*([^!<>=]+)/) { - my($left) = $1; - my($op) = $2; - my($right) = $3; - my($var) = undef; - my($constant) = undef; - - $left =~ s/\s+$//; - $right =~ s/^\s+//; - - if ($left =~ /\$(\w+)/) { - $var = $left; - $var =~ s/\$//g; - } - elsif ($left =~ /\'([^\']+)\'/) { - $var = "\"$1\""; - } - else { - $var = $left; - } - - if ($right =~ /\$(\w+)/) { - $constant = $1; - } - elsif ($right =~ /\'([^\']+)\'/) { - $constant = "\"$1\""; - } - else { - $constant = $right; - } - - if ($var =~ /Spawn/) { - my($wait) = ""; - if ($var =~ /\((.*)\)/) { - my($tout) = $1; - if ($tout =~ /^\d+$/ && $tout > $defaultTimeout) { - $defaultTimeout = $tout; - } - $wait = "($tout * $timefactor)"; - } - my($spvar, $spval) = handleSpawn($var); - $newline = "$spvar$spval\n" . (" " x (2 * ($indent - 1))) . - $newline; - $var = "$spvar.wait($wait)"; - } - elsif ($var =~ /[\$]?([\w\[\]\$]+)->WaitKill/) { - my($wvar) = $1; - my($ovar) = $wvar; - my($iop) = "."; - my($tfix) = $wvar; - $wvar =~ s/\$//g; - $tfix =~ s/\[.*//; - if ($wvar =~ /\[/) { - $ovar =~ s/[\[\]\$]//g; - $iop = "->"; - } -# if (defined $declared{$wvar} && $declared{$wvar} != 0) { -# $wvar .= $declared{$wvar}; -# } - handleWaitKill($var, $ovar); - $var = "$wvar$iop" . "wait($ovar" . "Timeout)"; - } - - $newline .= "$var $op $constant"; - } - elsif ($inside =~ /testGetopts/) { - $newline .= $inside; - } - elsif ($inside =~ /(.*)defined\s+\$([^\)]+)/) { - my($op) = $1; - my($var) = $2; - $newline .= ($op ne "" ? "$op(" : "") . - $var . "[0] != '\\0'" . ($op ne "" ? ")" : ""); - } - elsif ($inside =~ /(!)?(.*)/) { - my($op) = $1; - my($right) = $2; - $right =~ s/\$//g; - $inside = (defined $op ? $op : "") . $right; - $newline .= "$inside"; - } - else { - $newline .= "/*$inside*/0"; - } - } - $newline .= ") {"; - - return $newline; -} - - -my($argindexcount) = 0; -my($azlengthcount) = 0; -my($genargcount) = 0; -sub handleArguments { - my($line) = shift; - my($var) = shift; - my($args) = shift; - my($sep) = shift; - my($newline) = "// Arguments: $line"; - my($ok) = 0; - - if (defined $var && defined $args) { - $ok = 1; - } - elsif ($line =~ /\$(\w+)->Arguments\s*\((.*)\)/) { - $ok = 1; - $var = $1; - $args = $2; - } - - if ($ok) { - my($argline) = ""; - my($argcount) = splitArguments($args, \$argline, $sep); - $argline .= "0"; - my(@lines) = split(/\n/, $argline); - $newline = "int argindex$argindexcount = " . - (defined $argsList{$var} ? "$argsList{$var}" : - "1 /*undefined*/") . ";\n"; - for(my $i = 0; $i <= $#lines; $i++) { - if ($i == $#lines) { - my($current) = 0; - my($varargs) = $var . "Args"; - foreach my $newarg (split(/,/, $lines[$i])) { - $newarg =~ s/^\s+//; - $newarg =~ s/\s+$//; - if (defined $declared{$newarg} && $declared{$newarg} eq "%s" && - $newarg !~ /ior/ && $newarg !~ /conf/ && $newarg !~ /gen_/) { - $current = $unknownArgCount; - $newline .= (" " x (2 * $indent)) . $varargs . - "[argindex$argindexcount" . "++] = $newarg;\n" . - (" " x (2 * $indent)) . "int azlength$azlengthcount = ACE_OS::strlen($newarg);\n" . - (" " x (2 * $indent)) . "for(int az = 0; az < azlength$azlengthcount; az++) {\n" . - (" " x (2 * $indent)) . " if (isspace($newarg" . "[az])) {\n" . - (" " x (2 * $indent)) . " $newarg" . "[az] = '\\0';\n" . - (" " x (2 * $indent)) . " for(;ACE_OS_String::ace_isspace($newarg" . "[az]); az++);\n" . - (" " x (2 * $indent)) . " $varargs" . "[argindex$argindexcount" . "++] = $newarg + az + 1;\n" . - (" " x (2 * $indent)) . " }\n" . - (" " x (2 * $indent)) . "}\n"; - $azlengthcount++; - } - elsif (defined $declared{$newarg} && $declared{$newarg} eq "%d") { - $newline .= (" " x (2 * $indent)) . - "char gen_args$genargcount" . "[$shortString] = \"\";\n" . - (" " x (2 * $indent)) . - "ACE_OS::sprintf(gen_args$genargcount, \"%d\", $newarg);\n" . - (" " x (2 * $indent)) . - $varargs . "[argindex$argindexcount" . - "++] = gen_args$genargcount;\n"; - $genargcount++; - $current++; - } - else { - $newline .= (" " x (2 * $indent)) . - $varargs . "[argindex$argindexcount" . - "++] = $newarg;\n"; - $current++; - } - } - $argindexcount++; - my($foundInBody) = 0; - for(my $i = $#cppbody; $i >= 0; $i--) { - if ($cppbody[$i] =~ /char\* $varargs\[(.*)\]/) { - my($index) = $1; - my($max) = $argsList{$var} + $current; - if (!defined $index || defined $index && - ($index eq "" || ($index =~ /^\d+$/ && $index < $max))) { - $cppbody[$i] =~ s/$varargs\[.*\]/$varargs\[$max\]/; - $foundInBody = 1; - last; - } - } - } - for(my $i = $#cppheader; $i >= 0; $i--) { - if ($cppheader[$i] =~ /char\* $varargs\[(.*)\]/) { - my($index) = $1; - my($max) = $argsList{$var} + $current; - if (!defined $index || defined $index && - ($index eq "" || ($index =~ /^\d+$/ && $index < $max))) { - $cppheader[$i] =~ s/$varargs\[.*\]/$varargs\[$max\]/; - last; - } - } - } - } - else { - $newline .= "$lines[$i]\n"; - } - } - } - return $newline; -} - - -sub handleWhile { - my($line) = shift; - generateError($UNSUPPORTED_CONSTRUCT, "while"); - return "while(0) {"; -} - - -sub handleKeyword { - my($key) = shift; - my($line) = shift; - setNeedMain(); - $line =~ s/\$(\w+)/$1/; - if ($line =~ /$key\s*[^(]/) { - if ($line =~ /[\(\)]+/) { - $line =~ s/$key\s*/ACE_OS::$key/; - } - else { - $line =~ s/$key\s*/ACE_OS::$key\(/; - $line =~ s/;/\);/; - } - } - else { - $line = "ACE_OS::$line"; - } - return $line; -} - - -sub handlePrint { - my($line) = shift; - setNeedMain(); - - my($stream) = undef; - my($value) = undef; - if ($line =~ /print\s+(\w+)\s+(.+);/) { - $stream = lc($1); - $value = $2; - } - elsif ($line =~ /print\s+(.+);/) { - $value = $1; - } - - $value = handleEmbeddedVar($value); - - if (defined $stream) { - $line = "ACE_OS::fprintf($stream, $value);"; - } - else { - $line = "ACE_OS::printf($value);"; - } - - return $line; -} - - -sub handleSpawn { - my($line) = shift; - setNeedMain(); - my(@parts) = (); - if ($line =~ /([\w\[\$\]]+)->Spawn[\w]*\s*\(([^\)]*)\)/) { - if (defined $taodebug) { - my($part) = (" " x (2 * $indent)) . "TAO_debug_level = $taodebug;\n"; - if ($insub) { - push(@cppsubs, $part); - } - else { - push(@cppbody, $part); - } - $taodebug = undef; - } - my($var) = $1; - my($timeout) = $2; - $var =~ s/\$//g; - -# if (defined $declared{$var} && $declared{$var} != 0) { -# $var .= $declared{$var}; -# } - if ($timeout =~ /^\d+$/ && $timeout > $defaultTimeout) { - $defaultTimeout = $timeout; - } - my($time) = ($timeout ne "" ? "($timeout * $timefactor)" : ""); - if ($time eq "") { - my($varfix) = $var; - $varfix =~ s/[\[\]]+//g; - $time = "$varfix" . "Timeout"; - } - my($typeCheck) = $var; - $typeCheck =~ s/\[.*//; - @parts = ($var, ($declared{$typeCheck} eq "%x" ? - "->" : ".") . "run($time);"); - } - return @parts; -} - - -sub handleWaitKill { - my($line) = shift; - my($var) = shift; - setNeedMain(); - - if (!defined $var) { - if ($line =~ /(\w+)->.*Kill\s*\(([\w\$]*)\)/) { - $var = $1; - } - } - if ($line =~ /->.*Kill\s*\(([\w\$]*)\)/) { - my($time) = $var . "Timeout"; - my($tout) = $1; - if ($tout =~ /^\d+$/ && $tout > $defaultTimeout) { - $defaultTimeout = $tout; - } - if (!defined $declared{$time}) { - $timeoutVars{$time} = $tout; - $declared{$time} = "%d"; - $decscope{$time} = -1; - } - } -} - - -sub handleSubroutine { - my($line) = shift; - incrementIndent(); - - if ($line =~ /sub\s+(\w+)\s*(\(.*\))?\{/) { - $insub = 1; - $indsc = $indent - 1; - $line = "void $1(/*params*/) {"; - push(@subs, $1); - } - else { - $line = "// Subroutine call??? $line"; - } - return $line; -} - - -my($firstSplit) = 1; -sub handleSplit { - my($line) = shift; - if ($firstSplit) { - $firstSplit = 0; - push(@cppheader, "void split(char** arr, int& length, const char* delim, char* str)\n" . - "{\n" . - " int slength = strlen(str);\n" . - " int delimLength = strlen(delim);\n" . - " int previous = 0;\n" . - " int index = 0;\n" . - " for(int i = 0; i <= slength; i++) {\n" . - " if (str[i] == '\\0' || strncmp(str + i, delim, delimLength) == 0) {\n" . - " arr[index++] = str + previous;\n" . - " str[i] = '\\0';\n" . - " i += delimLength;\n" . - " previous = i;\n" . - " }\n" . - " }\n" . - " length = index;\n" . - "}\n" . - "\n" . - "void split(char** arr, int& length, char delim, char* str)\n" . - "{\n" . - " char delimStr[2] = \"\\0\";\n" . - " delimStr[0] = delim;\n" . - " split(arr, length, delimStr, str);\n" . - "}\n\n"); - } - - if ($line =~ /\@(\w+)\s*=\s*split\s*\((.*)\)/) { - my($var) = $1; - my($params) = $2; - $params =~ s/\$//g; - $params =~ s/^\/([^\/]+)\//\'$1\'/; - $line = "split($var, $var" . "_length, $params);"; - } - else { - $line = "// Unhandled split: $line"; - } - return $line; -} - - -sub handleLocal { - my($line) = shift; - if ($line =~ /local\s*\((.*)\)/) { - my($list) = $1; - foreach my $var (split(/,/, $list)) { - $var =~ s/^\s+//; - $var =~ s/\s+//; - $var = handleAssignment($var . " = \"\";"); - if ($var !~ /^static/) { - $var = "static $var"; - } - push(@cppheader, "$var\n"); - } - } -} - -my($firstGetopts) = 1; -sub handleGetopts { - my($line) = shift; - my(%vars) = (); - - $line =~ s/\'/\"/g; - if ($line =~ /getopts\s*\(([^\)]+)\)/) { - my($param) = $1; - my($length) = length($param); - my($current) = ""; - for(my $i = 0; $i < $length; $i++) { - my($ch) = substr($param, $i, 1); - if ($ch ne '"') { - if ($ch eq ':') { - $vars{$current} = 1; - } - else { - $current = $ch; - $vars{$current} = 0; - } - } - } - } - - if ($firstGetopts) { - push(@cppsubs, "int testGetopts(int argc, char* argv[], const char* str)\n" . - "{\n" . - " ACE_Get_Opt get_opts(argc, argv, str);\n" . - " int status = 1;\n" . - " for(int c = 0; c != -1; c = get_opts()) {\n" . - " switch(c) {\n" . - " case 0:\n" . - " break;\n"); - foreach my $key (keys %vars) { - push(@cppsubs, " case '$key':\n"); - if ($vars{$key} == 0) { - push(@cppsubs, " ACE_OS_String::strcpy(opt_$key, \"1\");"); - } - else { - push(@cppsubs, " ACE_OS_String::strcpy(opt_$key, get_opts.optarg);\n"); - } - push(@cppsubs, " break;\n"); - } - push(@cppsubs, " default:\n" . - " status = 0;\n" . - " break;\n" . - " }\n" . - " }\n" . - " return status;\n" . - "}\n\n"); - } - - $line =~ s/getopts\s*\(/testGetopts\(argc, argv, /g; - $firstGetopts = 0; - return $line; -} - - -sub handleEmbeddedVar { - my($value) = shift; - - while ($value =~ /\$(\w+)\[([\$]?\w+)\]/) { - my($param) = $1; - my($index) = $2; - $index =~ s/\$//; - $value =~ s/([^\\])\$\w+\[[\$]?\w+\]/$1$declared{$param}/; - $value .= ", $param" . "[$index]"; - } - while ($value =~ /\.\s*([\$\"\']+)/) { - my($param) = $1; - $param =~ s/\$//; - $value =~ s/\.\s*[\$\"\']+/ \"%s\"/; - $value .= ", $param"; - $value =~ s/\"\s*\.\s*\"//; - $value =~ s/\"\s+\"//; - } - while ($value =~ /[^\\]\$(\w+)/) { - my($param) = $1; - - ## Perl Script Error - if (!defined $declared{$param}) { - generateError($UNDEFINED_VARIABLE, $param); - $value =~ s/([^\\])\$\w+/$1%x/; - } - else { - $value =~ s/([^\\])\$\w+/$1$declared{$param}/; - } - $value .= ", $param"; - } -# my($length) = length($value); -# my($prev) = ""; -# for(my $i = 0; $i < $length; $i++) { -# my($ch) = substr($value, $i, 1); -# if ($prev ne '\\' && $ch eq '$') { -# ## TBD? -# } -# $prev = $ch; -# } - return $value; -} - - -my($subcallcount) = 0; -sub handleSubCall { - my($line) = shift; - my($newline) = "// Sub Call:"; - if ($line =~ /(\"[^\"]+\")/) { - my($orig) = $1; - my($str) = handleEmbeddedVar($orig); - if ($orig ne $str) { - $newline = "char gen_subcall$subcallcount" . "[$shortString] = \"\";\n" . - (" " x (2 * $indent)) . - "ACE_OS::sprintf(gen_subcall$subcallcount, $str);\n"; - $line =~ s/\"[^\"]+\"/gen_subcall$subcallcount/; - $line = $newline . (" " x (2 * $indent)) . $line; - $subcallcount++; - } - } - else { - $line =~ s/\$//g; - } - return $line; -} - -sub convertAngleToRead { - my($line) = shift; - my($length) = length($line); - my($indouble) = 0; - my($insingle) = 0; - my($inangle) = 0; - - for(my $i = 0; $i < $length; $i++) { - my($ch) = substr($line, $i, 1); - if (!$insingle && $ch eq '"') { - $indouble ^= 1; - } - elsif (!$indouble && $ch eq '\'') { - $insingle ^= 1; - } - elsif ($ch eq '<' && !$indouble && !$insingle) { - $inangle = $i; - } - elsif ($ch eq '>' && $inangle && !$indouble && !$insingle) { - my($func) = "read_line"; - if ($line =~ /while/) { - if ($needReadLine) { - push(@cppsubs, "static char* read_line (int fd)\n" . - "{\n" . - " static const size_t blen = 2048;\n" . - " static char buffer[blen];\n" . - "\n" . - " buffer[0] = '\\0';\n" . - " off_t current = lseek(fd, 0, SEEK_CUR);\n" . - " ssize_t amount = read (fd, buffer, blen);\n" . - " if (amount > 0)\n" . - " {\n" . - " for(ssize_t i = 0; i < amount; i++)\n" . - " {\n" . - " if (buffer[i] == '\\n')\n" . - " {\n" . - " buffer[i + 1] = '\\0';\n" . - " lseek (fd, current + i + 1, SEEK_SET);\n" . - " break;\n" . - " }\n" . - " }\n" . - " }\n" . - "\n" . - " return buffer;\n" . - "}\n" . - "\n" . - "\n"); - $needReadLine = 0; - } - } - else { - $func = "read_file"; - if ($needReadFile) { - push(@cppsubs, "static char* read_file (int fd)\n" . - "{\n" . - " static const size_t blen = 5120;\n" . - " static char buffer[blen];\n" . - "\n" . - " buffer[0] = '\\0';\n" . - " ssize_t amount = read (fd, buffer, blen);\n" . - " if (amount > 0)\n" . - " buffer[amount] = '\\0';\n" . - "\n" . - " return buffer;\n" . - "}\n"); - $needReadFile = 0; - } - } - substr($line, $i, 1) = ")"; - substr($line, $inangle, 1) = "$func("; - $inangle = 0; - $length = length($line); - $i += length($func); - } - } - - return $line; -} - - -sub usageAndExit { - my($str) = shift; - if (defined $str) { - print "$str\n"; - } - print "Usage: " . basename($0) . " [-t <time factor>] <input> <output>\n\n" . - " -t <time factor> The multiple to be applied to " . - "each timeout value.\n" . - " <input> Input perl script.\n" . - " <output> Output c++ file.\n"; - exit(0); -} - -# ****************************************************************** -# Main Section -# ****************************************************************** - -my($ifile) = "run_test.pl"; -my($ofile) = "-"; - -while(1) { - if ($ARGV[0] eq "-h") { - usageAndExit(); - } - elsif ($ARGV[0] eq "-t") { - shift(@ARGV); - $timefactor = $ARGV[0]; - if (!defined $timefactor || $timefactor !~ /^\d+$/) { - usageAndExit("Invalid timeout factor"); - } - } - elsif ($ARGV[0] =~ /^\-/) { - usageAndExit("Unknown option: $ARGV[0]"); - } - else { - last; - } - shift(@ARGV); -} - -if (defined $ARGV[0]) { - $ifile = $ARGV[0]; -} -if (defined $ARGV[1]) { - $ofile = $ARGV[1]; -} - -my($fh) = new FileHandle(); -if (open($fh, $ifile)) { - my($oh) = new FileHandle(); - if (open($oh, ">$ofile")) { - my($line) = ""; - my($inspect) = ""; - my($hostValue) = "localhost"; - - push(@cppheader, getTop()); - while(<$fh>) { - my($injected) = undef; - my($output) = undef; - $line = $_; - $lineCount++; - - ## For now, comment out anything using $ENV{} or - ## PerlACE::check_n_cleanup_files - if ($line =~ /\$ENV/ || - $line =~ /PerlACE::check_n_cleanup_files/) { - $line = "## $line"; - } - - ## Convert die's - if ($line =~ /(.*)\s+(or|and)\s+die\s*(.*);/) { - my($left) = $1; - my($op) = $2; - my($right) = $3; - $line = "if (" . ($op eq "or" ? "!" : "") . "$left) {\n"; - $right =~ s/\((.*)\)/$1/; - my($space) = getIndent(); - $injected = "$space ACE_OS::fprintf(stderr, $right);\n" . - "$space exit(1);\n" . - "$space}\n"; - } - - ## Convert $^O to $OSNAME - $line =~ s/\$\^O/\$OSNAME/g; - - $line =~ s/^\s+//g; - $line =~ s/[^\$\\]#.*//g; - $line =~ s/^#.*//; - $line =~ s/\s+$//g; - - ## PerlACE transform - $line =~ s/PerlACE::LocalFile\s*\((.*)\)/FULL_PATH $1/g; - $line =~ s/PerlACE::waitforfile_timed/TAO_TestCombinedThreads::waitForFileTimed/g; - $line =~ s/TAO_TestCombinedThreads::waitForFileTimed\s*\(([^,]+),([^\)]+)\)/TAO_TestCombinedThreads::waitForFileTimed \($1, \($2 * $timefactor\)\)/; - $line =~ s/PerlACE::uniqueid\s*/TAO_TestCombinedThreads::getRandomPortBase/g; - - ## time transform - $line =~ s/time/time_variable/g; - - ## main arguments transform - $line =~ s/\$#ARGV/\(argc - 1\)/g; - $line =~ s/\$ARGV\[([^\]]+)\]/argv\[$1\]/g; - if ($line =~ /argv\[(\d+)\]/) { - my($val) = $1 + 1; - $line =~ s/argv\[\d+\]/argv\[$val\]/; - } - - ## TARGETHOSTNAME transform - if ($line =~ /\$TARGETHOSTNAME\s*=\s*\"(.*)\"/) { - $hostValue = $1; - $line = ""; - } - $line =~ s/\$TARGETHOSTNAME/$hostValue/g; - - $inspect = concatenate(buildLine($line)); - - if ($inspect =~ /getopts/) { - $inspect = handleGetopts($inspect); - } - - if ($inspect eq "") { - $output = ""; - } - elsif ($inspect =~ /^eval\s+/) { - } - elsif ($inspect =~ /^use\s+/) { - } - elsif ($inspect =~ /^require\s+/) { - } - elsif ($inspect =~ /split\s*\(/) { - $output = handleSplit($inspect); - } - elsif ($inspect =~ /^(my\s+)?[\$\%\@]\w+(\s*\[[\$\w]+\])?\s*(\.)?=/) { - $output = handleAssignment($inspect); - } - elsif ($inspect =~ /^foreach\s+/) { - $output = handleForeach($inspect); - } - elsif ($inspect =~ /^for\s+/) { - $output = handleFor($inspect); - } - elsif ($inspect =~ /^while\s+/) { - $output = handleWhile($inspect); - } - elsif ($inspect =~ /^if\s*\(/ || $inspect =~ /[}]?\s*elsif\s*\(/) { - $output = handleIf($inspect); - } - elsif ($inspect =~ /else/) { - $output = $inspect; - if ($inspect =~ /}/) { - decrementIndent(); - } - if ($inspect =~ /{/) { - incrementIndent(); - } - } - elsif ($inspect =~ /}/) { - $output = $inspect; - decrementIndent(); - } - elsif ($inspect =~ /\$(\w+)\+\+/) { - $output = $inspect; - $output =~ s/\$//g; - } - elsif ($inspect =~ /^exit/) { - if ($inspect =~ /exit(\s*\(\s*\))?;/) { - $inspect = "exit(0);"; - } - $output = handleKeyword("exit", $inspect); - } - elsif ($inspect =~ /^unlink/) { - $output = handleKeyword("unlink", $inspect); - } - elsif ($inspect =~ /^sleep/) { - $output = handleKeyword("sleep", $inspect); - } - elsif ($inspect =~ /^close/) { - $output = handleKeyword("close", $inspect); - } - elsif ($inspect =~ /^print[\s\(]/) { - $output = handlePrint($inspect); - } - elsif ($inspect =~ /\->Spawn/) { - my(@parts) = handleSpawn($inspect); - $output = "$parts[0]$parts[1]"; - } - elsif ($inspect =~ /->WaitKill/) { - handleWaitKill($inspect); - } - elsif ($inspect =~ /->Kill/) { - handleWaitKill($inspect); - } - elsif ($inspect =~ /->Arguments/) { - $output = handleArguments($inspect); - } - elsif ($inspect =~ /local\s*\(/) { - handleLocal($inspect); - } - elsif ($inspect =~ /sub\s+\w+\s*/) { - $output = handleSubroutine($inspect); - } - elsif ($inspect =~ /open\s*\(/) { - my(@parts) = handleOpen($inspect); - $output = $parts[0]; - } - else { - if ($inspect ne "") { - my($needError) = 1; - $output = "// Needs to be implemented: $inspect"; - foreach my $sub (@subs) { - if ($inspect =~ /$sub/) { - $output = handleSubCall($inspect); - $needError = 0; - last; - } - } - if ($needError) { - generateError($UNSUPPORTED_CONSTRUCT, $inspect); - } - } - } - - if (defined $output) { - ## Post-processing - $output = convertFILEtoInt($output); - $output = convertAngleToRead($output); - - if ($needMain) { - push(@cppbody, getMainBeginning()); - if (defined $injected) { - push(@cppbody, $injected); - decrementIndent(); - } - $needMain = 0; - } - if ($output =~ /}\s*elsif/) { - decrementIndent(); - } - my($part) = ($output ne "" ? getIndent() : "") . "$output\n"; - if ($insub) { - push(@cppsubs, $part); - if (defined $injected) { - push(@cppsubs, $injected); - decrementIndent(); - } - } - else { - if (!$firstExecutable) { - push(@cppbody, $part); - if (defined $injected) { - push(@cppbody, $injected); - decrementIndent(); - } - } - else { - push(@cppheader, $part); - if (defined $injected) { - push(@cppheader, $injected); - decrementIndent(); - } - } - } - if ($insub == 1 && $indent == $indsc) { - $insub = 0; - } - if ($output =~ /}\s*elsif/) { - $indent++; - } - } - } - push(@cppbody, getMainEnding()); - - ## Put in the definition of the timeout's now that - ## the defaultTimeout is as large as it's going to get. - foreach my $timeout (sort keys %timeoutVars) { - my($val) = ($timeoutVars{$timeout} eq "" ? $defaultTimeout : - $timeoutVars{$timeout}); - unshift(@cppbody, "static int $timeout = ($val * $timefactor);\n"); - } - - foreach my $line (@cppheader, @cppsubs, @cppbody) { - print $oh $line; - } - } - else { - print STDERR "Unable to open $ofile for output\n"; - $status++; - } - close($fh); -} -else { - print STDERR "Unable to open $ifile for input\n"; - $status++; -} - -## Remove the file if there was an error -if ($status) { - unlink($ofile); -} - -exit($status); |