mbed TLS Build

Dependents:   Slave-prot-prod

Committer:
williequesada
Date:
Tue Jun 04 16:03:38 2019 +0000
Revision:
1:1a219dea6cb5
Parent:
0:cdf462088d13
compartir a Pablo

Who changed what in which revision?

UserRevisionLine numberNew contents of line
markrad 0:cdf462088d13 1 #!/usr/bin/env perl
markrad 0:cdf462088d13 2
markrad 0:cdf462088d13 3 # generate_code.pl
markrad 0:cdf462088d13 4 #
markrad 0:cdf462088d13 5 # This file is part of mbed TLS (https://tls.mbed.org)
markrad 0:cdf462088d13 6 #
markrad 0:cdf462088d13 7 # Copyright (c) 2009-2016, ARM Limited, All Rights Reserved
markrad 0:cdf462088d13 8 #
markrad 0:cdf462088d13 9 # Purpose
markrad 0:cdf462088d13 10 #
markrad 0:cdf462088d13 11 # Generates the test suite code given inputs of the test suite directory that
markrad 0:cdf462088d13 12 # contain the test suites, and the test suite file names for the test code and
markrad 0:cdf462088d13 13 # test data.
markrad 0:cdf462088d13 14 #
markrad 0:cdf462088d13 15 # Usage: generate_code.pl <suite dir> <code file> <data file> [main code file]
markrad 0:cdf462088d13 16 #
markrad 0:cdf462088d13 17 # Structure of files
markrad 0:cdf462088d13 18 #
markrad 0:cdf462088d13 19 # - main code file - 'main_test.function'
markrad 0:cdf462088d13 20 # Template file that contains the main() function for the test suite,
markrad 0:cdf462088d13 21 # test dispatch code as well as support functions. It contains the
markrad 0:cdf462088d13 22 # following symbols which are substituted by this script during
markrad 0:cdf462088d13 23 # processing:
markrad 0:cdf462088d13 24 # TESTCASE_FILENAME
markrad 0:cdf462088d13 25 # TESTCODE_FILENAME
markrad 0:cdf462088d13 26 # SUITE_PRE_DEP
markrad 0:cdf462088d13 27 # MAPPING_CODE
markrad 0:cdf462088d13 28 # FUNCTION CODE
markrad 0:cdf462088d13 29 # SUITE_POST_DEP
markrad 0:cdf462088d13 30 # DEP_CHECK_CODE
markrad 0:cdf462088d13 31 # DISPATCH_FUNCTION
markrad 0:cdf462088d13 32 # !LINE_NO!
markrad 0:cdf462088d13 33 #
markrad 0:cdf462088d13 34 # - common helper code file - 'helpers.function'
markrad 0:cdf462088d13 35 # Common helper functions
markrad 0:cdf462088d13 36 #
markrad 0:cdf462088d13 37 # - test suite code file - file name in the form 'test_suite_xxx.function'
markrad 0:cdf462088d13 38 # Code file that contains the actual test cases. The file contains a
markrad 0:cdf462088d13 39 # series of code sequences delimited by the following:
markrad 0:cdf462088d13 40 # BEGIN_HEADER / END_HEADER - list of headers files
markrad 0:cdf462088d13 41 # BEGIN_SUITE_HELPERS / END_SUITE_HELPERS - helper functions common to
markrad 0:cdf462088d13 42 # the test suite
markrad 0:cdf462088d13 43 # BEGIN_CASE / END_CASE - the test cases in the test suite. Each test
markrad 0:cdf462088d13 44 # case contains at least one function that is used to create the
markrad 0:cdf462088d13 45 # dispatch code.
markrad 0:cdf462088d13 46 #
markrad 0:cdf462088d13 47 # - test data file - file name in the form 'test_suite_xxxx.data'
markrad 0:cdf462088d13 48 # The test case parameters to to be used in execution of the test. The
markrad 0:cdf462088d13 49 # file name is used to replace the symbol 'TESTCASE_FILENAME' in the main
markrad 0:cdf462088d13 50 # code file above.
markrad 0:cdf462088d13 51 #
markrad 0:cdf462088d13 52
markrad 0:cdf462088d13 53 use strict;
markrad 0:cdf462088d13 54
markrad 0:cdf462088d13 55 my $suite_dir = shift or die "Missing suite directory";
markrad 0:cdf462088d13 56 my $suite_name = shift or die "Missing suite name";
markrad 0:cdf462088d13 57 my $data_name = shift or die "Missing data name";
markrad 0:cdf462088d13 58 my $test_main_file = do { my $arg = shift; defined($arg) ? $arg : $suite_dir."/main_test.function" };
markrad 0:cdf462088d13 59 my $test_file = $data_name.".c";
markrad 0:cdf462088d13 60 my $test_common_helper_file = $suite_dir."/helpers.function";
markrad 0:cdf462088d13 61 my $test_case_file = $suite_dir."/".$suite_name.".function";
markrad 0:cdf462088d13 62 my $test_case_data = $suite_dir."/".$data_name.".data";
markrad 0:cdf462088d13 63
markrad 0:cdf462088d13 64 my $line_separator = $/;
markrad 0:cdf462088d13 65 undef $/;
markrad 0:cdf462088d13 66
markrad 0:cdf462088d13 67
markrad 0:cdf462088d13 68 #
markrad 0:cdf462088d13 69 # Open and read in the input files
markrad 0:cdf462088d13 70 #
markrad 0:cdf462088d13 71
markrad 0:cdf462088d13 72 open(TEST_HELPERS, "$test_common_helper_file") or die "Opening test helpers
markrad 0:cdf462088d13 73 '$test_common_helper_file': $!";
markrad 0:cdf462088d13 74 my $test_common_helpers = <TEST_HELPERS>;
markrad 0:cdf462088d13 75 close(TEST_HELPERS);
markrad 0:cdf462088d13 76
markrad 0:cdf462088d13 77 open(TEST_MAIN, "$test_main_file") or die "Opening test main '$test_main_file': $!";
markrad 0:cdf462088d13 78 my @test_main_lines = split/^/, <TEST_MAIN>;
markrad 0:cdf462088d13 79 my $test_main;
markrad 0:cdf462088d13 80 my $index = 2;
markrad 0:cdf462088d13 81 for my $line (@test_main_lines) {
markrad 0:cdf462088d13 82 $line =~ s/!LINE_NO!/$index/;
markrad 0:cdf462088d13 83 $test_main = $test_main.$line;
markrad 0:cdf462088d13 84 $index++;
markrad 0:cdf462088d13 85 }
markrad 0:cdf462088d13 86 close(TEST_MAIN);
markrad 0:cdf462088d13 87
markrad 0:cdf462088d13 88 open(TEST_CASES, "$test_case_file") or die "Opening test cases '$test_case_file': $!";
markrad 0:cdf462088d13 89 my @test_cases_lines = split/^/, <TEST_CASES>;
markrad 0:cdf462088d13 90 my $test_cases;
markrad 0:cdf462088d13 91 my $index = 2;
markrad 0:cdf462088d13 92 for my $line (@test_cases_lines) {
markrad 0:cdf462088d13 93 if ($line =~ /^\/\* BEGIN_SUITE_HELPERS .*\*\//)
markrad 0:cdf462088d13 94 {
markrad 0:cdf462088d13 95 $line = $line."#line $index \"$test_case_file\"\n";
markrad 0:cdf462088d13 96 }
markrad 0:cdf462088d13 97
markrad 0:cdf462088d13 98 if ($line =~ /^\/\* BEGIN_CASE .*\*\//)
markrad 0:cdf462088d13 99 {
markrad 0:cdf462088d13 100 $line = $line."#line $index \"$test_case_file\"\n";
markrad 0:cdf462088d13 101 }
markrad 0:cdf462088d13 102
markrad 0:cdf462088d13 103 $line =~ s/!LINE_NO!/$index/;
markrad 0:cdf462088d13 104
markrad 0:cdf462088d13 105 $test_cases = $test_cases.$line;
markrad 0:cdf462088d13 106 $index++;
markrad 0:cdf462088d13 107 }
markrad 0:cdf462088d13 108
markrad 0:cdf462088d13 109 close(TEST_CASES);
markrad 0:cdf462088d13 110
markrad 0:cdf462088d13 111 open(TEST_DATA, "$test_case_data") or die "Opening test data '$test_case_data': $!";
markrad 0:cdf462088d13 112 my $test_data = <TEST_DATA>;
markrad 0:cdf462088d13 113 close(TEST_DATA);
markrad 0:cdf462088d13 114
markrad 0:cdf462088d13 115
markrad 0:cdf462088d13 116 #
markrad 0:cdf462088d13 117 # Find the headers, dependencies, and suites in the test cases file
markrad 0:cdf462088d13 118 #
markrad 0:cdf462088d13 119
markrad 0:cdf462088d13 120 my ( $suite_header ) = $test_cases =~ /\/\* BEGIN_HEADER \*\/\n(.*?)\n\/\* END_HEADER \*\//s;
markrad 0:cdf462088d13 121 my ( $suite_defines ) = $test_cases =~ /\/\* BEGIN_DEPENDENCIES\n \* (.*?)\n \* END_DEPENDENCIES/s;
markrad 0:cdf462088d13 122 my ( $suite_helpers ) = $test_cases =~ /\/\* BEGIN_SUITE_HELPERS \*\/\n(.*?)\n\/\* END_SUITE_HELPERS \*\//s;
markrad 0:cdf462088d13 123
markrad 0:cdf462088d13 124 my $requirements;
markrad 0:cdf462088d13 125 if ($suite_defines =~ /^depends_on:/)
markrad 0:cdf462088d13 126 {
markrad 0:cdf462088d13 127 ( $requirements ) = $suite_defines =~ /^depends_on:(.*)$/;
markrad 0:cdf462088d13 128 }
markrad 0:cdf462088d13 129
markrad 0:cdf462088d13 130 my @var_req_arr = split(/:/, $requirements);
markrad 0:cdf462088d13 131 my $suite_pre_code;
markrad 0:cdf462088d13 132 my $suite_post_code;
markrad 0:cdf462088d13 133 my $dispatch_code;
markrad 0:cdf462088d13 134 my $mapping_code;
markrad 0:cdf462088d13 135 my %mapping_values;
markrad 0:cdf462088d13 136
markrad 0:cdf462088d13 137 while (@var_req_arr)
markrad 0:cdf462088d13 138 {
markrad 0:cdf462088d13 139 my $req = shift @var_req_arr;
markrad 0:cdf462088d13 140 $req =~ s/(!?)(.*)/$1defined($2)/;
markrad 0:cdf462088d13 141
markrad 0:cdf462088d13 142 $suite_pre_code .= "#if $req\n";
markrad 0:cdf462088d13 143 $suite_post_code .= "#endif /* $req */\n";
markrad 0:cdf462088d13 144 }
markrad 0:cdf462088d13 145
markrad 0:cdf462088d13 146 $/ = $line_separator;
markrad 0:cdf462088d13 147
markrad 0:cdf462088d13 148 open(TEST_FILE, ">$test_file") or die "Opening destination file '$test_file': $!";
markrad 0:cdf462088d13 149 print TEST_FILE << "END";
markrad 0:cdf462088d13 150 /*
markrad 0:cdf462088d13 151 * *** THIS FILE HAS BEEN MACHINE GENERATED ***
markrad 0:cdf462088d13 152 *
markrad 0:cdf462088d13 153 * This file has been machine generated using the script: $0
markrad 0:cdf462088d13 154 *
markrad 0:cdf462088d13 155 * Test file : $test_file
markrad 0:cdf462088d13 156 *
markrad 0:cdf462088d13 157 * The following files were used to create this file.
markrad 0:cdf462088d13 158 *
markrad 0:cdf462088d13 159 * Main code file : $test_main_file
markrad 0:cdf462088d13 160 * Helper file : $test_common_helper_file
markrad 0:cdf462088d13 161 * Test suite file : $test_case_file
markrad 0:cdf462088d13 162 * Test suite data : $test_case_data
markrad 0:cdf462088d13 163 *
markrad 0:cdf462088d13 164 *
markrad 0:cdf462088d13 165 * This file is part of mbed TLS (https://tls.mbed.org)
markrad 0:cdf462088d13 166 */
markrad 0:cdf462088d13 167
markrad 0:cdf462088d13 168 #if !defined(MBEDTLS_CONFIG_FILE)
markrad 0:cdf462088d13 169 #include <mbedtls/config.h>
markrad 0:cdf462088d13 170 #else
markrad 0:cdf462088d13 171 #include MBEDTLS_CONFIG_FILE
markrad 0:cdf462088d13 172 #endif
markrad 0:cdf462088d13 173
markrad 0:cdf462088d13 174
markrad 0:cdf462088d13 175 /*----------------------------------------------------------------------------*/
markrad 0:cdf462088d13 176 /* Common helper code */
markrad 0:cdf462088d13 177
markrad 0:cdf462088d13 178 $test_common_helpers
markrad 0:cdf462088d13 179
markrad 0:cdf462088d13 180
markrad 0:cdf462088d13 181 /*----------------------------------------------------------------------------*/
markrad 0:cdf462088d13 182 /* Test Suite Code */
markrad 0:cdf462088d13 183
markrad 0:cdf462088d13 184 $suite_pre_code
markrad 0:cdf462088d13 185 $suite_header
markrad 0:cdf462088d13 186 $suite_helpers
markrad 0:cdf462088d13 187 $suite_post_code
markrad 0:cdf462088d13 188
markrad 0:cdf462088d13 189 END
markrad 0:cdf462088d13 190
markrad 0:cdf462088d13 191 $test_main =~ s/SUITE_PRE_DEP/$suite_pre_code/;
markrad 0:cdf462088d13 192 $test_main =~ s/SUITE_POST_DEP/$suite_post_code/;
markrad 0:cdf462088d13 193
markrad 0:cdf462088d13 194 while($test_cases =~ /\/\* BEGIN_CASE *([\w:]*) \*\/\n(.*?)\n\/\* END_CASE \*\//msg)
markrad 0:cdf462088d13 195 {
markrad 0:cdf462088d13 196 my $function_deps = $1;
markrad 0:cdf462088d13 197 my $function_decl = $2;
markrad 0:cdf462088d13 198
markrad 0:cdf462088d13 199 # Sanity checks of function
markrad 0:cdf462088d13 200 if ($function_decl !~ /^#line\s*.*\nvoid /)
markrad 0:cdf462088d13 201 {
markrad 0:cdf462088d13 202 die "Test function does not have 'void' as return type.\n" .
markrad 0:cdf462088d13 203 "Function declaration:\n" .
markrad 0:cdf462088d13 204 $function_decl;
markrad 0:cdf462088d13 205 }
markrad 0:cdf462088d13 206 if ($function_decl !~ /^(#line\s*.*)\nvoid (\w+)\(\s*(.*?)\s*\)\s*{(.*)}/ms)
markrad 0:cdf462088d13 207 {
markrad 0:cdf462088d13 208 die "Function declaration not in expected format\n";
markrad 0:cdf462088d13 209 }
markrad 0:cdf462088d13 210 my $line_directive = $1;
markrad 0:cdf462088d13 211 my $function_name = $2;
markrad 0:cdf462088d13 212 my $function_params = $3;
markrad 0:cdf462088d13 213 my $function_pre_code;
markrad 0:cdf462088d13 214 my $function_post_code;
markrad 0:cdf462088d13 215 my $param_defs;
markrad 0:cdf462088d13 216 my $param_checks;
markrad 0:cdf462088d13 217 my @dispatch_params;
markrad 0:cdf462088d13 218 my @var_def_arr = split(/,\s*/, $function_params);
markrad 0:cdf462088d13 219 my $i = 1;
markrad 0:cdf462088d13 220 my $mapping_regex = "".$function_name;
markrad 0:cdf462088d13 221 my $mapping_count = 0;
markrad 0:cdf462088d13 222
markrad 0:cdf462088d13 223 $function_decl =~ s/(^#line\s*.*)\nvoid /$1\nvoid test_suite_/;
markrad 0:cdf462088d13 224
markrad 0:cdf462088d13 225 # Add exit label if not present
markrad 0:cdf462088d13 226 if ($function_decl !~ /^exit:$/m)
markrad 0:cdf462088d13 227 {
markrad 0:cdf462088d13 228 $function_decl =~ s/}\s*$/\nexit:\n return;\n}/;
markrad 0:cdf462088d13 229 }
markrad 0:cdf462088d13 230
markrad 0:cdf462088d13 231 if ($function_deps =~ /^depends_on:/)
markrad 0:cdf462088d13 232 {
markrad 0:cdf462088d13 233 ( $function_deps ) = $function_deps =~ /^depends_on:(.*)$/;
markrad 0:cdf462088d13 234 }
markrad 0:cdf462088d13 235
markrad 0:cdf462088d13 236 foreach my $req (split(/:/, $function_deps))
markrad 0:cdf462088d13 237 {
markrad 0:cdf462088d13 238 $function_pre_code .= "#ifdef $req\n";
markrad 0:cdf462088d13 239 $function_post_code .= "#endif /* $req */\n";
markrad 0:cdf462088d13 240 }
markrad 0:cdf462088d13 241
markrad 0:cdf462088d13 242 foreach my $def (@var_def_arr)
markrad 0:cdf462088d13 243 {
markrad 0:cdf462088d13 244 # Handle the different parameter types
markrad 0:cdf462088d13 245 if( substr($def, 0, 4) eq "int " )
markrad 0:cdf462088d13 246 {
markrad 0:cdf462088d13 247 $param_defs .= " int param$i;\n";
markrad 0:cdf462088d13 248 $param_checks .= " if( verify_int( params[$i], &param$i ) != 0 ) return( DISPATCH_INVALID_TEST_DATA );\n";
markrad 0:cdf462088d13 249 push @dispatch_params, "param$i";
markrad 0:cdf462088d13 250
markrad 0:cdf462088d13 251 $mapping_regex .= ":([\\d\\w |\\+\\-\\(\\)]+)";
markrad 0:cdf462088d13 252 $mapping_count++;
markrad 0:cdf462088d13 253 }
markrad 0:cdf462088d13 254 elsif( substr($def, 0, 6) eq "char *" )
markrad 0:cdf462088d13 255 {
markrad 0:cdf462088d13 256 $param_defs .= " char *param$i = params[$i];\n";
markrad 0:cdf462088d13 257 $param_checks .= " if( verify_string( &param$i ) != 0 ) return( DISPATCH_INVALID_TEST_DATA );\n";
markrad 0:cdf462088d13 258 push @dispatch_params, "param$i";
markrad 0:cdf462088d13 259 $mapping_regex .= ":[^:\n]+";
markrad 0:cdf462088d13 260 }
markrad 0:cdf462088d13 261 else
markrad 0:cdf462088d13 262 {
markrad 0:cdf462088d13 263 die "Parameter declaration not of supported type (int, char *)\n";
markrad 0:cdf462088d13 264 }
markrad 0:cdf462088d13 265 $i++;
markrad 0:cdf462088d13 266
markrad 0:cdf462088d13 267 }
markrad 0:cdf462088d13 268
markrad 0:cdf462088d13 269 # Find non-integer values we should map for this function
markrad 0:cdf462088d13 270 if( $mapping_count)
markrad 0:cdf462088d13 271 {
markrad 0:cdf462088d13 272 my @res = $test_data =~ /^$mapping_regex/msg;
markrad 0:cdf462088d13 273 foreach my $value (@res)
markrad 0:cdf462088d13 274 {
markrad 0:cdf462088d13 275 next unless ($value !~ /^\d+$/);
markrad 0:cdf462088d13 276 if ( $mapping_values{$value} ) {
markrad 0:cdf462088d13 277 ${ $mapping_values{$value} }{$function_pre_code} = 1;
markrad 0:cdf462088d13 278 } else {
markrad 0:cdf462088d13 279 $mapping_values{$value} = { $function_pre_code => 1 };
markrad 0:cdf462088d13 280 }
markrad 0:cdf462088d13 281 }
markrad 0:cdf462088d13 282 }
markrad 0:cdf462088d13 283
markrad 0:cdf462088d13 284 my $call_params = join ", ", @dispatch_params;
markrad 0:cdf462088d13 285 my $param_count = @var_def_arr + 1;
markrad 0:cdf462088d13 286 $dispatch_code .= << "END";
markrad 0:cdf462088d13 287 if( strcmp( params[0], "$function_name" ) == 0 )
markrad 0:cdf462088d13 288 {
markrad 0:cdf462088d13 289 $function_pre_code
markrad 0:cdf462088d13 290 $param_defs
markrad 0:cdf462088d13 291 if( cnt != $param_count )
markrad 0:cdf462088d13 292 {
markrad 0:cdf462088d13 293 mbedtls_fprintf( stderr, "\\nIncorrect argument count (%d != %d)\\n", cnt, $param_count );
markrad 0:cdf462088d13 294 return( DISPATCH_INVALID_TEST_DATA );
markrad 0:cdf462088d13 295 }
markrad 0:cdf462088d13 296
markrad 0:cdf462088d13 297 $param_checks
markrad 0:cdf462088d13 298 test_suite_$function_name( $call_params );
markrad 0:cdf462088d13 299 return ( DISPATCH_TEST_SUCCESS );
markrad 0:cdf462088d13 300 $function_post_code
markrad 0:cdf462088d13 301 return ( DISPATCH_UNSUPPORTED_SUITE );
markrad 0:cdf462088d13 302 }
markrad 0:cdf462088d13 303 else
markrad 0:cdf462088d13 304 END
markrad 0:cdf462088d13 305
markrad 0:cdf462088d13 306 my $function_code = $function_pre_code . $function_decl . "\n" .
markrad 0:cdf462088d13 307 $function_post_code;
markrad 0:cdf462088d13 308 $test_main =~ s/FUNCTION_CODE/$function_code\nFUNCTION_CODE/;
markrad 0:cdf462088d13 309 }
markrad 0:cdf462088d13 310
markrad 0:cdf462088d13 311 # Find specific case dependencies that we should be able to check
markrad 0:cdf462088d13 312 # and make check code
markrad 0:cdf462088d13 313 my $dep_check_code;
markrad 0:cdf462088d13 314
markrad 0:cdf462088d13 315 my @res = $test_data =~ /^depends_on:([\w:]+)/msg;
markrad 0:cdf462088d13 316 my %case_deps;
markrad 0:cdf462088d13 317 foreach my $deps (@res)
markrad 0:cdf462088d13 318 {
markrad 0:cdf462088d13 319 foreach my $dep (split(/:/, $deps))
markrad 0:cdf462088d13 320 {
markrad 0:cdf462088d13 321 $case_deps{$dep} = 1;
markrad 0:cdf462088d13 322 }
markrad 0:cdf462088d13 323 }
markrad 0:cdf462088d13 324 while( my ($key, $value) = each(%case_deps) )
markrad 0:cdf462088d13 325 {
markrad 0:cdf462088d13 326 $dep_check_code .= << "END";
markrad 0:cdf462088d13 327 if( strcmp( str, "$key" ) == 0 )
markrad 0:cdf462088d13 328 {
markrad 0:cdf462088d13 329 #if defined($key)
markrad 0:cdf462088d13 330 return( DEPENDENCY_SUPPORTED );
markrad 0:cdf462088d13 331 #else
markrad 0:cdf462088d13 332 return( DEPENDENCY_NOT_SUPPORTED );
markrad 0:cdf462088d13 333 #endif
markrad 0:cdf462088d13 334 }
markrad 0:cdf462088d13 335 END
markrad 0:cdf462088d13 336 }
markrad 0:cdf462088d13 337
markrad 0:cdf462088d13 338 # Make mapping code
markrad 0:cdf462088d13 339 while( my ($key, $value) = each(%mapping_values) )
markrad 0:cdf462088d13 340 {
markrad 0:cdf462088d13 341 my $key_mapping_code = << "END";
markrad 0:cdf462088d13 342 if( strcmp( str, "$key" ) == 0 )
markrad 0:cdf462088d13 343 {
markrad 0:cdf462088d13 344 *value = ( $key );
markrad 0:cdf462088d13 345 return( KEY_VALUE_MAPPING_FOUND );
markrad 0:cdf462088d13 346 }
markrad 0:cdf462088d13 347 END
markrad 0:cdf462088d13 348
markrad 0:cdf462088d13 349 # handle depenencies, unless used at least one without depends
markrad 0:cdf462088d13 350 if ($value->{""}) {
markrad 0:cdf462088d13 351 $mapping_code .= $key_mapping_code;
markrad 0:cdf462088d13 352 next;
markrad 0:cdf462088d13 353 }
markrad 0:cdf462088d13 354 for my $ifdef ( keys %$value ) {
markrad 0:cdf462088d13 355 (my $endif = $ifdef) =~ s!ifdef!endif //!g;
markrad 0:cdf462088d13 356 $mapping_code .= $ifdef . $key_mapping_code . $endif;
markrad 0:cdf462088d13 357 }
markrad 0:cdf462088d13 358 }
markrad 0:cdf462088d13 359
markrad 0:cdf462088d13 360 $dispatch_code =~ s/^(.+)/ $1/mg;
markrad 0:cdf462088d13 361
markrad 0:cdf462088d13 362 $test_main =~ s/TESTCASE_FILENAME/$test_case_data/g;
markrad 0:cdf462088d13 363 $test_main =~ s/TESTCODE_FILENAME/$test_case_file/g;
markrad 0:cdf462088d13 364 $test_main =~ s/FUNCTION_CODE//;
markrad 0:cdf462088d13 365 $test_main =~ s/DEP_CHECK_CODE/$dep_check_code/;
markrad 0:cdf462088d13 366 $test_main =~ s/DISPATCH_FUNCTION/$dispatch_code/;
markrad 0:cdf462088d13 367 $test_main =~ s/MAPPING_CODE/$mapping_code/;
markrad 0:cdf462088d13 368
markrad 0:cdf462088d13 369 print TEST_FILE << "END";
markrad 0:cdf462088d13 370 $test_main
markrad 0:cdf462088d13 371 END
markrad 0:cdf462088d13 372
markrad 0:cdf462088d13 373 close(TEST_FILE);