3 # This file is part of Language::Befunge.
4 # Copyright (c) 2001-2008 Jerome Quelin, all rights reserved.
6 # This program is free software; you can redistribute it and/or modify
7 # it under the same terms as Perl itself.
11 #----------------------------------------------#
12 # Stack of stack operations. #
13 #----------------------------------------------#
16 use Language::Befunge;
17 use POSIX qw! tmpnam !;
25 my $bef = Language::Befunge->new;
28 # In order to see what happens...
31 open OUT, ">$file" or die $!;
37 open OUT, "<$file" or die $!;
50 $bef->store_code( <<'END_OF_CODE' );
51 123 2 { ... 3 { .... 0 { 3 .. 987 01- { . 3 u ... 4 u .. v
52 0u... 456 02- u 56 04- u 163 2 } ....... 2 01-u 2 } v >
53 .. 4 01- u 0 } .. 004 03-u 02- } .. q >
56 # (6,0) { new, >0, enough
57 # * bef: ( [1 2 3 2] ) Storage (0,0)
58 # * aft: ( [2 3] [1 0 0] ) Storage (7,0)
60 # (14,0) { new, >0, not enough
61 # * bef: ( [3] [1 0 0] ) Storage (7,0)
62 # * aft: ( [0 0 0] [7 0] [1 0 0] ) Storage (15,0)
65 # * bef: ( [0] [7 0] [1 0 0] ) Storage (15,0)
66 # * aft: ( [] [15 0] [7 0] [1 0 0] ) Storage (24,0)
69 # * bef: ( [9 8 7 -1] [15 0] [7 0] [1 0 0] ) Storage (24,0)
70 # * aft: ( [] [9 8 7 0 24 0] [15 0] [7 0] [1 0 0] ) Storage (38,0)
72 # (44,0) u transfer, >0, enough
73 # * bef: ( [3] [9 8 7 0 24 0] [15 0] [7 0] [1 0 0] ) Storage (38,0)
74 # * aft: ( [0 24 0] [9 8 7] [15 0] [7 0] [1 0 0] )
76 # (51,0) u transfer, >0, not enough
77 # * bef: ( [6] [9 8 7] [15 0] [7 0] [1 0 0] ) Storage (38,0)
78 # * aft: ( [7 8 9 0] [] [15 0] [7 0] [1 0 0] )
80 # (1,1) u transfer, =0
81 # * bef: ( [7 8 0] [] [15 0] [7 0] [1 0 0] ) Storage (38,0)
82 # * aft: ( [7 8] [] [15 0] [7 0] [1 0 0] )
84 # (14,1) u transfer, <0, enough
85 # * bef: ( [4 5 6 -2] [] [15 0] [7 0] [1 0 0] ) Storage (38,0)
86 # * aft: ( [4] [6 5] [15 0] [7 0] [1 0 0] )
87 # (23,1) u transfer, <0, not enough
88 # * bef: ( [4 5 6 -4] [6 5] [15 0] [7 0] [1 0 0] ) Storage (38,0)
89 # * aft: ( [] [6 5 6 5 4 0] [15 0] [7 0] [1 0 0] )
90 # (31,1) } destroy, >0, enough
91 # * bef: ( [1 6 3 2] [6 5 6 5 4 0] [15 0] [7 0] [1 0 0] ) Storage (38,0)
92 # * aft: ( [6 5 6 5 6 3] [15 0] [7 0] [1 0 0] ) Storage (4,0)
93 $exp .= "3 6 5 6 5 6 0 ";
94 # (52,1) } destroy, >0, not enough
95 # * bef: ( [2] [15 0 2] [7 0] [1 0 0] ) Storage (4,0)
96 # * aft: ( [] [7 0] [1 0 0] ) Storage (0,2)
98 # (14,2) } destroy, =0
99 # * bef: ( [0] [7 0 4] [1 0 0] ) Storage (0,2)
100 # * aft: ( [7] [1 0 0] ) Storage (0,4)
102 # (32,2) } destroy, <0
103 # * bef: ( [-2] [1 0 0 4 0 0] ) Storage (0,4)
104 # * aft: ( [1 0] ) Storage (0,0)
109 BEGIN { $tests += 1 };
111 # Checking storage offset.
112 sel; # New storage offset.
113 $bef->store_code( <<'END_OF_CODE' );
114 0 { 01+a*1+a*8+ 11p v
121 sel; # Retrieving old storage offset.
122 $bef->store_code( <<'END_OF_CODE' );
123 0 { 22+ 0 } 01+a*1+a*8+ 61p v
130 BEGIN { $tests += 2 };
132 # Checking non-valid end-of-block.
133 sel; # Retrieving old storage offset.
134 $bef->store_code( <<'END_OF_CODE' );
141 BEGIN { $tests += 1};
144 BEGIN { plan tests => $tests };