diff --git a/PBot/VERSION.pm b/PBot/VERSION.pm index 786b1677..dc75311e 100644 --- a/PBot/VERSION.pm +++ b/PBot/VERSION.pm @@ -13,8 +13,8 @@ use warnings; # These are set automatically by the build/commit script use constant { BUILD_NAME => "PBot", - BUILD_REVISION => 453, - BUILD_DATE => "2013-10-14", + BUILD_REVISION => 454, + BUILD_DATE => "2013-10-19", }; 1; diff --git a/modules/c2english.pl b/modules/c2english.pl index 77ff7b73..71c8f032 100755 --- a/modules/c2english.pl +++ b/modules/c2english.pl @@ -17,8 +17,8 @@ $code = ''; my $has_main = 0; -my $prelude = ''; -$prelude = "$1$2" if $precode =~ s/^\s*(#.*)(#.*?[>\n])//s; +my $prelude = "#define _XOPEN_SOURCE 9001\n#define __USE_XOPEN\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n\n"; +$prelude .= "$1$2" if $precode =~ s/^\s*(#.*)(#.*?[>\n])//s; my $preprecode = $precode; @@ -53,7 +53,7 @@ $precode =~ s/^\s+//; $precode =~ s/\s+$//; if(not $has_main) { - $code = "$prelude\n\n$code\n\nint main(void) { $precode\n return 0;}\n"; + $code = "$prelude\n\n$code\n\nint main(void) { $precode\n;\nreturn 0;}\n"; } else { $code = "$prelude\n\n$precode\n\n$code\n"; } @@ -61,6 +61,10 @@ if(not $has_main) { $code =~ s/\|n/\n/g; $code =~ s/^\s+//; $code =~ s/\s+$//; +$code =~ s/;\s*;\n/;\n/gs; +$code =~ s/;(\s*\/\*.*?\*\/\s*);\n/;$1/gs; +$code =~ s/;(\s*\/\/.*?\s*);\n/;$1/gs; +$code =~ s/({|})\n\s*;\n/$1\n/gs; chdir "$ENV{HOME}/blackshell/msmud/babel-buster/code" or die "Could not chdir: $!"; @@ -68,6 +72,67 @@ open my $fh, '>', 'code.c' or die "Could not write code: $!"; print $fh $code; close $fh; +my ($ret, $result) = execute(10, "gcc -std=c89 -pedantic -Werror -Wno-unused -c code.c"); + +if($ret != 0) { + $output = $result; + + $output =~ s/code\.c:\d+:\d+://g; + $output =~ s/code\.c://g; + $output =~ s/error=edantic/error=pedantic/g; + $output =~ s/(\d+:\d+:\s*)*cc1: all warnings being treated as errors//; + $output =~ s/(\d+:\d+:\s*)* \(first use in this function\)//g; + $output =~ s/(\d+:\d+:\s*)*error: \(Each undeclared identifier is reported only once.*?\)//msg; + $output =~ s/(\d+:\d+:\s*)*ld: warning: cannot find entry symbol _start; defaulting to [^ ]+//; + #$output =~ s/(\d+:\d+:\s*)*error: (.*?) error/error: $1; error/msg; + $output =~ s/(\d+:\d+:\s*)*\/tmp\/.*\.o://g; + $output =~ s/(\d+:\d+:\s*)*collect2: ld returned \d+ exit status//g; + $output =~ s/\(\.text\+[^)]+\)://g; + $output =~ s/\[ In/[In/; + $output =~ s/(\d+:\d+:\s*)*warning: Can't read pathname for load map: Input.output error.//g; + my $left_quote = chr(226) . chr(128) . chr(152); + my $right_quote = chr(226) . chr(128) . chr(153); + $output =~ s/$left_quote/'/msg; + $output =~ s/$right_quote/'/msg; + $output =~ s/`/'/msg; + $output =~ s/\t/ /g; + $output =~ s/(\d+:\d+:\s*)*\s*In function .main.:\s*//g; + $output =~ s/(\d+:\d+:\s*)*warning: unknown conversion type character 'b' in format \[-Wformat\]\s+(\d+:\d+:\s*)*warning: too many arguments for format \[-Wformat-extra-args\]/info: %b is a candide extension/g; + $output =~ s/(\d+:\d+:\s*)*warning: unknown conversion type character 'b' in format \[-Wformat\]//g; + $output =~ s/\s\(core dumped\)/./; +# $output =~ s/\[\s+/[/g; + $output =~ s/ \[enabled by default\]//g; + $output =~ s/initializer\s+warning: \(near/initializer (near/g; + $output =~ s/(\d+:\d+:\s*)*note: each undeclared identifier is reported only once for each function it appears in//g; + $output =~ s/\(gdb\)//g; + $output =~ s/", '\\(\d{3})' ,? ?"/\\$1/g; + $output =~ s/, '\\(\d{3})' \s*//g; + $output =~ s/(\\000)+/\\0/g; + $output =~ s/\\0[^">']+/\\0/g; + $output =~ s/= (\d+) '\\0'/= $1/g; + $output =~ s/\\0"/"/g; + $output =~ s/"\\0/"/g; + $output =~ s/\.\.\.>/>/g; + $output =~ s/(\\\d{3})+//g; + $output =~ s/<\s*included at \/home\/compiler\/>\s*//g; + $output =~ s/\s*compilation terminated due to -Wfatal-errors\.//g; + $output =~ s/^======= Backtrace.*\[vsyscall\]\s*$//ms; + $output =~ s/glibc detected \*\*\* \/home\/compiler\/code: //; + $output =~ s/: \/home\/compiler\/code terminated//; + $output =~ s///g; + $output =~ s/\s*In file included from\s+\/usr\/include\/.*?:\d+:\d+:\s*/, /g; + $output =~ s/\s*collect2: error: ld returned 1 exit status//g; + $output =~ s/In function\s*`main':\s*\/home\/compiler\/ undefined reference to/error: undefined reference to/g; + $output =~ s/\/home\/compiler\///g; + $output =~ s/compilation terminated.//; + $output =~ s/<'(.*)' = char>/<'$1' = int>/g; + $output =~ s/= (-?\d+) ''/= $1/g; + $output =~ s/, //g; + + print "$output\n"; + exit 0; +} + $output = `./c2e 2>/dev/null code.c` if not defined $output; if(not $has_main) { @@ -98,3 +163,36 @@ if($output eq " ") { } print "$output\n"; + +sub execute { + my $timeout = shift @_; + my ($cmdline) = @_; + + my ($ret, $result); + + ($ret, $result) = eval { + my $result = ''; + + my $pid = open(my $fh, '-|', "$cmdline 2>&1"); + + local $SIG{ALRM} = sub { kill 'TERM', $pid; die "$result [Timed-out]\n"; }; + alarm($timeout); + + while(my $line = <$fh>) { + $result .= $line; + } + + close $fh; + my $ret = $? >> 8; + alarm 0; + return ($ret, $result); + }; + + alarm 0; + + if($@ =~ /Timed-out/) { + return (-1, $@); + } + + return ($ret, $result); +}