From da352f64d724f011e58c69abd39ef99a9a312795 Mon Sep 17 00:00:00 2001 From: Pragmatic Software Date: Thu, 11 Sep 2014 13:37:41 +0000 Subject: [PATCH] compiler_vm: Save command-line args and compiler flags to history; handle \b properly; other misc fixes --- modules/compiler_vm/compiler_vm_client.pl | 64 ++++++++++++++++------- 1 file changed, 44 insertions(+), 20 deletions(-) diff --git a/modules/compiler_vm/compiler_vm_client.pl b/modules/compiler_vm/compiler_vm_client.pl index 299a4e12..2da1f378 100755 --- a/modules/compiler_vm/compiler_vm_client.pl +++ b/modules/compiler_vm/compiler_vm_client.pl @@ -41,7 +41,7 @@ my %languages = ( my %preludes = ( 'C99' => "#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#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#inclue \n#include \n#include \n#include \n\n", - 'C11' => "#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#include \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#include \n#include \n#include \n#include \n\n", + 'C11' => "#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#include \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#include \n#include \n#include \n#include \n#include \n\n", 'C89' => "#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#include \n#include \n#include \n\n", ); @@ -100,6 +100,12 @@ sub paste_sprunge { my $result = $response->content; $result =~ s/^\s+//; $result =~ s/\s+$/?c/; + + # 2014/7/23 -- sprunge.us suddenly stops producing URLs and only produces paste id + if ($result !~ /sprunge.us/) { + $result = "http://sprunge.us/$result"; + } + return $result; } @@ -637,6 +643,22 @@ if($subcode =~ m/^\s*(?:and\s+)?(run|paste)\s*$/i) { my $lang = "C11"; $lang = uc $1 if $code =~ s/-lang=([^\b\s]+)//i; +if($save_last_code) { + if($unshift_last_code) { + unshift @last_code, $code; + } + + open FILE, "> history/$channel.hist"; + + my $i = 0; + foreach my $line (@last_code) { + last if(++$i > $MAX_UNDO_HISTORY); + print FILE "$line\n"; + } + + close FILE; +} + my $input = ""; $input = $1 if $code =~ s/-(?:input|stdin)=(.*)$//i; @@ -659,22 +681,6 @@ $args =~ s/\s+$//; $code = "$include_args$code"; -if($save_last_code) { - if($unshift_last_code) { - unshift @last_code, $extracted_args . (length $args ? $args . ' ' . $code : $code); - } - - open FILE, "> history/$channel.hist"; - - my $i = 0; - foreach my $line (@last_code) { - last if(++$i > $MAX_UNDO_HISTORY); - print FILE "$line\n"; - } - - close FILE; -} - if($only_show) { print "$nick: $code\n"; exit 0; @@ -951,7 +957,7 @@ if($lang eq 'C89' or $lang eq 'C99' or $lang eq 'C11' or $lang eq 'C++') { } print "final extract: [$ret][$ident][$params][$body]\n" if $debug; - $code .= "$precode_code\n$ret $ident($params) $body\n\n"; + $code .= "$precode_code\n$ret $ident($params) $body\n"; if($debug >= 2) { print '-' x 20 . "\n" } print " code: [$code]\n" if $debug >= 2; @@ -994,6 +1000,8 @@ $input = `fortune -u -s` if not length $input; $input =~ s/[\n\r\t]/ /msg; $input =~ s/:/ - /g; $input =~ s/\s+/ /g; +$input =~ s/^\s+//; +$input =~ s/\s+$//; print FILE "$nick: [lang:$lang][args:$args][input:$input]\n", pretty($code), "\n" unless $got_run and $copy_code; @@ -1065,7 +1073,7 @@ if($output =~ m/^\s*$/) { $output =~ s/\\0"/"/g; $output =~ s/"\\0/"/g; $output =~ s/\.\.\.>/>/g; - $output =~ s/(\\\d{3})+//g; +# $output =~ s/(?\s*//g; $output =~ s/\s*compilation terminated due to -Wfatal-errors\.//g; $output =~ s/^======= Backtrace.*\[vsyscall\]\s*$//ms; @@ -1077,7 +1085,7 @@ if($output =~ m/^\s*$/) { $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/'(.*?)' = char/'$1' = int/g; $output =~ s/(\(\s*char\s*\)\s*'.*?') = int/$1 = char/; # gdb thinks 'a' is type char, which is not true for C $output =~ s/= (-?\d+) ''/= $1/g; $output =~ s/, //g; $output =~ s/\s*warning: shadowed declaration is here \[-Wshadow\]//g unless $got_paste or $got_run eq 'paste'; @@ -1137,6 +1145,22 @@ if($output =~ m/^\s*$/) { $output =~ s/\](\d+:\d+:\s*)*error:/]\n$1error:/g; $output =~ s/\s+no output/ no output/; $output =~ s/^\s+no output/no output/; + + # backspace + my $boutput = ""; + my $active_position = 0; + $output =~ s/\n$//; + while($output =~ /(.)/gms) { + my $c = $1; + if($c eq "\b") { + if(--$active_position <= 0) { + $active_position = 0; + } + next; + } + substr($boutput, $active_position++, 1) = $c; + } + $output = $boutput; } if($warn_unterminated_define == 1) {