Mercurial > repo
annotate shove @ 2024:79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
author | HackBot |
---|---|
date | Thu, 07 Feb 2013 00:11:10 +0000 |
parents | |
children |
rev | line source |
---|---|
2024
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
1 #!/usr/bin/env perl |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
2 # -*- cperl -*- |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
3 # Shove interpreter. By Alex Smith. |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
4 |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
5 # Commands: |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
6 # ' " Quote a string ('' strings nest inside "" strings and vice versa) |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
7 # < v > ^ Change direction of execution |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
8 # A V ( ) Pop a string onto the playfield |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
9 # space NOP |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
10 |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
11 # ! NOP, but tells the compiler that everything behind the IP will |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
12 # never be used (a useful optimisation) |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
13 # S NOP, but outputs TOS (without popping) on systems with output |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
14 # n NOP, but outputs a newline on systems with output |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
15 |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
16 use strict; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
17 |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
18 # Read in the program |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
19 |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
20 my $debug = ($#ARGV >= 0 and $ARGV[0] eq '-d' and shift and 1); |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
21 my @program = ($#ARGV >= 0 and ($ARGV[0] ne '-f' or (shift and 0))) |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
22 ? @ARGV : <>; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
23 chomp for @program; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
24 |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
25 my $x = 0; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
26 my $y = 0; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
27 my $width = 0; $width = ($width < length $_ ? length $_ : $width) for @program; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
28 my $height = scalar @program; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
29 my $totalrotation = 0; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
30 my @stack = (); |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
31 # always going right, we rotate the program if necessary to ensure this |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
32 |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
33 # Pads its argument to width $width. |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
34 sub widthpad { |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
35 my $s = shift; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
36 return $s . (' ' x ($width - length $s)); |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
37 } |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
38 |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
39 # Rotates the program clockwise (arg = 1), 180 degrees (arg = 2), |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
40 # or anticlockwise (arg = 3) |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
41 sub rotateprogram { |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
42 my $amount = shift; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
43 $amount or return; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
44 $totalrotation += $amount; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
45 $totalrotation %= 4; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
46 if ($amount >= 2) { |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
47 @program = reverse @program; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
48 $_ = reverse widthpad $_ for @program; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
49 $x = $width - 1 - $x; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
50 $y = $height - 1 - $y; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
51 tr/<v>^AV()/>^<vVA)(/ for @program; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
52 $amount == 2 and return; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
53 } else { |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
54 $_ = widthpad $_ for @program; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
55 } |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
56 my @newprog = (); |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
57 # We repeatedly move the leftmost column of @program to the top row |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
58 # of @newprog. |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
59 while (length $program[0]) { |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
60 my $build=''; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
61 $build = (substr $_, 0, 1, '') . $build for @program; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
62 push @newprog, $build; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
63 } |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
64 @program = @newprog; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
65 tr/<^>v(A)V/^>v<A)V(/ for @program; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
66 ($width, $height) = ($height, $width); |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
67 ($x, $y) = ($width - 1 - $y, $x); |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
68 } |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
69 |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
70 sub shove { |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
71 my $sx = shift; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
72 my $sy = shift; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
73 if($sx < 0) { |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
74 $_ = ' '.$_ for @program; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
75 $x++; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
76 $sx++; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
77 $width++; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
78 } |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
79 if($sx >= $width) { |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
80 $width++; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
81 } |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
82 if($sy < 0) { |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
83 unshift @program, ""; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
84 $y++; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
85 $sy++; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
86 $height++; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
87 } |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
88 if($sy >= $height) { |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
89 push @program, ""; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
90 $height++; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
91 } |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
92 scalar @stack or die "Empty stack when shoving."; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
93 $program[$sy] = widthpad $program[$sy]; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
94 ($x > $sx && $y == $sy) and $x += length $stack[0]; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
95 substr $program[$sy], $sx, 0, shift @stack; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
96 $program[$sy] =~ s/\ +$//; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
97 $width < length $program[$sy] and $width = length $program[$sy]; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
98 } |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
99 |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
100 sub showprogram { |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
101 my $tr = $totalrotation; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
102 print "\nactual size: ($width, $height), pos: ($x, $y)\n"; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
103 rotateprogram ((4-$tr)%4); |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
104 $program[$y] = widthpad $program[$y]; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
105 my $c = substr $program[$y], $x, 1, '*'; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
106 print "rotated for viewing; pos: ($x, $y), dir: $tr\n"; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
107 print "stack: "; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
108 print "{$_} " for @stack; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
109 print "\n"; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
110 print "$_\n" for @program; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
111 substr $program[$y], $x, 1, $c; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
112 rotateprogram $tr; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
113 scalar <STDIN>; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
114 } |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
115 |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
116 while ($x < $width && $y < $height && $x >= 0 && $y >= 0) { |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
117 showprogram if $debug; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
118 my $cmd = substr $program[$y], $x, 1; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
119 # $cmd eq '>' is a nop |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
120 $cmd eq '^' and rotateprogram 1; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
121 $cmd eq '<' and rotateprogram 2; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
122 $cmd eq 'v' and rotateprogram 3; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
123 $cmd eq '(' and shove $x-1, $y; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
124 $cmd eq ')' and shove $x+1, $y; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
125 $cmd eq 'A' and shove $x, $y-1; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
126 $cmd eq 'V' and shove $x, $y+1; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
127 $cmd eq 'S' and print $stack[0]; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
128 $cmd eq 'n' and print '\n'; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
129 if ($cmd eq '!') { |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
130 substr $_, 0, $x, '' for @program; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
131 $width -= $x; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
132 $x = 0; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
133 } |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
134 if ($cmd eq '"' || $cmd eq "'") { |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
135 my $quotecount = 1; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
136 my $lws = $cmd eq "'"; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
137 my $newpush = ""; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
138 while($quotecount) { |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
139 $x++; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
140 $x < $width or die "Unterminated string."; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
141 $cmd = substr $program[$y], $x, 1; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
142 $cmd eq "'" and ($quotecount += ($lws ? -1 : 1)), ($lws = !$lws); |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
143 $cmd eq '"' and ($quotecount += ($lws ? 1 : -1)), ($lws = !$lws); |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
144 $quotecount and $newpush .= $cmd; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
145 } |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
146 unshift @stack, $newpush; |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
147 } |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
148 $x++; # move to next command |
79b45e2443ad
<oerjan> fetch http://oerjan.nvg.org/esoteric/shove/shove
HackBot
parents:
diff
changeset
|
149 } |