Last active
August 29, 2015 14:00
-
-
Save NeoCat/11020320 to your computer and use it in GitHub Desktop.
Submit a source code in the specified language to ideone.com (in private mode) and get executed results
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/perl | |
use strict; | |
use warnings; | |
use SOAP::Lite; | |
my $user = '******'; | |
my $pass = '******'; | |
my $client = SOAP::Lite->new(proxy => 'http://ideone.com/api/1/service'); | |
my $arg = shift || 'list'; | |
my $lang_ids; | |
my $lang_id; | |
sub lang_list { | |
my $i = 0; | |
for (sort {$a <=> $b} keys %$lang_ids) { | |
printf "%3d: %s\n", $_, $lang_ids->{$_}; | |
} | |
exit 1; | |
} | |
sub get_langs { | |
my $langs = $client->getLanguages($user, $pass)->result; | |
die $langs->{'error'} if $langs->{'error'} ne 'OK'; | |
$lang_ids = $langs->{'languages'}; | |
} | |
sub search_lang { | |
my $arg = shift; | |
my $lang = $arg; | |
$lang =~ s/\(\)//g; | |
$lang =~ s/([+*?$@%&()\[\]])/\\$1/g; | |
for my $more (0,1) { | |
for (sort {$a<=>$b} keys %$lang_ids) { | |
my $name = $lang_ids->{$_}; | |
if (!$more and ($_ eq $lang or $name eq $arg or | |
$name =~ /^$lang\s+\(/i or $name =~ /\($lang\)/i) or | |
$more and ($name =~ /^$lang\s/i or $name =~ /\($lang[\s-]/i)) { | |
print STDERR "Language: $name\n"; | |
return $_; | |
} | |
} | |
} | |
return 0; | |
} | |
sub read_data { | |
my $file = shift; | |
my $f; | |
if ($file ne '-') { | |
open $f, "<", $file or die "cannot open file '$file'"; | |
} else { | |
print STDERR "reading from stdin:\n"; | |
$f = *STDIN; | |
} | |
my $data = join '', <$f>; | |
close $f if $file ne '-'; | |
return $data; | |
} | |
sub submit { | |
my $result = $client->createSubmission( | |
$user, $pass, $_[1], $_[0], $_[2], 1, 1 | |
)->result; | |
die $result->{'error'} if $result->{'error'} ne 'OK'; | |
return $result->{'link'}; | |
} | |
sub check_status { | |
my $result = $client->getSubmissionStatus($user, $pass, $_[0])->result; | |
die $result->{'error'} if $result->{'error'} ne 'OK'; | |
my $status = $result->{'status'}; | |
my $msg = '???'; | |
if ($status < 0) { | |
$msg = "waiting ..."; | |
} elsif ($status == 0) { | |
$msg = "done!"; | |
} elsif ($status == 1) { | |
$msg = "compiling ..."; | |
} elsif ($status == 3) { | |
$msg = "running ..."; | |
} | |
return $status, $msg; | |
} | |
sub get_result { | |
my $result = $client->getSubmissionDetails( | |
$user, $pass, $_[0], 0, 0, 1, 1, 1 | |
)->result; | |
die $result->{'error'} if $result->{'error'} ne 'OK'; | |
return $result; | |
} | |
sub result_str { | |
my $result = shift; | |
my $code = $result->{'result'}; | |
my %result_str = ( | |
0 => 'OK', | |
11 => 'compilation error', | |
12 => 'runtime error', | |
13 => 'time limit exceeded', | |
15 => 'success', | |
17 => 'memory limit exceeded', | |
19 => 'illegal system call', | |
20 => 'internal error', | |
); | |
return $result_str{$code} || 'unknown result'; | |
} | |
sub print_result { | |
my $result = shift; | |
print STDERR "--- output ---\n"; | |
print $result->{'output'}; | |
$|=1; $|=0; #flush | |
print STDERR "--- stderr ---\n"; | |
print STDERR $result->{'stderr'}; | |
print STDERR "--- cmpinfo ---\n"; | |
print STDERR $result->{'cmpinfo'} || ''; | |
} | |
print STDERR "Getting languages ..."; | |
get_langs(); | |
print STDERR "\r"; | |
lang_list() if $arg eq 'list'; | |
$lang_id = search_lang($arg); | |
lang_list() unless $lang_id; | |
my $file = shift or die "no source file is specified\n"; | |
my $input_file = shift; | |
my $source = read_data($file); | |
my $input = $input_file && read_data($input_file); | |
print STDERR "Submitting ..."; | |
my $link = submit($lang_id, $source, $input); | |
my $status = -1; | |
my $msg; | |
do { | |
sleep 3; | |
print STDERR "\rGetting status ... "; | |
($status, $msg) = check_status($link); | |
printf STDERR "\r%-20s", $msg; | |
} while $status; | |
my $result = get_result($link); | |
my $code = $result->{'result'}; | |
my $result_str = result_str($result); | |
print STDERR "[$code: $result_str]\n"; | |
print_result($result); | |
exit($code == 0 || $code == 15 ? 0 : $code); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Usage:
If
Example