Skip to content

Commit

Permalink
pad memory areas to survive MUL w overreaching offset
Browse files Browse the repository at this point in the history
Consider a program like '[-<<<+>>>]'. Since cells are initialized to
0, the loop will not be entered and the program will exit
successfully. However, with awib's mutliplication loop optimization,
this program will be compiled into LMUL(3, 1). A naive backend would
compile this into an unconditional write to index -3, resulting in
undefined behaviour even though the program is correct.

To handle this, all backends now have padded memory areas. The max
offset for LMUL and RMUL is 127, so twice that many cells have been
added and the pointer is now initialized to p=127.
  • Loading branch information
matslina committed Oct 21, 2015
1 parent 84bbbcc commit edae31c
Show file tree
Hide file tree
Showing 11 changed files with 198 additions and 82 deletions.
38 changes: 19 additions & 19 deletions 386_linux/backend.b
Expand Up @@ -236,25 +236,25 @@
% 0 0 (bcode) 0 0 *0 0 0 1 ::: 1 0 0 0 (jmplist)
# Machine code for memory allocation etc (hex!):
# b8 c0 00 00 00 31 db b9 ff ff 00 00 ba 03 00 00
# 00 be 22 00 00 00 31 ff 31 ed cd 80 89 c2 97 fc
# f3 aa 89 d1 89 c3 43 89 da 89 df 47 47 89 fe 46
# 45 45
++++++++++[->++++++++++++++++++++++>+
++++++++++++++++++++++++<<<+++++<++++
++++++++++++++>>]>>+++++<<<<++++.++++
++++.>>...<-.>>-.<<<-------.>>>>..<<.
.<<+.>>+++.---...<<++++.>------------
---.>...<+++++++++++++++.>>>.<<<.>>++
++++++++++++++++.<<<+++++++++++++++.>
>>>-[--<<+>>]<<+.+++++++++.<<--------
---.>+[->>>+++<<<]>>>+.<+++++++++++++
++.---------.>+++++++++++++++++++.<<.
<<+++++++++++++++.>>.<<--------------
.>>+[--<+>]<--.++[->++<]>-.<++++[-<++
+++>]<+++.>>.<<+++++.>>+++[--<+>]<+..
-[->++<]>---.>+++++++++++.<+++[--<+>]
<.-..<[-]>[-]>>[-]>[-]+<+<+<+<<<[<<]>>
# b8 c0 00 00 00 31 db b9 ff 00 01 00 ba 03 00 00
# 00 be 22 00 00 00 31 ff 31 ed cd 80 83 c0 7f 89
# c2 97 fc f3 aa 89 d1 89 c3 43 89 da 89 df 47 47
# 89 fe 46 31 c0 45 45
<+++++++[-<++++++++>]<[->+>+++>++>++++<<<<]
>>++++++++++++++++.++++++++.<<...>-------.>
>>-----.<<-------.>>+++++++++++++++++++++++
+++++++++++++.<<<<.+.-.>>+.<<+++.---...>>++
++.<---------------.<...>+++++++++++++++.>>
>.<<<.>>>------------------.<<+++++++++++++
++.>++++++++++++++++.+++.<-------------.>--
--.++++++++++.<++.>++++++++++++++.>++++++++
+++++++.---------.<+++++++++++++++++++.----
-----------------------------.<++++++++++++
+++.>.<--------------.<++++++++++++++++++.>
>.<+++++++++++++++++++++++.>.<+++++.<++++..
>>.>+++++++++++.<<<-.---------------------.
>-------------------------------.<+++++++++
+++++++++++..>>>[[-]+<]<<[<<]>>
% 0 0 *(bcode) 0 1 ::: 1 0 0 0 (jmplist)
Expand Down
3 changes: 2 additions & 1 deletion 386_linux/h.asm
Expand Up @@ -63,12 +63,13 @@ code_start:
;;; Allocate memory area by calling mmap2
mov eax,0xc0 ; sys_mmap
xor ebx,ebx ; *start=0
mov ecx,0xffff ; length=0xffff
mov ecx,0x100ff ; length=0x100ff
mov edx,3 ; prot=PROT_READ|PROT_WRITE
mov esi,0x22 ; flags=MAP_ANONYMOUS|MAP_PRIVATE
xor edi,edi ; fd=0
xor ebp,ebp ; offset=0
int 0x80
add eax, byte 127 ; 127 bytes of padding

;;; Initialize cells to zero (0)
mov edx,eax ; save address in edx
Expand Down
4 changes: 2 additions & 2 deletions lang_c/DEVEL
Expand Up @@ -23,9 +23,9 @@ the awib bytecode operation. The header is as follows:
#define eC(x) *p-=x;
#define eB(x) c=getchar();if(c>=0)*p=c;
#define eA(x) *p+=x;
char buf[0xffff];
char buf[0x10100];
int main(){
char *p=buf;
char *p=buf+127;
int c;

After this, for each bytecode operation P(i), "eP(i)" is output. When all the
Expand Down
7 changes: 4 additions & 3 deletions lang_c/backend.b
Expand Up @@ -93,10 +93,11 @@
# output remainder of header
% 10 60 35 100 110 120 *0 0 0 (code) 0 M m
<<<-.+++++.-------.>++++.<<---.>+.>+++.<++++.-----------.<<------------.>>>>.<
<+++++++++++....---------.<<+++++++++++.<.>>>++++++++++++.+++++.>-.<<.>-.-----
<<<+.-.+.-..>>++.<<+++++++++++.<.>>>++++++++++++.+++++.>-.<<.>-.-----
-------.++++++++.+++++.<++++++++.+.>>>+++.<<<<<.>>>-----------.+++++.-------.>
--.<<---------.++++++++++.>>--.<<<++.>>+.>+++++.<++++.<<--.<.>>>+++.+++++.>-.<
<----------.>-----------.<<.<.
--.<<---------.++++++++++.>>--.<<<++.>>+.>+++++.<++++.<+.++++++.+.+++++.<--.<.
>>>+++.+++++.>-.<
<-----------------------.>-----------.<<.<.
[-]>[-]>[-]>[-]>[-]>[-]>>>>
% 9(0) *(code) 0 M m
Expand Down
10 changes: 5 additions & 5 deletions lang_generic/DEVEL
Expand Up @@ -186,8 +186,8 @@ python with this backend, since awib has > 25 levels of nested loops.
| header | package main |
| | import "os" |
| | func run(in *os.File, out *os.File){ |
| | var m[0xffff]byte |
| | var p int |
| | var m[0x10100]byte |
| | p:=127 |
| | m[p]=0 |
+--------------+------------------------------------------------------------+
| footer | } |
Expand Down Expand Up @@ -244,7 +244,7 @@ python with this backend, since awib has > 25 levels of nested loops.
+--------------+------------------------------------------------------------+
| header | #!/usr/bin/ruby |
| | def run(in_, out) |
| | m=[0]*0xffff;p=0; |
| | m=[0]*0x10100;p=127; |
+--------------+------------------------------------------------------------+
| footer | end |
| | run(STDIN, STDOUT) |
Expand Down Expand Up @@ -301,9 +301,9 @@ python with this backend, since awib has > 25 levels of nested loops.
| | fconfigure stdout -encoding binary |
| | fconfigure stdin -encoding binary |
| | proc run {in out} { |
| | set p 0 |
| | set p 127 |
| | set mem {0} |
| | for {set i 0} {$i<0xffff} {incr i} {lappend mem 0} |
| | for {set i 0} {$i<0x10100} {incr i} {lappend mem 0} |
+--------------+------------------------------------------------------------+
| footer | return 0 |
| | } |
Expand Down
2 changes: 1 addition & 1 deletion lang_generic/go.b
Expand Up @@ -22,7 +22,7 @@
<[-
# header
++++++[->+++++++++++++++++++<]>--.---------------.++.++++++++.----------.++++++.--.--[---<+>]<-.++++[->+++<]>+.------------.++++++++.+++++.[-----------<+>]<.+++[->++++++++<]>+.++++.+++.-.+++.++.[----<+>]<+++.++.+++[->+++<]>.++++.-[---<+>]<----.-[--->+<]>-.[-<++++++++++>]<++.+++++++++++++++.-------.-----------.[--->+<]>-.---[-<++++>]<--.+++.-------.+[--->+<]>+++.-----[-<+++>]<.+++++.--[--->+<]>----.++++++++++.-----[-<+++>]<.++++.[----->++<]>.[--<+++>]<+.[-->+++<]>.+++.-------.-[--<+>]<------.------------.+++++[->+++<]>.++++++.-.[----<+>]<+++.++++++++++.-----[->+++<]>.++++.[-----<++>]<.[-->+++<]>+.[--<+++>]<.+++.-------.-[----->++<]>+.[-<+++>]<.--[----------->+<]>-.[-<+++>]<++..--[->++++<]>--.++[-----<++++>]<+.+++++++++++++++++.[--->+<]>------.++++[-<+++>]<+.------------------.+[-->+<]>++.[--<+++++>]<.------------------....---------.+++++.--[---->+++++<]>+.-----.---------------.-[----------<+>]<.[->+++<]>++..--[-<++++>]<--.++[----->++++<]>+.+++++++++++++++++.[---<+>]<------.----[->++++<]>.[----<+>]<++++.+++[->+++<]>.+++++.++++++.+[---------<+>]<---.[->+++<]>++..++++[-<+++>]<+.------------------.+[---->+++++<]>---.+++[-----<++++>]<+.[--->++<]>-.-------------.[----<+>]<--.[-]
+++++++++++++++[-<++++<+++++<+++<++++++<+++++++<++<+>>>>>>>]<<<<<+++++++.>+++++++.++.<-----.>--.<----.--.<++.>++++++++.>.<----.+++++.<<-----.>>-----.++++.+++.-.+++.++.<.++.>-----.++++.<.<.>>>+++++.<++.-------.>---.<<--.>++++.+++.-------.>>-----.<++++++.<.<.>>>++.<<+.++++.>>++++.>-----.<<.+++.-------.>--.<<<.>----.++++++.-.<.>>>--.<<-----.++++.>>++++.>.<<++++.+++.-------.>-----.<<++++++++.<<.>..>-----.>----.<----.<.>-----.>------.>+++++++.<<+++++++++++.>>+.-.+.-..<++.+++++.<+.-----.>+++.<<<.>..>----.>>>>--.+++.<<+.+.+++++.<<<<.>..>---.>----------.<+++.>++.>>>.<<-------.<<<<.[[-]>]
]>]
<[-
Expand Down
10 changes: 9 additions & 1 deletion lang_generic/ruby.b
Expand Up @@ -23,7 +23,15 @@
<[-
# header
+++++[->+++++++<]>.--.-[--<+++>]<-.-[-->+++++<]>++.--.-.+[-----<++>]<+.++[->++<]>.+++++++.+++++.[-----<++>]<+++.-[-->+++++<]>-.+++.-------------------.--[----<+++++>]<+.[----------->+<]>-.[-<++++++++++>]<.+.+.[--->+<]>--.---[-<++++>]<--.+++.-------.+[--->+<]>+++.-----[-<+++>]<.+++++.---------------.-[-->+<]>---.------------.+++++[-<+++>]<.++++++.-.+[--->+<]>++.-[----<+>]<.[->+++<]>++....++++[-<+++>]<+.+[-->+<]>++++++.-[--<+++>]<+.+[-->+<]>++.-[-<++>]<-.-[-->+<]>----.++++++.[--<+++++>]<.------------------....--[----->+++<]>-.---[-<++>]<.[-->+<]>+++++.-------------.+++++++++++.+[------<+>]<.[-]
>+++++++++++++++[-<++<+<++++++++<+++<+++
+++<+++++++<++++<+++++>>>>>>>>]<+++++.--
.<<<++.>---.--.-.<.<++++++++.<.+++++.>>.
>.+++.<<.>>++++.>-----.<<<++.+.+.>>>>-.<
<-------.+++.<<<.>>-------.<+++.<.>-----
-----.>++++.>>>.<<<<<+.>>>.-.<---.>>.<<<
<--.<+.>>----.>+++++++.<++.>------.+++++
+.>++++.<+.-.+.-..<<<--.>+++.<++.>>>+.+.
+++++.++++.>>.<<<<<<[[-]>]<
]>]
<[-
Expand Down
24 changes: 23 additions & 1 deletion lang_generic/tcl.b
Expand Up @@ -23,7 +23,29 @@
<[-
# header
+++++[->+++++++<]>.--.-[--<+++>]<-.-[-->+++++<]>++.--.-.+[-----<++>]<+.++[->++<]>.+++++++.+++++.[-----<++>]<+++.-[-->+++++<]>+.-----------------.+++++++++.+++++++.-----------.[--------<+>]<---.[->++++++++++<]>++.---.++++++++++++.-.--------.+++.--.++++++++++++++.---.-------------.--[---<+>]<-.---[->++++<]>-.+.----------------.+++++++++++.++++++.-.[----<+>]<+++.--[-->+++<]>.+++++[-<++>]<+.+++++++++.-----------.++++++++++++.-----------.+++++.+++++.-------.-[--->+<]>--.[-<+++>]<++.+++++++.+++++.-------------.+++++++++++++++++.+++++++.[----------->+<]>-.[-<++++++++++>]<++.---.++++++++++++.-.--------.+++.--.++++++++++++++.---.-------------.--[--->+<]>-.---[-<++++>]<-.+.----------------.+++++.+++++.--[--->+<]>----.--[--<+++>]<.+++++[->++<]>+.+++++++++.-----------.++++++++++++.-----------.+++++.+++++.-------.-[---<+>]<--.[->+++<]>++.+++++++.+++++.-------------.+++++++++++++++++.+++++++.[-----------<+>]<-..++++[->++++++++<]>.++.---.------------.[---<+>]<-.---[->++++<]>--.+++.-------.--[---<+>]<----.-[->++++<]>-.------------------.+++++.--[---<+>]<----.+++++[->+++<]>.++++++.-.+++++++++.-[----<+>]<+.-[->++++<]>-.--[-----------<+>]<-.[->+++<]>++....---[-<++++>]<-.--------------.+++++++++++++++.[---->+<]>+++.----[-<++++>]<.[---->+<]>++++.[--<+++>]<.[---->+<]>--.[-<+++>]<++....---[->++++<]>-.--------------.+++++++++++++++.[----<+>]<+++.++++[->+++<]>+.--------.++++++++.-[---<+>]<----.-[->++++<]>-.---[-----<++>]<.++[-->+++++<]>.+[---------<+>]<----.[->+++<]>++....++[-<+++>]<.+++++++++.+++.[--->+<]>------.-[-<++++>]<-.--------.--------------.+++++++++++++++.[---->+<]>+++.+++[-<+++>]<.[--->+<]>---.[--<+++>]<.++[-->+++++<]>.-[----<+>]<+.-[->++++<]>-.[---<+>]<-----.-[->+++<]>.[-------<++++>]<.------------.[-->+++++<]>.------------------....--[----<+++++>]<.-[---->+<]>+.-[-<++++>]<-.------------------.+++++.-----------.+++++++++++++++.[--->+<]>------.+++[-<+++>]<.[----->++++++<]>-.-[----<+>]<+.-[->++++<]>-.---------------.-----------.+++++++++++++++..-----------.+++++++++.----------.-[---<+>]<-.++++[->+++<]>+.--------.++++++++.-[---<+>]<----.[-->+++<]>.++[--<+++++>]<.+[--------->+<]>----.[-]<
>+++++++++++++++[-<+++++<+<+++++++<++<++
++++<++++++++<+++<++++>>>>>>>>]<<<<+++++
.--.<<<++.>---.--.-.<.>>++++++++.>>.++++
+.<<<<.>++.>+.>>--.<<<-.>+++++.>>>-----.
<<<--.---.>>+++.-.<<+++.+++.--.<++.---.>
--.>-.<<+.+.>-.>>+.<<<+.-.>>.<<<--.>>+.>
>-.<<--.>>+.<<+.+++++.>>-.<<--.>.<-----.
>>-----.+++++.<<-.<--.+++++++.>>>>.<<<++
+++.---.>>+.-.<<+++.+++.--.<----.---.>--
.>.<<+.+.>-.+++++.>>.<.<<<.>>----.>>.<<-
-.>>+.<<+.+++++.>>-.<<--.>.<-----.>>----
-.+++++.<<-.<--.+++++++.>>>>.<++.++.---.
<<++.>.>+++.+++.-------.<.<<++.>++++++.>
>.<.>+.++++++.-.<<<++.>>.<<--.>>>>.<<...
.>-.<<----.>>+.<.>----.<.<<<++++.+.+++++
.>>>>>.<<....>+++.<<.>>+.<.>-------.<<.>
>.<.<<.<-------.>++.>>>>.<<....<+.>>++.+
++.<.<<--.>>>+.<<-.>>+.<.<++++.>.<<<.>++
.>>.<<--.>>++++.<.<<<.>.>---.<+.-.+.-..>
+++++.>>----.<<--.>.+++++.-----------.>>
--.<.<++++++.<++.>>.<<--.>+++.----------
-.>>--..<<++++.>>--.<<-.>.>-.<<+.>>.<.<<
<.>++.>>>>.<<<<<<[[-]>]<
]>]
<[-
Expand Down
55 changes: 52 additions & 3 deletions lang_java/DEVEL
Expand Up @@ -29,9 +29,7 @@ Awib will compile that into something like this:
method_2() { <B> }
method_3() { <C> }

## Annoying details

Here's the language definition:
## IR translation

+--------------+------------------------------------------------------------+
| Bytecode | Output |
Expand Down Expand Up @@ -83,3 +81,54 @@ integer. Instead each cell is printed separately with an underscore
When processing CLOSE, awib will output the corresponding code with $d
replaced by a decimal representation of the top stack element. This
element is popped from the stack and then discarded.

## Head and foot

The IR translation is wrapped in a header and footer that sets up
memory area, pointer, IO and a couple of helper methods. Due to Java,
the header is pretty humongous.

### Header
import java.io.InputStream;
import java.io.OutputStream;
import java.io.IOException;

public class Bf {
byte[] m;
int p;
InputStream i;
OutputStream o;

public Bf(InputStream i, OutputStream o) {
m=new byte[0x10100];
p=127;
this.i=i;
this.o=o;
}

public void run () {
this._0();
}

public static void main(String[] args) {
new Bf(System.in,System.out).run();
}

private void r() {
try {
i.read(m,p,1);
} catch (IOException e) {}
}

private void w() {
try {
o.write(m[p]);
o.flush();
} catch (IOException e) {}
}

private void _0() {

### Footer
}
}
88 changes: 42 additions & 46 deletions lang_java/backend.b
Expand Up @@ -4,47 +4,47 @@
% 23(0) *8 (code) 0 M m
# print Java header
++[-<+<++++++<+++<+++++++++++++<++++++++++++<+++++++++<++++++++++<++++++
+++++<++++<+++++++<++++++++<++<+++++>>>>>>>>>>>>>]<<<<<<<+++++.<-.+++.-.
+++.++.>>>>>++.<<<<+.>+++++++.>--.<.<<<++++++.>>-.++++++.<<.<+++.>>>-.++
.<+.-.<<<+++.>>>.--.>>++++.----.<---.>>>>>-.>.<<<<<<----.++++.+++.-.<.++
.>>>>>.<<<<-----.>.>.<.<<<.>>-.++++++.<<.<<----.>>>+.-.>+.<+.-.<<<++++.>
>>.--.>>++++.----.<---.>>>>>.>.<<<<<<----.++++.+++.-.<.++.>>>>>.<<<<----
-.>.>.<.<<<.>>-.++++++.<<.<.<----.>----.>>++++.>>++.++.<+.>>--.<++++.<-.
-.>>>>>.>..<<<<----.+++++.<-------.<--.---.>+.>>>.<<<.<+++.>--.>--..>>.>
+++++++.<<<<+++++.>>>.<-------.>>>.<<....<<<----.<<+.>>>+.<+++.---------
-.++.>>>.<<<<+.>>>>>-------.>.<<....<<<<----.+++++.>>.>>.<<----.>>>.>.<<
....<<<<<<<++++.>>>.>>.+++++.-.<<<<<<++++.>>>>>>.--.<++++++++.----.<-.>>
>>.<<<<----.>>>>>.>.<<....<<<<<<<<----.>>>----.-.----.+++++.-.<<<++++.>>
>.--.>----.>.>-----.>>.<<++.>>>.>..<<....<<+.+++++.<+.<+++++++.---.>+.>>
>.>+++++++.<<<<+++.<<<------.<.>>----.++.>>>.-.<<<<<<.>>>>>>.--.<-.----.
<++++.>>>>.<<<<----.<<++++.>>>>>>.<<<<<<<<----.>>>+++++.-.----.+++++.-.<
<<++++.>>>.--.>----.>.>-----.>>.<<++.<<<<---.>>>>>>.<.>>>.<<........<<--
.>>>-----.<<<+.<<.<+++++.>>>>>.<<<+.>>--.-----.<<<.>-------.>>>>-------.
-..--.++.<<<<++.>>>>++++++.>.<<........<<++.>>>++.-------------.++++++++
+++.>.-.<<<.<<<+++.+.>>>-.<<<<<+++++.>>.>>>>>++.<<<<<.>>>>>--.>+.-.<<<+.
<<<-.+.>>>-.<<<<<.>>>>-.>>>++.<<<.>>>--.>+.<<....<++++++++++.>>>..<<....
<<+.+++++.<+++++.<+++.---.>+.>>>.<<+.-------.<<.>+.>>>.<<+++.+++.-------
.>>.++++++++.+.---------.<--.>>>.<<........<-------.<<<-.+.>>>-.<<<<<.>>
>-----.<<<++.--------.+.>>>>>>>.>.<<....<++++++++++.>>>..<<....<<++.++++
+.<+++.<+++.---.>+.>>>.<<--.+.<--.>.<<.>++.>>>.<<++.-------.<<.>+.>>>.<<
--.<---.<.>>+.<<<<-.<<.>>>---.--.>.>>.<<--.>------.++.>>>.<<<++++.<<.>.<
+.<+.>>>>>>.<--.>>>.-.<<<<.<<--.<++++.>>>>>.>+++++++.<<<<<+.<<-.<<.>>>++
.------.+.>-.>>-.<<<<++++++.>>++++.>>+.<<<<--.<<.>>>+++++.------.+.>----
.>>-.<<<<++.>>>>++.<<<+.-.<-----.+++++.>--.+++.>>>-.>>++++++++.+.>------
-.>+.<<---------....<++.>>>..<<....<<++.++.<<++++.<+.>>.>++.<++++.>>>.<<
++.-------.<<.>-.>>>.<<+++.>>++++++++.+.---------.<--.>>>.-.<<<<++.--.>-
-.>.<++.>>>+.-.<<....<<<<.<<.>>>>.<+.----.+++.<<<------.>>++++.<<++++.>>
+++.<<.+++++.--------.>>>>>>>.>+.-.<<<++.>.<<<-.--.>++.<++.+++++.>>>.<<<
<<<-.<.<----.>----.>>++.>>-----.++.<.>>.<++++.<-.-.>>>>.<<<----.<<<+.>>>
>>>.<--.++.>>>+.<<....<.>>>..<<....<<----.++.<++++.<<--.>>--------.>++.<
++++.>>>.<<++.<<+.>++++.-----.>>>.<<+.<<<<-.+.>>>>>>.<--.>>>.-.<<<<---.-
-.>--.>.<++.>>>+.-.<<....<<<<.<<+++++.>+.>>>.<+++++.>++.<----.<<<------.
>>--.>----------.<+++.>++.<<<+.>>>>>>>.>+.-.<<<++.>.<<<++++++.--.>.<++.+
++++.>>>.<<<<<<-.<++++.<.>----.>>+.>>-----.++.<.>>.<++++.<-.-.>>>>.<<<--
--.<<<+.>>>>>>.<--.++.>>>+.<<....<.>>>..<<....<<----.++.<++++.<<--.>>---
-----.>++.<++++.>>>.<<++.<<+.>++++.-----.>>>.<<<-----.<<<<<<<--.>>>>-.+.
>>>>>>.<--.>>>.[<]>[[-]>]
++[-<++++++++<++++++++<++++++++++<++++++++++<+++<++++++++++<++++++++++<+
+++++++++<+++<++++++<++<+++++++++++>>>>>>>>>>>>]<<<+++++.++++.+++.-.+++.
++.<<++.>++++++.<<---.>>>++.<<<.>++++++++++++++.>-.++++++.<.>>>-------.<
<-.++.>-.-.>>+++.<<.--.<<<<+.>.>>---.<<<<<<-.<----------.<-----.++++.+++
.-.+++.++.>>>++.>>+++++.>.>>>++++.<<<.>.<<-.>>>++.<.>>>>----.<<-.-.<+.>+
.-.>>++++.<<.--.<<<<<+.>>.>>---.<<<<<<.<.>>>>.>>>.>--.-.+++.++.<<<<<<.>>
+.>.>>>++.<<<.>.<<-.>>>++.<.>>>.>----.<----.<++.<<<++.++.>>+.++++.<<<.++
++++.-.<<<.<..<----.+++++.>>>>---.>--.---.<+.<.>.>+++.<--.>>>>-..<<<<<.<
+++++++.>>>>+.<<<.>>>>>>+++.<<<<<<<<.>>....>+.>>>>>--.<+.<<-.<<-------.+
+.<.>>+.<<<-------.<.>>....>>----.+++++.>>>.<<<<<.>>++.<<<.<.>>....>>>>>
>>++++.<<<<<--.++.>>>+.-.>>>++++.<<<.--.<<.----.<---.<<.>>----.<<<.<.>>.
...>>>>>>>>----.<<----.-.<--.>+.-.>>++++.<<.--.<<<++++.----.>>---.<<<<<.
>>>>>++.<<<<<<.<..>>....>>>>>+.>+++.<<<+.<+++.---.>+.<<<.<+++++++.>>>---
.>>------.>>>.<<--.++.>.-.>>.<<.--.<<<++.----.>>---.<<<<<.>>+++.>>++++.<
<<<.>>>>>>>>----.<<+++.-.----.+++++.-.>>++++.<<.--.<<<++++.----.>>.<<<<<
.>>>>>++.<---.<<<<.<<<++++++.>.>>........>>++++.<<<-----.>>>+.>++++.>>>+
++++.<<<<<<.>>>---.>>>++.-----.<<<+++.<<--.>>>+++++++.>>++++.<<+.-.+.-..
<<<++.<<--.<.>>........>>++.<<<++.>>>>>+.+.+++++.++++.<<<<<<.>>........>
>++++.>+++.+.<-.>>-------------.<.<<<<.>>>>.<<<<--.<.>>........>>+.>-.+.
<-.>>.>.<<<<<<++.>>>>>>.<<<<<<--.<.>>....<<<++.>..>>....>>---.+++++.<+++
++.>>+++.---.<<+.<.>>+.>>>.<<.<<+.<.>>----.+++.>>>-.<<<<<.++++++++.+.---
------.<<<--.>.>>........>>-.>-.+.<-.>>.<<<-----.>>>++.--------.+.<<<<<.
<.>>....<<<++.>..>>....>>---.+++++.<+++.>>+++.---.<<+.<.>>--.+.<--.>.>.<
<++.<.>>++.>>>+.<<.<<+.<.>>>>>--.<<<<---.>>.>>+.<-.>>>>.<<----.--.<<<.>>
.<<--.<<------.++.<.>++++.>>>>>.<<<.>>>+.<<+.<<<<.<<<--.>.>>........>>>>
>.<<--.<+.<<.<+++++++.>>>>+.>-.>>>>.<<++++++.------.+.<<<-.>>-.<++++++.>
----.+++++.<--.>>>>.<<+++++.------.+.<<<.>>-.<++.>++.>+.-.<<-----.+++++.
>>--.+++.<-.<------.+.<<<<<-------.<.>>....<<<++.>..>>....>>>>>++.++.<<+
+++.<-.<.>--.>----.<<<.>>++.>>>---.------.<<-.<<<.>>----.>>-.+.<<<<.<<<-
-.>.>>........>>++.--.+++++++.<<.<<<.>.>>............>>>>>.<+++++.>>---.
<<<+.<<.>>-.>------.>++++.<++++.>>--.<<.+++++.--------.<<<<<.<.>>.......
.<<<++.>>>.>++.--.>-----.>-.+++++.<<<.>>>>-.>>>.>----.<----.<++++++++.<<
<<<++.++.>----.++++.>+.>>++.-.<<<<<.>.>>>+.<<<<.<<<--.++.>.>>....<<<.>..
>>....>>----.++.>.>>>--.<<<<<----.>++.>----.<<<.>>++.>>>+.------.<<-.<<<
.>>+.>>-.+.<<<<.<<<--.>.>>........>>---.--.>>>>+++.<<<<<<.<<<.>.>>......
......>>---.>>+++++.>>--.-----.<.>++.<<<+.>------.<<--.<------.>+++.<++.
>>>+.<<<<<.<.>>............>>-.>>+++++.<+.<---.>>>>+.--.<-.<------.+.<<<
<<.<.>>........<<<++.>>>.>>>---.--.>>>+.<<<++.>>.<<<<<.>>>>-.>>>++++.>.<
----.<++++.<<<.++.<++++.++++.>>>+.++++++.-.<<<<<.>>>.>+.<<<<.<<<--.++.>.
>>....<<<.>..>>....>>----.++.>++++.>>>--.<<<<<++++.>++.>----.<<<.>>++.>>
>+.------.<<-.<<<.>--.>>>+++++++.--------.+.<<<<.<<<--.>.[<]>[[-]>]
% 23(0) *0 (code) 0 M m
++++++++++++++++[-<++++++++++++++++>]<-[-<<<<<<<<<<<<<<<+<+>>>>>>>>>>>>>>>>]
Expand Down Expand Up @@ -306,10 +306,6 @@
% ::: 0 0 0 *0 M m
# footer
>[-]>[-]
++++++++++++++++++++[->+++++++>+++>+>++++>++>++++++>+++++<<<<<<<]+++++++
++.>>>>+++.>>+.------.+.>+.<-------.<++++++.>++.++++++.-.<.>>+.++++++.<+
.--.>----.<<------.+.<<<-.<<+.-.>---------------.<+.>.<.
[[-]>]
>[-]>[-]++++[->++++++++<]>....[->++++<]>---.>++++++++++.<.[-]>.[-]
% ::: 0 0 *0 0 0

0 comments on commit edae31c

Please sign in to comment.