2015-01-15 10:21:18 +01:00
#!/usr/bin/perl
use warnings ;
use strict ;
package _c_base ;
use parent '_default' ;
2015-05-19 05:48:15 +02:00
sub preprocess {
my $ self = shift ;
$ self - > SUPER:: preprocess ;
if ( $ self - > { cmdline } =~ m/--(?:version|analyze)/ ) {
$ self - > { done } = 1 ;
}
}
2015-01-15 10:21:18 +01:00
sub postprocess {
my $ self = shift ;
2015-07-18 17:12:59 +02:00
$ self - > SUPER:: postprocess ;
2015-01-15 10:21:18 +01:00
# no errors compiling, but if output contains something, it must be diagnostic messages
if ( length $ self - > { output } ) {
$ self - > { output } =~ s/^\s+// ;
$ self - > { output } =~ s/\s+$// ;
$ self - > { output } = "[$self->{output}]\n" ;
}
print "Executing gdb\n" ;
2018-03-13 06:35:57 +01:00
my ( $ retval , $ result ) = $ self - > execute ( 60 , "date -s \@$self->{date}; ulimit -t 5; compiler_watchdog.pl $self->{arguments} > .output" ) ;
2015-01-15 10:21:18 +01:00
$ result = "" ;
open ( FILE , '.output' ) ;
while ( <FILE> ) {
$ result . = $ _ ;
last if length $ result >= 1024 * 20 ;
}
close ( FILE ) ;
$ result =~ s/\s+$// ;
2015-09-18 07:18:14 +02:00
if ( not length $ result ) {
$ self - > { no_output } = 1 ;
} elsif ( $ self - > { code } =~ m/print_last_statement\(.*\);$/m
2019-05-10 14:02:32 +02:00
&& ( $ result =~ m/A syntax error in expression/ || $ result =~ m/No symbol.*in current context/ || $ result =~ m/has unknown return type; cast the call to its declared/ || $ result =~ m/Can't take address of.*which isn't an lvalue/ ) ) {
2015-09-18 07:18:14 +02:00
# strip print_last_statement and rebuild/re-run
$ self - > { code } =~ s/print_last_statement\((.*)\);/$1;/mg ;
$ self - > preprocess ;
$ self - > postprocess ;
} else {
$ self - > { output } . = $ result ;
}
2015-01-15 10:21:18 +01:00
}
1 ;