aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordrbaggy <js5@sanger.ac.uk>2021-07-03 18:43:09 +0100
committerdrbaggy <js5@sanger.ac.uk>2021-07-03 18:43:09 +0100
commit7622eb86539a0d6656e4a41421a2c30cb6b91f4f (patch)
tree3f789abc44f69f610ffbd4c0ccd22690d5be05ac
parent68d9cb2252c468c8cf8a76c0468819025c170230 (diff)
downloadperlweeklychallenge-club-7622eb86539a0d6656e4a41421a2c30cb6b91f4f.tar.gz
perlweeklychallenge-club-7622eb86539a0d6656e4a41421a2c30cb6b91f4f.tar.bz2
perlweeklychallenge-club-7622eb86539a0d6656e4a41421a2c30cb6b91f4f.zip
add some rudimentary error detection...
-rw-r--r--challenge-119/james-smith/cesil/cesil.pl35
1 files changed, 23 insertions, 12 deletions
diff --git a/challenge-119/james-smith/cesil/cesil.pl b/challenge-119/james-smith/cesil/cesil.pl
index 61c724ca9c..0bbd61888e 100644
--- a/challenge-119/james-smith/cesil/cesil.pl
+++ b/challenge-119/james-smith/cesil/cesil.pl
@@ -2,33 +2,44 @@ use strict;
use warnings;
$| = 1;
-my( $ptr, @in, %mem, @code, %ptrs, $reg ) = 0;
+my( $ptr, $reg, @in, %mem, @code, %ptrs ) = 0;
+
+my %messages = (
+ 'i' => 'No further input',
+ 'm' => 'Unitialized memory at ',
+ 'l' => 'Unknown pointer ',
+);
my %commands = (
'LINE' ,sub{print "\n"},
'OUT' ,sub{print $reg},
'PRINT' ,sub{print $_[0]=~s{^"}{}r=~s{"$}{}r;},
-'IN' ,sub{die 'OUT OF INPUT' unless @in;$reg=shift@in},
+'IN' ,sub{_err('i') unless @in;$reg=shift@in},
'STORE' ,sub{$mem{$_[0]}=$reg},
-'LOAD' ,sub{$reg=$mem{$_[0]}},
-'ADD' ,sub{$reg+=$_[0]=~m{^-?\d+$}?$_[0]:$mem{$_[0]}},
-'SUBTRACT',sub{$reg-=$_[0]=~m{^-?\d+$}?$_[0]:$mem{$_[0]}},
-'MULTIPLY',sub{$reg*=$_[0]=~m{^-?\d+$}?$_[0]:$mem{$_[0]}},
-'DIVIDE' ,sub{$reg/=$_[0]=~m{^-?\d+$}?$_[0]:$mem{$_[0]};$reg=int$reg},
-'JINEG' ,sub{$ptr=$ptrs{$_[0]}-1 if $reg<0},
-'JIZERO' ,sub{$ptr=$ptrs{$_[0]}-1 if $reg==0},
-'JUMP' ,sub{$ptr=$ptrs{$_[0]}-1},
+'LOAD' ,sub{_err('m') unless exists$mem{$_[0]};$reg=$mem{$_[0]}},
+'ADD' ,sub{$reg+=$_[0]=~m{^-?\d+$}?$_[0]:exists$mem{$_[0]}?$mem{$_[0]}:(_err('m'))},
+'SUBTRACT',sub{$reg-=$_[0]=~m{^-?\d+$}?$_[0]:exists$mem{$_[0]}?$mem{$_[0]}:(_err('m'))},
+'MULTIPLY',sub{$reg*=$_[0]=~m{^-?\d+$}?$_[0]:exists$mem{$_[0]}?$mem{$_[0]}:(_err('m'))},
+'DIVIDE' ,sub{$reg/=$_[0]=~m{^-?\d+$}?$_[0]:exists$mem{$_[0]}?$mem{$_[0]}:(_err('m'));$reg=int$reg},
+'JINEG' ,sub{_err('l') unless exists $ptrs{$_[0]}; $ptr=$ptrs{$_[0]}-1 if $reg<0},
+'JIZERO' ,sub{_err('l') unless exists $ptrs{$_[0]}; $ptr=$ptrs{$_[0]}-1 if $reg==0},
+'JUMP' ,sub{_err('l') unless exists $ptrs{$_[0]}; $ptr=$ptrs{$_[0]}-1},
'HALT' ,sub{exit},
);
while(<>) {
((@in = map { 0+$_ } <> ),last) if m{^ {8}%};
($ptrs{$1},$_)=(scalar @code,$2) if m{^(\S{1,7})\s+(.*)};
- push @code, [ split m{\s+}, s{^\s+}{}r=~s{\s+$}{}r, 2 ];
+ my($cmd,$data) = split m{\s+}, s{^\s+}{}r=~s{\s+$}{}r, 2;
+ die "Unknown command [cmd $cmd - line ",1+@code,"]\n" unless exists $commands{$cmd};
+ push @code, [$cmd,$data||''];
}
my $MAX_LOOPS = 1e6;
($commands{$code[$ptr][0]}($code[$ptr][1]),$ptr++)
while --$MAX_LOOPS && $ptr<@code;
-
+sub _err {
+ my $flag = shift;
+ die sprintf "\n%s%s [cmd %s - line %d]\n", $messages{$flag}, $code[$ptr][1], $code[$ptr][0], 1+$ptr;
+}