281 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			Raku
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			281 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			Raku
		
	
	
		
			Executable File
		
	
	
| #!/usr/bin/perl -w
 | |
| 
 | |
| # functions.pm
 | |
| # This package contains a set of subroutines to modify the templates for the openMP Testuite.
 | |
| 
 | |
| 
 | |
| ################################################################################
 | |
| # subroutines to extract, modify or delete tags from the template
 | |
| ################################################################################
 | |
| 
 | |
| # LIST get_tag_values( $tagname, $string )
 | |
| # subrutine to get the text encloded by a tag.
 | |
| # Returns a list containing the inner texts of the found tags
 | |
| sub get_tag_values
 | |
| {
 | |
| 	my ( $tagname, $string );
 | |
| 	( $tagname, $string ) = @_;
 | |
| 	my (@tmp,@tmp2);
 | |
|    	@tmp = split(/\<$tagname\>/,$string); 
 | |
| 	foreach $_(@tmp){
 | |
| 		push(@tmp2,split(/\<\/$tagname\>/));
 | |
| 	}
 | |
| 	my(@result,$i);
 | |
| 	$i=1; # couter to get only every second item
 | |
| 	foreach $_(@tmp2){
 | |
| 		if($i%2 eq 0){
 | |
| 			push(@result,$_);
 | |
| 		}
 | |
| 		$i++;
 | |
| 	}
 | |
| 	return @result;
 | |
| }
 | |
| 
 | |
| # LIST replace_tags( $tagname, $replacestring, @list )
 | |
| # subrutine to replace tags by a replacestring. 
 | |
| # Returns a list of the srings after conversion.
 | |
| sub replace_tags
 | |
| {
 | |
| 	my ($tagname, $replacestring, @stringlist, @result);
 | |
| 	($tagname, $replacestring, @stringlist) = @_;
 | |
| 	foreach $_(@stringlist) {
 | |
| 		s#\<$tagname\>(.*?)\<\/$tagname\>#$replacestring#gs;
 | |
| 		push(@result,$_);
 | |
| 	}
 | |
| 	return @result;
 | |
| }
 | |
| 
 | |
| # LIST enlarge_tags( $tagname, $before, $after, @list )
 | |
| # subrutine to replace tags by the tags added by a string before and after. 
 | |
| # Returns a list of the srings after conversion.
 | |
| sub enlarge_tags
 | |
| {
 | |
| 	my ($tagname, $before, $after, @stringlist,@result);
 | |
| 	($tagname, $before, $after, @stringlist) = @_;
 | |
| 	foreach $_(@stringlist) {
 | |
| 		s#\<$tagname\>(.*?)\<\/$tagname\>#$before$1$after#gs;
 | |
| 		push(@result,$_);
 | |
| 	}
 | |
| 	return @result;
 | |
| }
 | |
| 
 | |
| # LIST delete_tags( $tagname, @list )
 | |
| # subrutine to delete tags in a string. 
 | |
| # Returns a list of the cleared strings
 | |
| sub delete_tags
 | |
| {
 | |
| 	my($tagname,@stringlist);
 | |
| 	($tagname, @stringlist) = @_;
 | |
| 	my(@result);
 | |
| 	foreach $_(@stringlist) {
 | |
| 		s#\<$tagname\>(.*?)\<\/$tagname\>##gs;
 | |
| 		push(@result,$_);
 | |
| 	}
 | |
| 	return @result;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| ################################################################################
 | |
| # subroutines for generating "orpahned" tests 					
 | |
| ################################################################################
 | |
| 
 | |
| # SCALAR create_orph_cfunctions( $prefix, $code )
 | |
| # returns a string containing the definitions of the functions for the 
 | |
| # orphan regions.
 | |
| sub create_orph_cfunctions
 | |
| {
 | |
| 	my ($code,@defs);
 | |
| 	($code) = @_;
 | |
| 	@defs = get_tag_values('ompts:orphan',$code);
 | |
| 	($functionname) = get_tag_values('ompts:testcode:functionname',$code);
 | |
| 	my ( @result,$functionsrc, $i);
 | |
| 	$functionsrc =  "\n/* Automatically generated definitions of the orphan functions */\n";
 | |
| 
 | |
| 	$i = 1;
 | |
| 	foreach (@defs) {
 | |
| 		$functionsrc .= "\nvoid orph$i\_$functionname (FILE * logFile) {";
 | |
| 		$functionsrc .= $_;
 | |
| 		$functionsrc .= "\n}\n";
 | |
| 		$i++;
 | |
| 	}
 | |
| 	$functionsrc .= "/* End of automatically generated definitions */\n";
 | |
| 	return $functionsrc;
 | |
| }
 | |
| 
 | |
| # SCALAR create_orph_fortranfunctions( $prefix, $code )
 | |
| # returns a string containing the definitions of the functions for the 
 | |
| # orphan regions.
 | |
| sub create_orph_fortranfunctions
 | |
| {
 | |
| 	my ($prefix,$code,@defs,$orphan_parms);
 | |
| 	($prefix,$code,$orphan_parms) = @_;
 | |
| 	@defs = get_tag_values('ompts:orphan',$code);
 | |
| 
 | |
|     #to remove space and put a single space
 | |
|     if($orphan_parms ne "")
 | |
|     {
 | |
|       $orphan_parms =~ s/[ \t]+//sg;
 | |
|       $orphan_parms =~ s/[ \t]+\n/\n/sg;
 | |
|     }
 | |
|     
 | |
| 	($orphanvarsdefs) = get_tag_values('ompts:orphan:vars',$code);
 | |
| 	foreach (@varsdef) {
 | |
| 		if (not /[^ \n$]*/){ $orphanvarsdefs = join("\n",$orphanvarsdef,$_);}
 | |
| 	}
 | |
| 	($functionname) = get_tag_values('ompts:testcode:functionname',$code);
 | |
| 	my ( @result,$functionsrc, $i);
 | |
| 	$functionsrc =  "\n! Definitions of the orphan functions\n";
 | |
| 	$i = 1;
 | |
| 	foreach $_(@defs)
 | |
| 	{
 | |
| 		$functionsrc .= "\n      SUBROUTINE orph$i\_$prefix\_$functionname\($orphan_parms\)\n      ";
 | |
|         $functionsrc .= "INCLUDE \"omp_testsuite.f\"\n";
 | |
| 		$functionsrc .= $orphanvarsdefs."\n";
 | |
| 		$functionsrc .= $_;
 | |
| 		$functionsrc .= "\n";
 | |
| 		$functionsrc .= "      END SUBROUTINE\n! End of definition\n\n";
 | |
| 		$i++;
 | |
| 	}
 | |
| 	return $functionsrc;
 | |
| }
 | |
| 
 | |
| # LIST orphan_regions2cfunctions( $prefix, @code )
 | |
| # replaces orphan regions by functioncalls in C/C++.
 | |
| sub orphan_regions2cfunctions
 | |
| {
 | |
| 	my ($code, $i, $functionname);
 | |
| 	($code) = @_;
 | |
| 	$i = 1;
 | |
| 	($functionname) = get_tag_values('ompts:testcode:functionname',$code);
 | |
|         while( /\<ompts\:orphan\>(.*)\<\/ompts\:orphan\>/s) {
 | |
|             s#\<ompts\:orphan\>(.*?)\<\/ompts\:orphan\>#orph$i\_$functionname (logFile);#s;
 | |
|             $i++;
 | |
|         }
 | |
| 	return $code;
 | |
| }
 | |
| 
 | |
| # LIST orphan_regions2fortranfunctions( $prefix, @code )
 | |
| # replaces orphan regions by functioncalls in fortran
 | |
| sub orphan_regions2fortranfunctions
 | |
| {
 | |
| 	my ( $prefix, @code, $my_parms, $i, $functionname);
 | |
| 	($prefix, ($code), $my_parms) = @_;
 | |
| 	$i = 1;
 | |
| 	($functionname) = get_tag_values('ompts:testcode:functionname',$code);
 | |
| 	foreach $_(($code))
 | |
| 	{
 | |
| 		while( /\<ompts\:orphan\>(.*)\<\/ompts\:orphan\>/s)
 | |
| 		{
 | |
| 			s#\<ompts\:orphan\>(.*?)\<\/ompts\:orphan\>#      CALL orph$i\_$prefix\_$functionname\($my_parms\);#s;
 | |
| 			$i++;
 | |
| 		}
 | |
| 	}
 | |
| 	return ($code);
 | |
| }
 | |
| 
 | |
| # SCALAR orph_functions_declarations( $prefix, $code )
 | |
| # returns a sring including the declaration of the functions used 
 | |
| # in the orphan regions. The function names are generated using 
 | |
| # the $prefix as prefix for the functionname.
 | |
| sub orph_functions_declarations
 | |
| {
 | |
| 	my ($prefix, $code);
 | |
| 	($prefix, $code) = @_;
 | |
| 	my ( @defs, $result );
 | |
| 	
 | |
| 	# creating declarations for later used functions
 | |
| 	$result .= "\n\n/* Declaration of the functions containing the code for the orphan regions */\n#include <stdio.h>\n";
 | |
| 	@defs = get_tag_values('ompts:orphan',$code);
 | |
| 	my ($functionname,$i);
 | |
| 	($functionname) = get_tag_values('ompts:testcode:functionname',$code);
 | |
| 	$i = 1;
 | |
| 	foreach $_(@defs) {
 | |
| 		$result .= "\nvoid orph$i\_$prefix\_$functionname ( FILE * logFile );";
 | |
| 		$i++;
 | |
| 	}
 | |
| 	$result .= "\n\n/* End of declaration */\n\n";
 | |
| 	return $result;
 | |
| }
 | |
| 
 | |
| # SCALAR make_global_vars_definition( $code )
 | |
| # returns a sring including the declaration for the vars needed to
 | |
| # be declared global for the orphan region.
 | |
| sub make_global_vars_def
 | |
| {
 | |
| 	my ( $code );
 | |
| 	($code) = @_;
 | |
| 	my ( @defs, $result, @tmp, @tmp2 ,$predefinitions);
 | |
| 	
 | |
| 	# creating global declarations for the variables.
 | |
| 	$result  = "\n\n/* Declaration of the variables used in the orphan region. */\n";
 | |
| 	
 | |
| 	# get all tags containing the variable definitions
 | |
| 	@defs = get_tag_values('ompts:orphan:vars',$code);
 | |
| 	foreach $_(@defs)
 | |
| 	{
 | |
| 		# cutting the different declarations in the same tag by the ';' as cuttmark
 | |
| 		@tmp = split(/;/,$_);
 | |
| 		foreach $_(@tmp)
 | |
| 		{
 | |
| 			# replacing newlines and double spaces
 | |
| 			s/\n//gs;
 | |
| 			s/  //gs;
 | |
| 			# put the new declaration at the end of $result
 | |
| 			if($_ ne ""){ $result .= "\n $_;"; }
 | |
| 		}
 | |
| 	}
 | |
| 	$result .= "\n\n/* End of declaration. */\n\n";
 | |
| 	return $result;
 | |
| }
 | |
| 
 | |
| # SCALAR extern_vars_definition( $code )
 | |
| # returns a sring including the declaration for the vars needed to
 | |
| # be declared extern for the orphan region.
 | |
| sub extern_vars_def
 | |
| {
 | |
| 	my ( $code );
 | |
| 	($code) = @_;
 | |
| 	my ( @defs, $result, @tmp, @tmp2 ,$predefinitions);
 | |
| 	
 | |
| 	# creating declarations for the extern variables.
 | |
| 	$result  = "\n\n/* Declaration of the extern variables used in the orphan region. */\n";
 | |
| 	# $result .= "\n#include <stdio.h>\n#include <omp.h>\n";
 | |
| 	$result .= "\nextern FILE * logFile;";
 | |
| 	
 | |
| 	# get all tags containing the variable definitions
 | |
| 	@defs = get_tag_values('ompts:orphan:vars',$code);
 | |
| 	foreach $_(@defs)
 | |
| 	{
 | |
| 		# cutting the different declarations in the same tag by the ';' as cuttmark
 | |
| 		@tmp = split(/;/,$_);
 | |
| 		foreach $_(@tmp)
 | |
| 		{
 | |
| 			# replacing newlines and double spaces
 | |
| 			s/\n//gs;
 | |
| 			s/  //gs;
 | |
| 			# cutting off definitions
 | |
| 			@tmp2 = split("=",$_);
 | |
| 			# put the new declaration at the end of $result
 | |
| 			$result .= "\nextern $tmp2[0];";
 | |
| 		}
 | |
| 	}
 | |
| 	$result .= "\n\n/* End of declaration. */\n\n";
 | |
| 	return $result;
 | |
| }
 | |
| 
 | |
| sub leave_single_space
 | |
| {
 | |
|   my($str);
 | |
|   ($str)=@_;
 | |
|   if($str ne "")
 | |
|   {
 | |
|     $str =~ s/^[ \t]+/ /;
 | |
|     $str =~ s/[ \t]+\n$/\n/;
 | |
|     $str =~ s/[ \t]+//g;
 | |
|   }
 | |
|   return $str;
 | |
| }
 | |
| 
 | |
| return 1;
 |