blob: 98d7271fcbd05b0a717240ca5a88c2e776b1102f [file] [log] [blame]
#!/usr/bin/env perl
# ompts_parser [option] SOURCEFILE
#
# Creats the tests and the crosstests for the OpenMP-Testsuite out of an templatefiles which are given to the programm.
#
# Options:
# -test: make test
# -crosstest: make crosstest
# -orphan if possible generate tests using orphan regions (not implemented yet)
# -lang=LANG preprocessing for language LANG, where LANG is one of the following languages:
# c, fortran
# -o=FILENAME outputfile (only when one templatefile is specified)
# Using Getopt::long to extract the programm options
use Getopt::Long;
# Using functions: Set of subroutines to modify the testcode
use ompts_parserFunctions;
# Getting given options
GetOptions("-test" => \$test,"-crosstest" => \$crosstest, "-o=s" => \$outputfile, "-orphan" => \$orphan, "-f!", "-lang=s" => \$language);
# Remaining arguments are the templatefiles.
# Adding these to the list of to be parsed files if they exist.
foreach $file(@ARGV)
{
if(-e $file){ push(@sourcefiles,$file); }
else { print "Error: Unknown Option $file\n"; }
}
# Checking if options were valid:
#################################################################
# preparations and checks for sourcefiles
if(@sourcefiles == 0){die "No files to parse are specified!";}
if($outputfile && (@sourcefiles != 1 || ($test && $crosstest) ) ){die "There were multiple files for one outputfiles specified!";}
# preparations fopr orphan tests
if($orphan){ $orphanprefix = "orphaned"; }
else { $orphanprefix = ""; }
# preparations for test / crosstest
if($test){push(@testtypes,"test");
# %checks['test']="check";
}
if($crosstest){push(@testtypes,"ctest");
# %checks['crosstest']="crosscheck";
}
# preparations and checks for language
if($language eq"c") { $extension = "c";}
elsif($language eq "fortran" or $language eq "f") { $language = "f"; $extension = "f";}
else { die "You must specify a valid language!"; }
# Reading the templates for the tests into @sources
foreach $srcfile (@sourcefiles)
{
# Reading the content of the current sourcefile into $src
open(TEST,$srcfile) or print "Error: Could not open template $srcfile\n";
while(<TEST>){ $src .= $_; }
close(TEST);
# Adding the content $src to the end of the list @sources
push(@sources,$src);
}
# Extracting the source for the mainprogramm and saving it in $mainprocsrc
if($language eq "c") { $mainprocsrc = "ompts_standaloneProc.c"; }
elsif($language eq "f") { $mainprocsrc = "ompts_standaloneProc.f"; }
open(MAINPROC,$mainprocsrc) or die "Could not open the sourcefile for the main program $mainprocsrc";
while(<MAINPROC>){
$mainproc .= $_;
}
foreach $testtype (@testtypes)
{
foreach $src(@sources)
{
# Some temporary testinformation:
($description) = get_tag_values('ompts:testdescription',$src);
($directive) = get_tag_values('ompts:directive',$src);
($functionname) = get_tag_values('ompts:testcode:functionname',$src);
open(OUTFILE,">".$language.$orphanprefix.$testtype."_".$functionname.".".$extension) or die("Could not create the output file for $directive");
# Creating the source for the test:
($code) = get_tag_values('ompts:testcode',$src);
# Putting together the functions and the mainprogramm:
$code .= $mainproc;
# get the parameters <ompts:orphan:params> by joon
# thanks to Dr. Yin Ma in Absoft
($parms) = get_tag_values('ompts:orphan:parms',$code);
($parms) = leave_single_space($parms);
# to remove parameters tag between 'ompts:orphan:parms' by joon
($code) = replace_tags('ompts:orphan:parms','',$code);
# Make modifications for the orphaned testversion if necessary:
if($orphan)
{
# Get the global variables:
@defs = get_tag_values("ompts:orphan:vars",$code);
$orphvarsdef = "";
foreach $_ (@defs)
{
#print $_;
if(not /^[ ]*$/gs) { $orphvarsdef = join("\n",$orphvarsdef,$_); }
#print "OK\n".$orphvarsdef;
}
if($language eq "f")
{
# Generate the orphan subroutines:
$orphfuncs = create_orph_fortranfunctions("$testtype_", $code);
# Replace orphan regions by functioncalls:
($code) = orphan_regions2fortranfunctions( "$testtype_", ($code) );
($code) = enlarge_tags('ompts:orphan:vars','','',($code));
($code) = enlarge_tags('ompts:orphan:parms','','',($code));
#to find orphan call statemetn and add parameters
# Put all together:
$code = $code . $orphfuncs;
}
elsif($language eq "c")
{
# Generate predeclarations for orpahn functions:
$orphfuncsdefs = orph_functions_declarations("$testtype_",$code);
# Generate the orphan functions:
$orphfuncs = create_orph_cfunctions("$testtype_",$code);
# Repla:e orphan regions by functioncalls:
($code) = orphan_regions2cfunctions( "$testtype_", ($code) );
# Deleting the former declarations of the variables in the orphan regions:
($code) = delete_tags('ompts:orphan:vars',($code));
# Put all together:
$code = "#include \"omp_testsuite.h\"\n".$orphvarsdef . $orphfuncsdefs . $code . $orphfuncs;
}
else {
print "An error occurred!";
}
}
# remove parameters between <ompts:orphan:parms> tags, added by joon
($code)= replace_tags('ompts:orphan:parms',$code);
# Remove the marks for the orpahn regions and its variables:
($code) = enlarge_tags('ompts:orphan','','',($code));
($code) = enlarge_tags('ompts:orphan:vars','','',($code));
# remove parameters between for orphaned directive parametes, added by joon
($code) = enlarge_tags('ompts:orphan:parms','','',($code));
if($testtype eq "test") {
# Remove the marks for the testcode and remove the code for the crosstests:
($code) = enlarge_tags('ompts:check','','',($code));
($code) = delete_tags('ompts:crosscheck',($code));
}
elsif($testtype eq "ctest") {
# Remove the marks for the crosstestcode and remove the code for the tests:
($code) = enlarge_tags('ompts:crosscheck','','',($code));
($code) = delete_tags('ompts:check',($code));
}
# Making some final modifications:
($code) = replace_tags('testfunctionname',$testtype."_".$functionname,($code));
($code) = replace_tags('directive',$directive,($code));
($code) = replace_tags('description',$description,($code));
($code) = enlarge_tags('ompts:testcode:functionname',$testtype."_",'',($code) );
# $code = "\#include \"omp_testsuite.h\"\n".$code;
# Write the result into the file and close it:
print OUTFILE $code;
close(OUTFILE);
}
}