From ef4b895cbc7a15f0110497cd29cd835136784f49 Mon Sep 17 00:00:00 2001 From: Pragmatic Software Date: Tue, 27 Apr 2010 22:22:02 +0000 Subject: [PATCH] Added -showurl option to include URL to results; added pretty() function with astyle dependency to indent code --- modules/codepad.pl | 35 +++++++++++++++++++++++++---- modules/ideone.pl | 56 ++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 78 insertions(+), 13 deletions(-) diff --git a/modules/codepad.pl b/modules/codepad.pl index 667fd339..b6aa86ab 100755 --- a/modules/codepad.pl +++ b/modules/codepad.pl @@ -8,6 +8,7 @@ use URI::Escape; use HTML::Entities; use HTML::Parse; use HTML::FormatText; +use IPC::Open2; my @languages = qw/C C++ D Haskell Lua OCaml PHP Perl Python Ruby Scheme Tcl/; @@ -29,6 +30,9 @@ print FILE "$nick: $code\n"; my $lang = "C"; $lang = $1 if $code =~ s/-lang=([^\b\s]+)//i; +my $show_url = 0; +$show_url = 1 if $code =~ s/-showurl//i; + my $found = 0; foreach my $l (@languages) { if(uc $lang eq uc $l) { @@ -56,9 +60,12 @@ $code = $preludes{$lang} . $code; if(($lang eq "C" or $lang eq "C++") and not $code =~ m/(int|void) main\s*\([^)]*\)\s*{/) { my $prelude = ''; $prelude = "$1$2" if $code =~ s/^\s*(#.*)(#.*?[>\n])//s; - $code = "$prelude\n int main(int argc, char **argv) { $code ; return 0; }"; + $code = "$prelude\n\nint main(int argc, char **argv) { $code ; return 0; }"; } +$code =~ s/;\s*;/;/g; +$code = pretty($code); + my %post = ( 'lang' => $lang, 'code' => $code, 'private' => 'True', 'run' => 'True', 'submit' => 'Submit' ); my $response = $ua->post("http://codepad.org", \%post); @@ -85,13 +92,33 @@ $output = HTML::FormatText->new->format(parse_html($output)); $output =~ s/^\s+//; -$output =~ s/ Line \d+ ://g; +$output =~ s/\s*Line\s+\d+\s+://g; $output =~ s/ \(first use in this function\)//g; $output =~ s/error: \(Each undeclared identifier is reported only once.*?\)//g; $output =~ s/error: (.*?).error/error: $1; error/g; -print FILE localtime . "\n"; +print FILE localtime() . "\n"; print FILE "$nick: [ $url ] $output\n\n"; close FILE; -print "$nick: $output\n"; + +if($show_url) { + print "$nick: [ $url ] $output\n"; +} else { + print "$nick: $output\n"; +} + +sub pretty { + my $code = join '', @_; + my $result; + + my $pid = open2(\*IN, \*OUT, 'astyle -xUpf'); + print OUT $code; + close OUT; + while(my $line = ) { + $result .= $line; + } + close IN; + waitpid($pid, 0); + return $result; +} diff --git a/modules/ideone.pl b/modules/ideone.pl index ce876f3e..53474330 100755 --- a/modules/ideone.pl +++ b/modules/ideone.pl @@ -4,6 +4,7 @@ use strict; use SOAP::Lite; +use IPC::Open2; my $user = 'test'; my $pass = 'test'; @@ -22,6 +23,8 @@ my %languages = ( 'bc' => { 'id' => '110', 'name' => 'bc (bc-1.06.95)' }, 'Brainfuck' => { 'id' => '12', 'name' => 'Brainf**k (bff-1.0.3.1)' }, 'bf' => { 'id' => '12', 'name' => 'Brainf**k (bff-1.0.3.1)' }, + 'gnu89' => { 'id' => '11', 'name' => 'C (gcc-4.3.4)' }, + 'C89' => { 'id' => '11', 'name' => 'C (gcc-4.3.4)' }, 'C' => { 'id' => '11', 'name' => 'C (gcc-4.3.4)' }, 'C#' => { 'id' => '27', 'name' => 'C# (gmcs 2.0.1)' }, 'C++' => { 'id' => '1', 'name' => 'C++ (gcc-4.3.4)' }, @@ -70,10 +73,14 @@ my %languages = ( 'VB' => { 'id' => '101', 'name' => 'Visual Basic .NET (mono-2.4.2.3)' }, ); +# C 11 +# C99 34 +# C++ 1 + my %preludes = ( - 'C99' => "#include \n#include \n#include \n", - 'C' => "#include \n#include \n#include \n", - 'C++' => "#include \n#include \n", + '34' => "#include \n#include \n#include \n", + '11' => "#include \n#include \n#include \n", + '1' => "#include \n#include \n", ); if($#ARGV <= 0) { @@ -90,6 +97,9 @@ print FILE "$nick: $code\n"; my $lang = "C99"; $lang = $1 if $code =~ s/-lang=([^\b\s]+)//i; +my $show_link = 0; +$show_link = 1 if $code =~ s/-showurl//i; + my $found = 0; my @langs; foreach my $l (sort { uc $a cmp uc $b } keys %languages) { @@ -110,16 +120,23 @@ $input = $1 if $code =~ s/-input=(.*)$//i; $code =~ s/#include <([^>]+)>/\n#include <$1>\n/g; $code =~ s/#([^ ]+) (.*?)\\n/\n#$1 $2\n/g; +$code =~ s/#([\w\d_]+)\\n/\n#$1\n/g; -$code = $preludes{$lang} . $code; +$code = $preludes{$languages{$lang}{'id'}} . $code; -if(($lang eq "C99" or $lang eq "C" or $lang eq "C++") and not $code =~ m/(int|void) main\s*\([^)]*\)\s*{/) { +if(($languages{$lang}{'id'} == 1 or $languages{$lang}{'id'} == 11 or $languages{$lang}{'id'} == 34) and not $code =~ m/main\s*\([^)]*\)\s*{/) { my $prelude = ''; $prelude = "$1$2" if $code =~ s/^\s*(#.*)(#.*?[>\n])//s; - $code = "$prelude\n int main(int argc, char **argv) { $code ; return 0; }"; + $code =~ s/^\s+//; + $code = "$prelude\n\nint main(int argc, char **argv) { $code; return 0;}\n"; } -$code =~ s/\\n/\n/g; +$code =~ s/;\s*;/;/g; +$code = pretty($code); + +$code =~ s/\\n/\n/g if $languages{$lang}{'id'} == 13 or $languages{$lang}{'id'} == 101; +$code =~ s/;/\n/g if $languages{$lang}{'id'} == 13; +$code =~ s/\|n/\n/g; $result = get_result($soap->createSubmission($user, $pass, $code, $languages{$lang}{'id'}, $input, 1, 1)); @@ -216,7 +233,7 @@ $signame[66] = 'SIGCLD'; $signame[67] = 'SIGPOLL'; $signame[68] = 'SIGUNUSED'; -if($result->{result} != $SUCCESSFUL) { +if($result->{result} != $SUCCESSFUL or $languages{$lang}{'id'} == 13) { $output .= $result->{cmpinfo}; $output =~ s/[\n\r]/ /g; } @@ -256,6 +273,7 @@ $output =~ s/ Line \d+ ://g; $output =~ s/ \(first use in this function\)//g; $output =~ s/error: \(Each undeclared identifier is reported only once.*?\)//msg; $output =~ s/prog\.c[:\d\s]*//g; +$output =~ s/ld: warning: cannot find entry symbol _start; defaulting to [^ ]+//; $output =~ s/error: (.*?) error/error: $1; error/msg; $output = "No output." if $output =~ m/^\s+$/; @@ -263,7 +281,12 @@ $output = "No output." if $output =~ m/^\s+$/; print FILE localtime() . "\n"; print FILE "$nick: [ http://ideone.com/$url ] $output\n\n"; close FILE; -print "$nick: $output\n"; + +if($show_link) { + print "$nick: [ http://ideone.com/$url ] $output\n"; +} else { + print "$nick: $output\n"; +} # --------------------------------------------- @@ -282,3 +305,18 @@ sub get_result { } } } + +sub pretty { + my $code = join '', @_; + my $result; + + my $pid = open2(\*IN, \*OUT, 'astyle -xUpf'); + print OUT $code; + close OUT; + while(my $line = ) { + $result .= $line; + } + close IN; + waitpid($pid, 0); + return $result; +}