Commits

Anonymous committed 7897f32

Initial import of pibfi version 1.0 revision 2003.0505 sources.

Comments (0)

Files changed (57)

+# erl -noshell -maxcell 65535 -wrapcell -xlatout #10#13=#nl -autopsy -statusevery 5m -run pibfi run http://www.people.fas.harvard.edu/~jafowler/pi/pi.b
+pibfi: Platonic Ideal Brainf*ck Interpreter v2003.0505
+Copyright (c)2003 Cat's Eye Technologies. All rights reserved.
+Program file name: http://www.people.fas.harvard.edu/~jafowler/pi/pi.b
+Parser options: heredoc=undefined statuscmd="#" optimize=1 dontstrip=[] 
+Tape options: wraptape=false mintape=0 maxtape=infinity wrapcell=true mincell=0 maxcell=65535 tapemodule=pibfi_tape_ets 
+I/O options: xlatin=["\n"="\n" ] xlatout=["\n\r"="\n" ] eof=0 wrapin=false minin=0 maxin=infinity wrapout=false minout=0 maxout=infinity outfile=tty infile=tty 
+Debug options: statusevery=300000 
+--------------BEGIN PROGRAM OUTPUT--------------
+0
+===== STATUS REPORT ===== Mon May 5 2003, 20:38:42 =====
+= Run began Mon May 5 2003, 20:33:42 duration 5 min 0 sec at mean kips 239
+= Currently at line 162, col 15, instruction '[', whilelevel 6
+= Exec tally:     5935215x(+)     5998202x(-)    22500864x(<)    22500870x(>)
+= Exec tally:           0x(,)           3x(.)     7400131x([)     7400125x(])
++ Tape head position: 7 cells right of start, cell contents: 105
++ Tape observed head position: min 0, max 145, range 146
++ Tape observed cell contents: min 0, max 65535, range 65536
++ Tape contents (2 - 11 cells right of start):
+      #2      #3      #4      #5      #6    ->#7      #8      #9     #10     #11
+     312      20      22       1       1     105     376      43       0       0
+===== STATUS REPORT ===== Mon May 5 2003, 20:43:42 =====
+= Run began Mon May 5 2003, 20:33:42 duration 10 min 0 sec at mean kips 209
+= Currently at line 162, col 15, instruction '[', whilelevel 6
+= Exec tally:    11857128x(+)    11920407x(-)    35868198x(<)    35868204x(>)
+= Exec tally:           0x(,)           3x(.)    14814889x([)    14814883x(])
++ Tape head position: 7 cells right of start, cell contents: 44
++ Tape observed head position: min 0, max 145, range 146
++ Tape observed cell contents: min 0, max 65535, range 65536
++ Tape contents (2 - 11 cells right of start):
+      #2      #3      #4      #5      #6    ->#7      #8      #9     #10     #11
+     209      11      11       7       1      44     380      23       0       0
+3
+===== STATUS REPORT ===== Mon May 5 2003, 20:48:42 =====
+= Run began Mon May 5 2003, 20:33:42 duration 15 min 0 sec at mean kips 216
+= Currently at line 162, col 15, instruction '[', whilelevel 6
+= Exec tally:    17798122x(+)    17926744x(-)    57121132x(<)    57121138x(>)
+= Exec tally:           0x(,)           6x(.)    22218742x([)    22218736x(])
++ Tape head position: 7 cells right of start, cell contents: 142
++ Tape observed head position: min 0, max 145, range 146
++ Tape observed cell contents: min 0, max 65535, range 65536
++ Tape contents (2 - 11 cells right of start):
+      #2      #3      #4      #5      #6    ->#7      #8      #9     #10     #11
+     161       9      47       3       1     142     378      57       0       0
+===== STATUS REPORT ===== Mon May 5 2003, 20:53:42 =====
+= Run began Mon May 5 2003, 20:33:42 duration 20 min 0 sec at mean kips 206
+= Currently at line 187, col 67, instruction '[', whilelevel 5
+= Exec tally:    23789785x(+)    23917104x(-)    69978858x(<)    69978860x(>)
+= Exec tally:           0x(,)           6x(.)    29710400x([)    29710395x(])
++ Tape head position: 2 cells right of start, cell contents: 284
++ Tape observed head position: min 0, max 145, range 146
++ Tape observed cell contents: min 0, max 65535, range 65536
++ Tape contents (0 - 6 cells right of start):
+      #0      #1    ->#2      #3      #4      #5      #6
+       0       7     284      38      12      10       0
+===== STATUS REPORT ===== Mon May 5 2003, 20:58:42 =====
+= Run began Mon May 5 2003, 20:33:42 duration 25 min 0 sec at mean kips 200
+= Currently at line 162, col 15, instruction '[', whilelevel 6
+= Exec tally:    29783983x(+)    29912320x(-)    83278124x(<)    83278130x(>)
+= Exec tally:           0x(,)           6x(.)    37211818x([)    37211812x(])
++ Tape head position: 7 cells right of start, cell contents: 285
++ Tape observed head position: min 0, max 145, range 146
++ Tape observed cell contents: min 0, max 65535, range 65536
++ Tape contents (2 - 11 cells right of start):
+      #2      #3      #4      #5      #6    ->#7      #8      #9     #10     #11
+     312       8      26       1       1     285     372      35       0       0
+1
+===== STATUS REPORT ===== Mon May 5 2003, 21:03:42 =====
+= Run began Mon May 5 2003, 20:33:42 duration 30 min 0 sec at mean kips 206
+= Currently at line 188, col 5, instruction '[', whilelevel 5
+= Exec tally:    35753100x(+)    35945090x(-)   104704284x(<)   104704285x(>)
+= Exec tally:           0x(,)           9x(.)    44650879x([)    44650874x(])
++ Tape head position: 1 cell right of start, cell contents: 394
++ Tape observed head position: min 0, max 145, range 146
++ Tape observed cell contents: min 0, max 65535, range 65536
++ Tape contents (0 - 5 cells right of start):
+      #0    ->#1      #2      #3      #4      #5
+       0     394     119      45      17       5
+===== STATUS REPORT ===== Mon May 5 2003, 21:08:42 =====
+= Run began Mon May 5 2003, 20:33:42 duration 35 min 0 sec at mean kips 202
+= Currently at line 187, col 67, instruction '[', whilelevel 5
+= Exec tally:    41735643x(+)    41928368x(-)   117617082x(<)   117617084x(>)
+= Exec tally:           0x(,)           9x(.)    52135967x([)    52135962x(])
++ Tape head position: 2 cells right of start, cell contents: 184
++ Tape observed head position: min 0, max 145, range 146
++ Tape observed cell contents: min 0, max 65535, range 65536
++ Tape contents (0 - 6 cells right of start):
+      #0      #1    ->#2      #3      #4      #5      #6
+       0     164     184       4      50       7       0
+===== STATUS REPORT ===== Mon May 5 2003, 21:13:42 =====
+= Run began Mon May 5 2003, 20:33:42 duration 40 min 0 sec at mean kips 198
+= Currently at line 188, col 5, instruction '[', whilelevel 5
+= Exec tally:    47717935x(+)    47910091x(-)   130253752x(<)   130253753x(>)
+= Exec tally:           0x(,)           9x(.)    59617264x([)    59617259x(])
++ Tape head position: 1 cell right of start, cell contents: 147
++ Tape observed head position: min 0, max 145, range 146
++ Tape observed cell contents: min 0, max 65535, range 65536
++ Tape contents (0 - 5 cells right of start):
+      #0    ->#1      #2      #3      #4      #5
+       0     147     281      50       0       9
+===== STATUS REPORT ===== Mon May 5 2003, 21:18:42 =====
+= Run began Mon May 5 2003, 20:33:42 duration 45 min 0 sec at mean kips 195
+= Currently at line 188, col 22, instruction '[', whilelevel 6
+= Exec tally:    53385479x(+)    53579121x(-)   142636196x(<)   142636202x(>)
+= Exec tally:           0x(,)           9x(.)    66710778x([)    66710772x(])
++ Tape head position: 7 cells right of start, cell contents: 36
++ Tape observed head position: min 0, max 145, range 146
++ Tape observed cell contents: min 0, max 65535, range 65536
++ Tape contents (2 - 11 cells right of start):
+      #2      #3      #4      #5      #6    ->#7      #8      #9     #10     #11
+     343      17      23       5       1      36     533      41       0       0
+===== STATUS REPORT ===== Mon May 5 2003, 21:23:42 =====
+= Run began Mon May 5 2003, 20:33:42 duration 50 min 0 sec at mean kips 196
+= Currently at line 254, col 56, instruction '[', whilelevel 2
+= Exec tally:    58965526x(+)    59108105x(-)   160883365x(<)   160883399x(>)
+= Exec tally:           0x(,)           9x(.)    73574442x([)    73574440x(])
++ Tape head position: 34 cells right of start, cell contents: 12244
++ Tape observed head position: min 0, max 145, range 146
++ Tape observed cell contents: min 0, max 65535, range 65536
++ Tape contents (29 - 38 cells right of start):
+     #29     #30     #31     #32     #33   ->#34     #35     #36     #37     #38
+       0       1      15       0       4   12244       9       0       0      10
+4
+===== STATUS REPORT ===== Mon May 5 2003, 21:28:42 =====
+= Run began Mon May 5 2003, 20:33:42 duration 55 min 0 sec at mean kips 194
+= Currently at line 188, col 22, instruction '[', whilelevel 6
+= Exec tally:    64479186x(+)    64736496x(-)   175404374x(<)   175404380x(>)
+= Exec tally:           0x(,)          12x(.)    80560848x([)    80560842x(])
++ Tape head position: 7 cells right of start, cell contents: 729
++ Tape observed head position: min 0, max 145, range 146
++ Tape observed cell contents: min 0, max 65535, range 65536
++ Tape contents (2 - 11 cells right of start):
+      #2      #3      #4      #5      #6    ->#7      #8      #9     #10     #11
+     784      20      36       0       1     729     798      57       0       0
+===== STATUS REPORT ===== Mon May 5 2003, 21:33:42 =====
+= Run began Mon May 5 2003, 20:33:42 duration 1 hr 0 min 0 sec at mean kips 192
+= Currently at line 187, col 67, instruction '[', whilelevel 5
+= Exec tally:    70045030x(+)    70304600x(-)   187755052x(<)   187755054x(>)
+= Exec tally:           0x(,)          12x(.)    87531501x([)    87531496x(])
++ Tape head position: 2 cells right of start, cell contents: 152
++ Tape observed head position: min 0, max 145, range 146
++ Tape observed cell contents: min 0, max 65535, range 65536
++ Tape contents (0 - 6 cells right of start):
+      #0      #1    ->#2      #3      #4      #5      #6
+       0      73     152      35       5       6       0
+1
+===== STATUS REPORT ===== Mon May 5 2003, 21:38:42 =====
+= Run began Mon May 5 2003, 20:33:42 duration 1 hr 5 min 0 sec at mean kips 194
+= Currently at line 162, col 15, instruction '[', whilelevel 6
+= Exec tally:    75614209x(+)    75938125x(-)   208594883x(<)   208594889x(>)
+= Exec tally:           0x(,)          15x(.)    94472347x([)    94472341x(])
++ Tape head position: 7 cells right of start, cell contents: 393
++ Tape observed head position: min 0, max 145, range 146
++ Tape observed cell contents: min 0, max 65535, range 65536
++ Tape contents (2 - 11 cells right of start):
+      #2      #3      #4      #5      #6    ->#7      #8      #9     #10     #11
+     574      37      27       0       1     393     600      65       0       0
+===== STATUS REPORT ===== Mon May 5 2003, 21:43:42 =====
+= Run began Mon May 5 2003, 20:33:42 duration 1 hr 10 min 0 sec at mean kips 192
+= Currently at line 188, col 22, instruction '[', whilelevel 6
+= Exec tally:    81182483x(+)    81507283x(-)   220985489x(<)   220985495x(>)
+= Exec tally:           0x(,)          15x(.)   101443761x([)   101443755x(])
++ Tape head position: 7 cells right of start, cell contents: 262
++ Tape observed head position: min 0, max 145, range 146
++ Tape observed cell contents: min 0, max 65535, range 65536
++ Tape contents (2 - 11 cells right of start):
+      #2      #3      #4      #5      #6    ->#7      #8      #9     #10     #11
+     292      40       8       4       1     262     490      49       0       0
+===== STATUS REPORT ===== Mon May 5 2003, 21:48:42 =====
+= Run began Mon May 5 2003, 20:33:42 duration 1 hr 15 min 0 sec at mean kips 191
+= Currently at line 187, col 67, instruction '[', whilelevel 5
+= Exec tally:    86759563x(+)    87084772x(-)   233715939x(<)   233715941x(>)
+= Exec tally:           0x(,)          15x(.)   108426863x([)   108426858x(])
++ Tape head position: 2 cells right of start, cell contents: 45
++ Tape observed head position: min 0, max 145, range 146
++ Tape observed cell contents: min 0, max 65535, range 65536
++ Tape contents (0 - 6 cells right of start):
+      #0      #1    ->#2      #3      #4      #5      #6
+       0     313      45      21       3       0       0
+===== STATUS REPORT ===== Mon May 5 2003, 21:53:42 =====
+= Run began Mon May 5 2003, 20:33:42 duration 1 hr 20 min 0 sec at mean kips 191
+= Currently at line 161, col 60, instruction '[', whilelevel 5
+= Exec tally:    92300725x(+)    92691104x(-)   250848885x(<)   250848887x(>)
+= Exec tally:           0x(,)          15x(.)   115383433x([)   115383428x(])
++ Tape head position: 2 cells right of start, cell contents: 107
++ Tape observed head position: min 0, max 145, range 146
++ Tape observed cell contents: min 0, max 65535, range 65536
++ Tape contents (0 - 6 cells right of start):
+      #0      #1    ->#2      #3      #4      #5      #6
+       0     242     107      39       1       1       0
+===== STATUS REPORT ===== Mon May 5 2003, 21:58:42 =====
+= Run began Mon May 5 2003, 20:33:42 duration 1 hr 25 min 0 sec at mean kips 190
+= Currently at line 162, col 15, instruction '[', whilelevel 6
+= Exec tally:    97850728x(+)    98241773x(-)   263441519x(<)   263441525x(>)
+= Exec tally:           0x(,)          15x(.)   122333144x([)   122333138x(])
++ Tape head position: 7 cells right of start, cell contents: 168
++ Tape observed head position: min 0, max 145, range 146
++ Tape observed cell contents: min 0, max 65535, range 65536
++ Tape contents (2 - 11 cells right of start):
+      #2      #3      #4      #5      #6    ->#7      #8      #9     #10     #11
+     258       5      13       0       1     168     270      19       0       0
+5
+9
+===== STATUS REPORT ===== Mon May 5 2003, 22:03:42 =====
+= Run began Mon May 5 2003, 20:33:42 duration 1 hr 30 min 0 sec at mean kips 191
+= Currently at line 188, col 5, instruction '[', whilelevel 5
+= Exec tally:   103421719x(+)   103875819x(-)   283773809x(<)   283773810x(>)
+= Exec tally:           0x(,)          21x(.)   129269917x([)   129269912x(])
++ Tape head position: 1 cell right of start, cell contents: 250
++ Tape observed head position: min 0, max 145, range 146
++ Tape observed cell contents: min 0, max 65535, range 65536
++ Tape contents (0 - 5 cells right of start):
+      #0    ->#1      #2      #3      #4      #5
+       0     250     287      37      19       5
+===== STATUS REPORT ===== Mon May 5 2003, 22:08:42 =====
+= Run began Mon May 5 2003, 20:33:42 duration 1 hr 35 min 0 sec at mean kips 190
+= Currently at line 187, col 67, instruction '[', whilelevel 5
+= Exec tally:   108954813x(+)   109408269x(-)   295520049x(<)   295520051x(>)
+= Exec tally:           0x(,)          21x(.)   136188384x([)   136188379x(])
++ Tape head position: 2 cells right of start, cell contents: 75
++ Tape observed head position: min 0, max 145, range 146
++ Tape observed cell contents: min 0, max 65535, range 65536
++ Tape contents (0 - 6 cells right of start):
+      #0      #1    ->#2      #3      #4      #5      #6
+       0     739      75      46       6       2       0
+===== STATUS REPORT ===== Mon May 5 2003, 22:13:42 =====
+= Run began Mon May 5 2003, 20:33:42 duration 1 hr 40 min 0 sec at mean kips 188
+= Currently at line 187, col 67, instruction '[', whilelevel 5
+= Exec tally:   114427622x(+)   114882129x(-)   307226669x(<)   307226671x(>)
+= Exec tally:           0x(,)          21x(.)   143035985x([)   143035980x(])
++ Tape head position: 2 cells right of start, cell contents: 107
++ Tape observed head position: min 0, max 145, range 146
++ Tape observed cell contents: min 0, max 65535, range 65536
++ Tape contents (0 - 6 cells right of start):
+      #0      #1    ->#2      #3      #4      #5      #6
+       0     515     107      37       9       2       0
+===== STATUS REPORT ===== Mon May 5 2003, 22:18:42 =====
+= Run began Mon May 5 2003, 20:33:42 duration 1 hr 45 min 0 sec at mean kips 187
+= Currently at line 187, col 67, instruction '[', whilelevel 5
+= Exec tally:   119902051x(+)   120358356x(-)   319041702x(<)   319041704x(>)
+= Exec tally:           0x(,)          21x(.)   149888053x([)   149888048x(])
++ Tape head position: 2 cells right of start, cell contents: 148
++ Tape observed head position: min 0, max 145, range 146
++ Tape observed cell contents: min 0, max 65535, range 65536
++ Tape contents (0 - 6 cells right of start):
+      #0      #1    ->#2      #3      #4      #5      #6
+       0     140     148      33       5       2       0
+2
+===== STATUS REPORT ===== Mon May 5 2003, 22:23:42 =====
+= Run began Mon May 5 2003, 20:33:42 duration 1 hr 50 min 0 sec at mean kips 188
+= Currently at line 188, col 5, instruction '[', whilelevel 5
+= Exec tally:   125363050x(+)   125884129x(-)   339700934x(<)   339700935x(>)
+= Exec tally:           0x(,)          24x(.)   156694446x([)   156694441x(])
++ Tape head position: 1 cell right of start, cell contents: 201
++ Tape observed head position: min 0, max 145, range 146
++ Tape observed cell contents: min 0, max 65535, range 65536
++ Tape contents (0 - 5 cells right of start):
+      #0    ->#1      #2      #3      #4      #5
+       0     201     212      34      28       0
+===== STATUS REPORT ===== Mon May 5 2003, 22:28:42 =====
+= Run began Mon May 5 2003, 20:33:42 duration 1 hr 55 min 0 sec at mean kips 187
+= Currently at line 187, col 67, instruction '[', whilelevel 5
+= Exec tally:   130833914x(+)   131354874x(-)   351906329x(<)   351906331x(>)
+= Exec tally:           0x(,)          24x(.)   163539106x([)   163539101x(])
++ Tape head position: 2 cells right of start, cell contents: 464
++ Tape observed head position: min 0, max 145, range 146
++ Tape observed cell contents: min 0, max 65535, range 65536
++ Tape contents (0 - 6 cells right of start):
+      #0      #1    ->#2      #3      #4      #5      #6
+       0      23     464      47       1       2       0
+===== STATUS REPORT ===== Mon May 5 2003, 22:33:42 =====
+= Run began Mon May 5 2003, 20:33:42 duration 2 hr 0 min 0 sec at mean kips 186
+= Currently at line 161, col 60, instruction '[', whilelevel 5
+= Exec tally:   136287189x(+)   136809423x(-)   363865221x(<)   363865223x(>)
+= Exec tally:           0x(,)          24x(.)   170365237x([)   170365232x(])
++ Tape head position: 2 cells right of start, cell contents: 103
++ Tape observed head position: min 0, max 145, range 146
++ Tape observed cell contents: min 0, max 65535, range 65536
++ Tape contents (0 - 6 cells right of start):
+      #0      #1    ->#2      #3      #4      #5      #6
+       0      68     103      12      24       2       0
+6
+===== STATUS REPORT ===== Mon May 5 2003, 22:38:42 =====
+= Run began Mon May 5 2003, 20:33:42 duration 2 hr 5 min 0 sec at mean kips 188
+= Currently at line 188, col 22, instruction '[', whilelevel 6
+= Exec tally:   141689012x(+)   142276109x(-)   384240054x(<)   384240060x(>)
+= Exec tally:           0x(,)          27x(.)   177098770x([)   177098764x(])
++ Tape head position: 7 cells right of start, cell contents: 24
++ Tape observed head position: min 0, max 145, range 146
++ Tape observed cell contents: min 0, max 65535, range 65536
++ Tape contents (2 - 11 cells right of start):
+      #2      #3      #4      #5      #6    ->#7      #8      #9     #10     #11
+      82      35      29       6       1      24     455      65       0       0
+===== STATUS REPORT ===== Mon May 5 2003, 22:43:42 =====
+= Run began Mon May 5 2003, 20:33:42 duration 2 hr 10 min 0 sec at mean kips 186
+= Currently at line 188, col 22, instruction '[', whilelevel 6
+= Exec tally:   147099275x(+)   147685307x(-)   395703128x(<)   395703134x(>)
+= Exec tally:           0x(,)          27x(.)   183863387x([)   183863381x(])
++ Tape head position: 7 cells right of start, cell contents: 100
++ Tape observed head position: min 0, max 145, range 146
++ Tape observed cell contents: min 0, max 65535, range 65536
++ Tape contents (2 - 11 cells right of start):
+      #2      #3      #4      #5      #6    ->#7      #8      #9     #10     #11
+     244      49      11       9       1     100     793      61       0       0
+===== STATUS REPORT ===== Mon May 5 2003, 22:48:42 =====
+= Run began Mon May 5 2003, 20:33:42 duration 2 hr 15 min 0 sec at mean kips 185
+= Currently at line 162, col 15, instruction '[', whilelevel 6
+= Exec tally:   152537435x(+)   153123412x(-)   407336323x(<)   407336329x(>)
+= Exec tally:           0x(,)          27x(.)   190665199x([)   190665193x(])
++ Tape head position: 7 cells right of start, cell contents: 73
++ Tape observed head position: min 0, max 145, range 146
++ Tape observed cell contents: min 0, max 65535, range 65536
++ Tape contents (2 - 11 cells right of start):
+      #2      #3      #4      #5      #6    ->#7      #8      #9     #10     #11
+     427      32      22       6       1      73     778      55       0       0
+===== STATUS REPORT ===== Mon May 5 2003, 22:53:42 =====
+= Run began Mon May 5 2003, 20:33:42 duration 2 hr 20 min 0 sec at mean kips 184
+= Currently at line 187, col 67, instruction '[', whilelevel 5
+= Exec tally:   157954886x(+)   158541517x(-)   418975842x(<)   418975844x(>)
+= Exec tally:           0x(,)          27x(.)   197444652x([)   197444647x(])
++ Tape head position: 2 cells right of start, cell contents: 51
++ Tape observed head position: min 0, max 145, range 146
++ Tape observed cell contents: min 0, max 65535, range 65536
++ Tape contents (0 - 6 cells right of start):
+      #0      #1    ->#2      #3      #4      #5      #6
+       0      67      51      43       5      12       0
+===== STATUS REPORT ===== Mon May 5 2003, 22:58:42 =====
+= Run began Mon May 5 2003, 20:33:42 duration 2 hr 25 min 0 sec at mean kips 184
+= Currently at line 162, col 15, instruction '[', whilelevel 6
+= Exec tally:   163368553x(+)   163956054x(-)   430676607x(<)   430676613x(>)
+= Exec tally:           0x(,)          27x(.)   204216493x([)   204216487x(])
++ Tape head position: 7 cells right of start, cell contents: 14
++ Tape observed head position: min 0, max 145, range 146
++ Tape observed cell contents: min 0, max 65535, range 65536
++ Tape contents (2 - 11 cells right of start):
+      #2      #3      #4      #5      #6    ->#7      #8      #9     #10     #11
+     342       7      33       0       1      14     374      41       0       0
+5
+3
+---------------END PROGRAM OUTPUT---------------
+===== STATUS REPORT ===== Mon May 5 2003, 23:03:00 =====
+= Run began Mon May 5 2003, 20:33:42 duration 2 hr 29 min 18 sec at mean kips 185
+= Stopped at line 301, col 74, instruction '.', whilelevel 0
+= Exec tally:   168003129x(+)   168657743x(-)   449388177x(<)   449388190x(>)
+= Exec tally:           0x(,)          33x(.)   209994449x([)   209994449x(])
++ Tape head position: 13 cells right of start, cell contents: 13
++ Tape observed head position: min 0, max 145, range 146
++ Tape observed cell contents: min 0, max 65535, range 65536
++ Tape contents (8 - 17 cells right of start):
+      #8      #9     #10     #11     #12   ->#13     #14     #15     #16     #17
+      30      10       0       0      10      13       0       0       0      51
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>Module pibfi</title>
+
+</head>
+<body bgcolor="white">
+<h1>Module pibfi</h1>
+<ul><li>
+<a href="#index">Function index</a></li><li>
+<a href="#exported">Exported functions</a></li></ul>
+
+<h2>Description</h2>
+Platonic Ideal Brainf*ck Interpreter (<code>pibfi</code>).
+ 
+  <p>This application implements an interpreter for the language
+  Brainf*ck.  It does not by default impose any limit on the maximum
+  length of the tape, nor the maximum value that can entered into
+  any of the cells in the tape (beyond those limits inescapably
+  imposed upon it by the underlying operating system and hardware.)
+  It can, however, be configured to simulate the limits imposed upon
+  the language by many other implementations which sacrifice
+  scaleability in order to achieve other goals (usually, to build an
+  astonishingly small compiler or interpreter.)</p>
+ 
+  <p>As such, <code>pibfi</code> may be in a position to one day
+  develop into a universal (or at least reference) interpreter for
+  the Brainf*ck language.</p>
+ 
+  <p>For a synopsis of the command-line options that can be used
+  with <code>pibfi</code>, see the
+  <code><a href="pibfi_options.html">pibfi_options</a></code>
+  documentation.</p>
+ 
+  <p>This module contains the interface to start <code>pibfi</code>
+  both from the command line, and programmatically.  It also contains
+  common functions used by other <code>pibfi_*</code> modules.</p>
+ 
+  <p>Parts of this program were derived from the Erlang example
+  program <code>bf.erl</code>.</p>
+ 
+
+<h2><a name="index">Function Index</a></h2>
+
+<table width="100%" border="1"><tr><th colspan="2" align="left">Exported Functions</th></tr>
+<tr><td><a href="#assert-2">assert/2</a></td><td>Asserts that the condition is true.</td></tr>
+<tr><td><a href="#assert_in_bounds-4">assert_in_bounds/4</a></td><td/></tr>
+<tr><td><a href="#os_eol-0">os_eol/0</a></td><td>Returns the native end-of-line convention, if it can be determined.</td></tr>
+<tr><td><a href="#run-1">run/1</a></td><td>Starts <code>pibfi</code> for the purposes of running a Brainf*ck
+  program.</td></tr>
+<tr><td><a href="#run-6">run/6</a></td><td>Runs a Brainf*ck program.</td></tr>
+<tr><td><a href="#startup-2">startup/2</a></td><td/></tr>
+<tr><td><a href="#whisper-1">whisper/1</a></td><td><a href="#whisper-2">See <code>whisper/2</code>.</a></td></tr>
+<tr><td><a href="#whisper-2">whisper/2</a></td><td>Displays extra information.</td></tr>
+<tr><td><a href="#wrap-3">wrap/3</a></td><td>Implements a generic modulus function.</td></tr>
+</table>
+
+<h2><a name="exported">Exported Functions</a></h2>
+
+<h3><a name="assert-2">assert/2</a></h3>
+
+<p><code>assert(Condition::<a href="#type-boolean">boolean()</a>, ErrorReason::term()) -> true</code></p>
+<p>Asserts that the condition is true.  If it is not, the
+  process crashes with the given reason.</p>
+
+<h3><a name="assert_in_bounds-4">assert_in_bounds/4</a></h3>
+
+<p><code>assert_in_bounds(Arg1, Arg2, Arg3, Arg4) -> term()</code></p>
+<p> </p>
+
+<h3><a name="os_eol-0">os_eol/0</a></h3>
+
+<p><code>os_eol() -> string()</code></p>
+<p>Returns the native end-of-line convention, if it can be determined.
+  If it cannot be determined, linefeed (ASCII character 10) is assumed.</p>
+
+<h3><a name="run-1">run/1</a></h3>
+
+<p><code>run(Args::[string()]) -> <a href="#type-halt">halt()</a></code></p>
+<p>Starts <code>pibfi</code> for the purposes of running a Brainf*ck
+  program.  This function is intended to be invoked
+  from the command line.  When using <code>pibfi</code> from another Erlang
+  program, or from the Erlang shell, it is suggested you call
+  <code>run/6</code> instead.</p>
+
+<h3><a name="run-6">run/6</a></h3>
+
+<p><code>run(Supervisor::pid(), ProgramSource::binary(), ParserOptions::[{atom(), term()}], TapeOptions::[{atom(), term()}], IOOptions::[{atom(), term()}], DebugOptions::[{atom(), term()}]) -> <a href="#type-tape">tape()</a><ul><li><a name="type-program">program()</a> = string() | binary() | <a href="#type-tuple">tuple()</a></li></ul></code></p>
+<p>Runs a Brainf*ck program.</p>
+
+<h3><a name="startup-2">startup/2</a></h3>
+
+<p><code>startup(Arg1, Arg2) -> term()</code></p>
+<p> </p>
+
+<h3><a name="whisper-1">whisper/1</a></h3>
+
+<p><code>whisper(string()) -> ok</code></p>
+<p>Equivalent to <a href="#whisper-2"><code>whisper(string(), [])</code></a>.</p>
+
+<h3><a name="whisper-2">whisper/2</a></h3>
+
+<p><code>whisper(string(), [term()]) -> ok</code></p>
+<p>Displays extra information.  The user can shut this off with
+  <code>-quiet</code>.</p>
+
+<h3><a name="wrap-3">wrap/3</a></h3>
+
+<p><code>wrap(Value::integer(), Max::integer(), Min::integer()) -> integer()</code></p>
+<p>Implements a generic modulus function.  Both the top and bottom
+  modulus limits may be specified.</p></body>
+</html>

doc/pibfi_filter.html

+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>Module pibfi_filter</title>
+
+</head>
+<body bgcolor="white">
+<h1>Module pibfi_filter</h1>
+<ul><li>
+<a href="#index">Function index</a></li><li>
+<a href="#exported">Exported functions</a></li></ul>
+
+<h2>Description</h2>
+Stream filtering for the Platonic Ideal Brainf*ck Interpreter.
+ 
+
+<h2><a name="index">Function Index</a></h2>
+
+<table width="100%" border="1"><tr><th colspan="2" align="left">Exported Functions</th></tr>
+<tr><td><a href="#notify-2">notify/2</a></td><td>Notifies the other end of the connection.</td></tr>
+<tr><td><a href="#send-2">send/2</a></td><td>Sends a character or characters to a filter server for filtration.</td></tr>
+<tr><td><a href="#server-5">server/5</a></td><td/></tr>
+<tr><td><a href="#start-6">start/6</a></td><td>Creates and spawns a new stream filter.</td></tr>
+</table>
+
+<h2><a name="exported">Exported Functions</a></h2>
+
+<h3><a name="notify-2">notify/2</a></h3>
+
+<p><code>notify(<a href="#type-xlat">xlat()</a>, term()) -> ok</code></p>
+<p>Notifies the other end of the connection.
+  They will receive a <code>{Filter::pid(), Notifier::pid(), message, term()}</code> message.</p>
+
+<h3><a name="send-2">send/2</a></h3>
+
+<p><code>send(<a href="#type-xlat">xlat()</a>, char() | string()) -> ok</code></p>
+<p>Sends a character or characters to a filter server for filtration.</p>
+
+<h3><a name="server-5">server/5</a></h3>
+
+<p><code>server(Arg1, Arg2, Arg3, Arg4, Arg5) -> term()</code></p>
+<p> </p>
+
+<h3><a name="start-6">start/6</a></h3>
+
+<p><code>start(Supervisor::pid(), Role::atom(), Dest::pid(), MaxThru::integer(), MinThru::integer(), WrapThru::integer()) -> pid()</code></p>
+<p>Creates and spawns a new stream filter.</p></body>
+</html>

doc/pibfi_input.html

+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>Module pibfi_input</title>
+
+</head>
+<body bgcolor="white">
+<h1>Module pibfi_input</h1>
+<ul><li>
+<a href="#index">Function index</a></li><li>
+<a href="#exported">Exported functions</a></li></ul>
+
+<h2>Description</h2>
+Input subsystem of the Platonic Ideal Brainf*ck Interpreter.
+ 
+
+<h2><a name="index">Function Index</a></h2>
+
+<table width="100%" border="1"><tr><th colspan="2" align="left">Exported Functions</th></tr>
+<tr><td><a href="#server-5">server/5</a></td><td/></tr>
+<tr><td><a href="#start-6">start/6</a></td><td>Creates and spawns a new input subsystem.</td></tr>
+</table>
+
+<h2><a name="exported">Exported Functions</a></h2>
+
+<h3><a name="server-5">server/5</a></h3>
+
+<p><code>server(Arg1, Arg2, Arg3, Arg4, Arg5) -> term()</code></p>
+<p> </p>
+
+<h3><a name="start-6">start/6</a></h3>
+
+<p><code>start(Supervisor::pid(), IoPid::pid(), Dest::pid(), Interactive::<a href="#type-boolean">boolean()</a>, Device, EOF) -> pid()</code></p>
+<p>Creates and spawns a new input subsystem.</p></body>
+</html>

doc/pibfi_interpreter.html

+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>Module pibfi_interpreter</title>
+
+</head>
+<body bgcolor="white">
+<h1>Module pibfi_interpreter</h1>
+<ul><li>
+<a href="#index">Function index</a></li><li>
+<a href="#exported">Exported functions</a></li><li>
+<a href="#internal">Documented Internal Functions</a></li></ul>
+
+<h2>Description</h2>
+Interpreter for <code>pibfi</code>.
+ 
+
+<h2><a name="index">Function Index</a></h2>
+
+<table width="100%" border="1"><tr><th colspan="2" align="left">Exported Functions</th></tr>
+<tr><td><a href="#interpret-4">interpret/4</a></td><td>Interprets a Brainf*ck program.</td></tr>
+<tr><th colspan="2" align="left">Internal Documented Functions</th></tr>
+<tr><td><a href="#execute-4">execute/4</a></td><td>Executes a single Brainf*ck instruction.</td></tr>
+</table>
+
+<h2><a name="exported">Exported Functions</a></h2>
+
+<h3><a name="interpret-4">interpret/4</a></h3>
+
+<p><code>interpret(<a href="#type-program">program()</a>, ParserOptions::[{atom(), term()}], Tape::pid(), IoPid::pid()) -> ok</code></p>
+<p>Interprets a Brainf*ck program.  If the program is given in
+  an unparsed (list or binary) form, it will be parsed into a
+  tuple form before proceeding.</p>
+
+<h2><a name="internal">Documented Internal Functions</a></h2>
+
+<h3><a name="execute-4">execute/4</a></h3>
+
+<p><code>execute(<a href="#type-instruction">instruction()</a>, Tape::pid(), IO::pid(), StatusCmd) -> ok</code></p>
+<p>Executes a single Brainf*ck instruction.</p></body>
+</html>

doc/pibfi_io.html

+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>Module pibfi_io</title>
+
+</head>
+<body bgcolor="white">
+<h1>Module pibfi_io</h1>
+<ul><li>
+<a href="#index">Function index</a></li><li>
+<a href="#exported">Exported functions</a></li><li>
+<a href="#internal">Documented Internal Functions</a></li></ul>
+
+<h2>Description</h2>
+I/O subsystem of the Platonic Ideal Brainf*ck Interpreter.
+ 
+  <p>Deals with the input and output servers, their filters, and
+  their translators.</p>
+ 
+
+<h2><a name="index">Function Index</a></h2>
+
+<table width="100%" border="1"><tr><th colspan="2" align="left">Exported Functions</th></tr>
+<tr><td><a href="#flush-1">flush/1</a></td><td>Flushes any pending output, even if it has not been translated yet.</td></tr>
+<tr><td><a href="#input-1">input/1</a></td><td>Retrieves the next character value from the input stream.</td></tr>
+<tr><td><a href="#output-2">output/2</a></td><td>Sends the given character value to the output stream.</td></tr>
+<tr><td><a href="#server-1">server/1</a></td><td>Spawned by <code>start/1</code>.</td></tr>
+<tr><td><a href="#start-3">start/3</a></td><td>Creates and spawns a new I/O subsystem.</td></tr>
+<tr><td><a href="#stop-1">stop/1</a></td><td>Tells the I/O server to stop.</td></tr>
+<tr><th colspan="2" align="left">Internal Documented Functions</th></tr>
+<tr><td><a href="#config-2">config/2</a></td><td>Sets the various options of an I/O subsystem.</td></tr>
+<tr><td><a href="#write-5">write/5</a></td><td>Writes a character to the output, within the given constraints.</td></tr>
+</table>
+
+<h2><a name="exported">Exported Functions</a></h2>
+
+<h3><a name="flush-1">flush/1</a></h3>
+
+<p><code>flush(pid()) -> ok</code></p>
+<p>Flushes any pending output, even if it has not been translated yet.</p>
+
+<h3><a name="input-1">input/1</a></h3>
+
+<p><code>input(pid()) -> integer() | nop</code></p>
+<p>Retrieves the next character value from the input stream.</p>
+
+<h3><a name="output-2">output/2</a></h3>
+
+<p><code>output(pid(), integer()) -> ok</code></p>
+<p>Sends the given character value to the output stream.</p>
+
+<h3><a name="server-1">server/1</a></h3>
+
+<p><code>server(IO) -> <a href="#type-never_returns">never_returns()</a></code></p>
+<p>Spawned by <code>start/1</code>.
+  Should not be called directly by user code.</p>
+
+<h3><a name="start-3">start/3</a></h3>
+
+<p><code>start(Supervisor::pid(), [<a href="#type-option">option()</a>], CannedInput::string()) -> pid()</code></p>
+<p>Creates and spawns a new I/O subsystem.
+  For a description of the allowed options, see the documentation for
+  the <code><a href="pibfi_options.html">pibfi_options</a></code> module.</p>
+
+<h3><a name="stop-1">stop/1</a></h3>
+
+<p><code>stop(pid()) -> ok</code></p>
+<p>Tells the I/O server to stop.</p>
+
+<h2><a name="internal">Documented Internal Functions</a></h2>
+
+<h3><a name="config-2">config/2</a></h3>
+
+<p><code>config([<a href="#type-option">option()</a>], <a href="#type-tape">tape()</a>) -> <a href="#type-tape">tape()</a></code></p>
+<p>Sets the various options of an I/O subsystem.</p>
+
+<h3><a name="write-5">write/5</a></h3>
+
+<p><code>write(<a href="#type-iodevice">iodevice()</a>, Max::integer(), Min::integer(), Wrap::<a href="#type-boolean">boolean()</a>, char()) -> ok</code></p>
+<p>Writes a character to the output, within the given constraints.</p></body>
+</html>

doc/pibfi_optimizer.html

+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>Module pibfi_optimizer</title>
+
+</head>
+<body bgcolor="white">
+<h1>Module pibfi_optimizer</h1>
+<ul><li>
+<a href="#index">Function index</a></li><li>
+<a href="#exported">Exported functions</a></li></ul>
+
+<h2>Description</h2>
+Optimizer for <code>pibfi</code>.
+ 
+  <p>Takes an internal format as generated by the parser and
+  returns a (hopefully) more efficient internal format.</p>
+ 
+
+<h2><a name="index">Function Index</a></h2>
+
+<table width="100%" border="1"><tr><th colspan="2" align="left">Exported Functions</th></tr>
+<tr><td><a href="#optimize-1">optimize/1</a></td><td>Optimizes a Brainf*ck program.</td></tr>
+</table>
+
+<h2><a name="exported">Exported Functions</a></h2>
+
+<h3><a name="optimize-1">optimize/1</a></h3>
+
+<p><code>optimize(<a href="#type-program">program()</a>) -> <a href="#type-program">program()</a></code></p>
+<p>Optimizes a Brainf*ck program.</p></body>
+</html>

doc/pibfi_options.html

+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>Module pibfi_options</title>
+
+</head>
+<body bgcolor="white">
+<h1>Module pibfi_options</h1>
+<ul><li>
+<a href="#index">Function index</a></li><li>
+<a href="#exported">Exported functions</a></li><li>
+<a href="#internal">Documented Internal Functions</a></li></ul>
+
+<h2>Description</h2>
+Options parser for <code>pibfi</code>.
+ 
+  <h3>Synopsis</h3>
+ 
+  <p>This module implements collecting options
+  from the command line.</p>
+ 
+  <p>When invoking <code>pibfi</code> from the command line, the
+  following syntax can be used:</p>
+ 
+  <ul><code>erl -noshell <i>options</i> -run pibfi run <i>filename</i></code></ul>
+ 
+  <p>The following options are recognized.</p>
+ 
+  <ul>
+  <li>Options pertaining to the parser:
+ 
+  <ul>
+  <li><code>-dontstrip <i>s</i></code>, where <i>s</i> is a string of
+  characters, default null (empty), specifies the set of characters
+  (beyond the 8 basic Brainf*ck instructions)
+  which
+  will not be stripped from the parsed source prior to optimization.
+  Note that if this option if given without an argument, it is assumed
+  to be the set of all applicable characters - in other words, nothing
+  at all will be stripped.</li>
+ 
+  <li><code>-optimize <i>n</i></code>, where <i>n</i> is an integer,
+  default 1, sets the optimization level of the parser.
+  At optimization level 0, no optimization occurs.
+  At optimization level 1, run-length encoding is performed on the
+  instructions.  Further optimization levels may be defined in the
+  future.  Note that if this option if given without an argument,
+  it is assumed to be asking for the most thorough yet quickly
+  available optimization.</li>
+ 
+  <li><code>-statuscmd <i>c</i></code>, where <i>c</i> may be
+  any single-character string of the term <code>undefined</code>,
+  default "#" (octalthorpe), specifies
+  which symbol, when encountered, is treated
+  as a debugging instruction which displays a status report.</li>
+ 
+  <li><code>-heredoc <i>c</i></code>, where <i>c</i> may be
+  a single-character string or the term <code>undefined</code>,
+  default <code>undefined</code>, specifies which symbol when encountered,
+  is treated as the marker that signifies that input is embedded in
+  the program source code following it.  This input will be stripped
+  from the source (even if it contains valid Brainf*ck instructions)
+  and will be made available to <code>-infile heredoc</code> (see
+  below.)  Note that if this option is given with no argument,
+  "!" (exclamation point) is assumed.</li>
+ 
+  </ul>
+  </li>
+  <li>Options pertaining to the Brainf*ck tape:
+ 
+  <ul>
+  <li><code>-tapemodule <i>m</i></code>, where <i>n</i> is the name of
+  an Erlang module conforming to the <code>pibfi_tape</code> behaviour,
+  defaulting to whatever <code>pibfi</code> determines would be optimal
+  for the given sourcecode, (currently always <code>pibfi_tape_ets</code>),
+  names the module which implements the backing for the simulated tape.</li>
+ 
+  <li><code>-maxcell <i>n</i></code>, where <i>n</i> is any integer or the
+  term <code>infinity</code>, default <code>infinity</code>, sets the
+  highest value that can be placed into a cell on the tape.</li>
+ 
+  <li><code>-mincell <i>n</i></code>, where <i>n</i> is any integer or the
+  term <code>infinity</code>, default 0, sets the
+  lowest value that can be placed into a cell on the tape.
+  (Note that <code>infinity</code> actually represents negative infinity
+  here.)</li>
+ 
+  <li><code>-wrapcell <i>b</i></code>, where <i>b</i> is a boolean
+  (<code>true</code> or <code>false</code>), default <code>false</code>,
+  determines what happens when either limit of any cell in the tape is
+  exceeded.  When <code>-wrapcell</code> is <code>true</code>, the limits
+  will be taken as modulus boundaries, and the value will 'wrap around'
+  to the opposite limit.  When <code>-wrapcell</code> is <code>false</code>,
+  an exception will be generated.  Note that if <i>b</i> is omitted
+  after <code>-wrapcell</code>, <code>true</code> is assumed.
+  Also note that <code>-wrapcell true</code> is not compatible with
+  either <code>-maxcell infinity</code> or <code>-mincell infinity</code>
+  (for what should be obvious reasons.)</li>
+ 
+  <li><code>-maxtape <i>n</i></code>, where <i>n</i> is any integer or the
+  term <code>infinity</code>, default <code>infinity</code>, sets the
+  rightmost position to which the tape head can move.  Note that the initial
+  position of the tape head is considered position 0.</li>
+ 
+  <li><code>-mintape <i>n</i></code>, where <i>n</i> is any integer or the
+  term <code>infinity</code>, default 0, sets the
+  leftmost position to which the tape head can move.
+  (Note that <code>infinity</code> actually represents negative infinity
+  here.)</li>
+ 
+  <li><code>-wraptape <i>b</i></code>, where <i>b</i> is a boolean,
+  default <code>false</code>, determines what happens when either limit
+  of the tape head is exceeded.  With <code>-wraptape true</code>,
+  the limits will be taken as modulus boundaries,
+  and the position of the tape head will 'wrap around' to the
+  opposite limit.  With <code>-wraptape false</code>,
+  an exception will be generated when this happens.
+  Note that if <i>b</i> is omitted
+  after <code>-wraptape</code>, <code>true</code> is assumed. Also note
+  that <code>-wraptape true</code> is not compatible with either
+  <code>-maxtape infinity</code> or <code>-mintape infinity</code>.</li>
+  </ul>
+  </li>
+ 
+  <li>Options pertaining to input and output:
+ 
+  <ul>
+  <li><code>-infile <i>s</i></code>, where <i>s</i> is a filename or
+  one of the terms <code>tty</code> or <code>heredoc</code>,
+  default <code>tty</code>, sets the
+  source of the input to the Brainf*ck program.
+  <code>tty</code> indicates an interactive terminal session with
+  "standard input".
+  <code>heredoc</code> indicates input will come from the
+  "here-doc" portion of the program source code (note that the
+  <code>-heredoc</code> option must also be given to parse the
+  source code.)
+  Using this option is preferred
+  over redirecting standard I/O with the shell, as it is a hint to the
+  interpreter that the program is not being run interactively.</li>
+ 
+  <li><code>-outfile <i>s</i></code>, where <i>s</i> is a filename or
+  the term <code>tty</code>, default <code>tty</code>, sets the
+  destination of the output of the Brainf*ck program.  This is preferred
+  to redirecting standard I/O with the shell, as it is a hint to the
+  interpreter that the program is not being run interactively.</li>
+ 
+  <li><code>-maxout <i>n</i></code>, where <i>n</i> is any integer or the
+  term <code>infinity</code>, default <code>infinity</code>, sets the
+  maximum character value which can be output.</li>
+ 
+  <li><code>-minout <i>n</i></code>, where <i>n</i> is any integer or the
+  term <code>infinity</code>, default 0, sets the minimum character
+  value which can be output.
+  (Note that <code>infinity</code> actually represents negative infinity
+  here.)</li>
+ 
+  <li><code>-wrapout <i>b</i></code>, where <i>b</i> is a boolean,
+  default <code>false</code>, determines what happens when either limit
+  of character output is exceeded.  With <code>-wrapout true</code>,
+  the limits will be taken as modulus boundaries,
+  and the actual character output will be computed by 'wrapping around'
+  the rquested value to the opposite limit.
+  With <code>-wrapout false</code>,
+  an exception will be generated.  Note that if <i>b</i> is omitted
+  after <code>-wrapout</code>, <code>true</code> is assumed. Also note
+  that <code>-wrapout true</code> is not compatible with either
+  <code>-maxout infinity</code> or <code>-minout infinity</code>.</li>
+ 
+  <li><code>-maxin <i>n</i></code>, where <i>n</i> is any integer or the
+  term <code>infinity</code>, default <code>infinity</code>, sets the
+  maximum character value which can be input.</li>
+ 
+  <li><code>-minin <i>n</i></code>, where <i>n</i> is any integer or the
+  term <code>infinity</code>, default 0, sets the minimum character
+  value which can be input.
+  (Note that <code>infinity</code> actually represents negative infinity
+  here.)</li>
+ 
+  <li><code>-wrapin <i>b</i></code>, where <i>b</i> is a boolean,
+  default <code>false</code>, determines what happens when either limit
+  of character input is exceeded.  With <code>-wrapin true</code>,
+  the limits will be taken as modulus boundaries,
+  and the actual character input will be computed by 'wrapping around'
+  the rquested value to the opposite limit.
+  With <code>-wrapin false</code>,
+  an exception will be generated.  Note that if <i>b</i> is omitted
+  after <code>-wrapin</code>, <code>true</code> is assumed. Also note
+  that <code>-wrapin true</code> is not compatible with either
+  <code>-maxin infinity</code> or <code>-minin infinity</code>.</li>
+ 
+  <li><code>-xlatout <i>s</i></code>, where <i>s</i> is string
+  in the form given below,
+  default value <tt>#10=#nl</tt>, specifies a mapping between
+  characters the Brainf*ck program sees itself as sending to output,
+  and the characters that the operating system actually receives.
+  The syntax for the mapping specification is described by this mini-grammar:
+  <ul><li>
+  <tt><i>string</i> "=" <i>string</i> ["," <i>string</i> "=" <i>string</i> ]</tt>
+  </li></ul>
+  Control and other characters can be embedded in this string by
+  giving their ASCII values in decimal preceded by a <tt>#</tt>
+  symbol.  A single <tt>#</tt> symbol can be represented by the
+  sequence <tt>#35</tt>.  A single <tt>=</tt> symbol can be
+  represented by the sequence <tt>#61</tt>.
+  A single <tt>,</tt> symbol can be
+  represented by the sequence <tt>#44</tt>.
+  The current operating system newline
+  sequence can be represented by <tt>#nl</tt>.
+  Note that whitespace is not allowed in this grammar,
+  and must be represented by <tt>#32</tt>, etc.
+  Note that if the <code>-xlatout</code> option is present
+  with no argument, this means that there should be <i>no</i> translation
+  mapping between Brainf*ck output and operating system output.</li>
+ 
+  <li><code>-xlatin <i>s</i></code>, where <i>s</i> is a string
+  in the form given above,
+  default value <tt>#nl=#10</tt>, specifies a complementary mapping between
+  characters on the operating system's input and
+  the Brainf*ck program's input.
+  Note that if the <code>-xlatin</code> option is present
+  with no argument, this means that there should be no translation
+  mapping of input.</li>
+ 
+  <li><code>-eof <i>i</i></code>, where <i>i</i> is any integer
+  or one of the terms <code>halt</code>, <code>stop</code>,
+  or <code>nop</code>, default 0,
+  determines the single ASCII character that will be given repeatedly to
+  the Brainf*ck program during execution of the <code>,</code> instruction
+  at and after the end of input is encountered.
+  If <code>halt</code> is given for <code>eof</code>, the Brainf*ck
+  program will be halted with an error
+  if it attempts to read past the end of user input.
+  If <code>stop</code> is given for <code>eof</code>, the Brainf*ck
+  program will be terminated normally if it attempts to read past
+  the end of user input.
+  If <code>nop</code> is given for <code>eof</code>, the Brainf*ck
+  program will act as if nothing at all happened if it attempts
+  to read past the end of user input (the tape will not be altered in
+  any way.)</li>
+  </ul>
+  </li>
+ 
+  <li>Debugging and other options:</li>
+  <ul>
+  <li><code>-quiet</code>, if given, suppresses all startup
+  output generated by the interpreter.  It does not suppress
+  status reports.</li>
+  <li><code>-autopsy</code>, if given, causes the interpreter to
+  issue a status report after the program terminates normally.</li>
+  <li><code>-statusevery <i>n</i></code>, where <i>n</i> is an
+  integer specifying a duration or the term <code>undefined</code>,
+  default <code>undefined</code>, tells <code>pibfi</code>
+  to generate periodic status reports at the given interval,
+  if it is not <code>undefined</code>.  If the duration is given
+  as a plain integer, units of milliseconds are assumed.  The
+  duration may also be given as an integer followed immediately
+  by <code>s</code>, <code>m</code>, or <code>h</code>, in which
+  case the units of measurement will be taken to be seconds,
+  minutes, or hours, respectively.</li>
+  </ul>
+  </ul>
+ 
+
+<h2><a name="index">Function Index</a></h2>
+
+<table width="100%" border="1"><tr><th colspan="2" align="left">Exported Functions</th></tr>
+<tr><td><a href="#get_flag-1">get_flag/1</a></td><td>Gets a switch from the command line.</td></tr>
+<tr><td><a href="#get_option-3">get_option/3</a></td><td>Gets an option from a list of (already parsed) option tuples.</td></tr>
+<tr><td><a href="#get_opts-1">get_opts/1</a></td><td>Gets a set of options from the command line.</td></tr>
+<tr><th colspan="2" align="left">Internal Documented Functions</th></tr>
+<tr><td><a href="#convert-2">convert/2</a></td><td>Converts an option value specified on the command line to a
+  term that <code>pibfi</code> can work with internally.</td></tr>
+<tr><td><a href="#missing-1">missing/1</a></td><td>Gets the default value for an option specified with no value
+  on the command line.</td></tr>
+<tr><td><a href="#unescape-1">unescape/1</a></td><td>Transforms escape codes in a string into embedded characters.</td></tr>
+</table>
+
+<h2><a name="exported">Exported Functions</a></h2>
+
+<h3><a name="get_flag-1">get_flag/1</a></h3>
+
+<p><code>get_flag(Switch::atom()) -> true | false</code></p>
+<p>Gets a switch from the command line.</p>
+
+<h3><a name="get_option-3">get_option/3</a></h3>
+
+<p><code>get_option(Options::[{atom(), term()}], Option::atom(), Default::term()) -> term()</code></p>
+<p>Gets an option from a list of (already parsed) option tuples.</p>
+
+<h3><a name="get_opts-1">get_opts/1</a></h3>
+
+<p><code>get_opts([atom()]) -> [{atom(), term()}]</code></p>
+<p>Gets a set of options from the command line.</p>
+
+<h2><a name="internal">Documented Internal Functions</a></h2>
+
+<h3><a name="convert-2">convert/2</a></h3>
+
+<p><code>convert(atom(), string()) -> term()</code></p>
+<p>Converts an option value specified on the command line to a
+  term that <code>pibfi</code> can work with internally.</p>
+
+<h3><a name="missing-1">missing/1</a></h3>
+
+<p><code>missing(atom()) -> term()</code></p>
+<p>Gets the default value for an option specified with no value
+  on the command line.</p>
+
+<h3><a name="unescape-1">unescape/1</a></h3>
+
+<p><code>unescape(string()) -> string()</code></p>
+<p>Transforms escape codes in a string into embedded characters.
+  The escape code <tt>#<i>i</i></tt> where <tt><i>i</i></tt> is a
+  decimal integer of from one to three digits is converted into an
+  ASCII character of that value.</p></body>
+</html>

doc/pibfi_parser.html

+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>Module pibfi_parser</title>
+
+</head>
+<body bgcolor="white">
+<h1>Module pibfi_parser</h1>
+<ul><li>
+<a href="#index">Function index</a></li><li>
+<a href="#exported">Exported functions</a></li></ul>
+
+<h2>Description</h2>
+Brainf*ck parser for <code>pibfi</code>.
+ 
+
+<h2><a name="index">Function Index</a></h2>
+
+<table width="100%" border="1"><tr><th colspan="2" align="left">Exported Functions</th></tr>
+<tr><td><a href="#parse-2">parse/2</a></td><td>Transforms a string into a nested tuple data structure
+  suitable for interpretation.</td></tr>
+</table>
+
+<h2><a name="exported">Exported Functions</a></h2>
+
+<h3><a name="parse-2">parse/2</a></h3>
+
+<p><code>parse(string() | binary(), Options) -> {<a href="#type-tuple">tuple()</a>, string()}</code></p>
+<p>Transforms a string into a nested tuple data structure
+  suitable for interpretation.</p></body>
+</html>

doc/pibfi_statistics.html

+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>Module pibfi_statistics</title>
+
+</head>
+<body bgcolor="white">
+<h1>Module pibfi_statistics</h1>
+<ul><li>
+<a href="#index">Function index</a></li><li>
+<a href="#exported">Exported functions</a></li></ul>
+
+<h2>Description</h2>
+Statistics collector for <code>pibfi</code>.
+ 
+
+<h2><a name="index">Function Index</a></h2>
+
+<table width="100%" border="1"><tr><th colspan="2" align="left">Exported Functions</th></tr>
+<tr><td><a href="#dump-0">dump/0</a></td><td/></tr>
+<tr><td><a href="#dump-1">dump/1</a></td><td/></tr>
+<tr><td><a href="#server-2">server/2</a></td><td/></tr>
+<tr><td><a href="#start-3">start/3</a></td><td/></tr>
+<tr><td><a href="#update_program-3">update_program/3</a></td><td/></tr>
+</table>
+
+<h2><a name="exported">Exported Functions</a></h2>
+
+<h3><a name="dump-0">dump/0</a></h3>
+
+<p><code>dump() -> term()</code></p>
+<p> </p>
+
+<h3><a name="dump-1">dump/1</a></h3>
+
+<p><code>dump(Arg1) -> term()</code></p>
+<p> </p>
+
+<h3><a name="server-2">server/2</a></h3>
+
+<p><code>server(Arg1, Arg2) -> term()</code></p>
+<p> </p>
+
+<h3><a name="start-3">start/3</a></h3>
+
+<p><code>start(Arg1, Arg2, Arg3) -> term()</code></p>
+<p> </p>
+
+<h3><a name="update_program-3">update_program/3</a></h3>
+
+<p><code>update_program(Arg1, Arg2, Arg3) -> term()</code></p>
+<p> </p></body>
+</html>

doc/pibfi_stripper.html

+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>Module pibfi_stripper</title>
+
+</head>
+<body bgcolor="white">
+<h1>Module pibfi_stripper</h1>
+<ul><li>
+<a href="#index">Function index</a></li><li>
+<a href="#exported">Exported functions</a></li></ul>
+
+<h2>Description</h2>
+Stripper for <code>pibfi</code>.
+ 
+  <p>Takes the internal format as generated by the parser and
+  takes out everything non-essential.</p>
+ 
+
+
+<h2><a name="index">Function Index</a></h2>
+
+<table width="100%" border="1"><tr><th colspan="2" align="left">Exported Functions</th></tr>
+<tr><td><a href="#strip-2">strip/2</a></td><td>Strips a Brainf*ck program.</td></tr>
+</table>
+
+<h2><a name="exported">Exported Functions</a></h2>
+
+<h3><a name="strip-2">strip/2</a></h3>
+
+<p><code>strip(<a href="#type-program">program()</a>, Exclude::string()) -> <a href="#type-program">program()</a></code></p>
+<p>Strips a Brainf*ck program.
+</p></body>
+</html>

doc/pibfi_supervisor.html

+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>Module pibfi_supervisor</title>
+
+</head>
+<body bgcolor="white">
+<h1>Module pibfi_supervisor</h1>
+<ul><li>
+<a href="#index">Function index</a></li><li>
+<a href="#exported">Exported functions</a></li></ul>
+
+<h2>Description</h2>
+Supervisor process for <code>pibfi</code>.
+ 
+  <p>All error handling is done here.  This allows the other processes
+  to be coded in a more direct, laissez-crash style.  The centralization
+  of error-handling code in this process allows for minimal
+  error-handling code in the other processes, which makes their code
+  clearer and easier to follow.</p>
+ 
+
+<h2><a name="index">Function Index</a></h2>
+
+<table width="100%" border="1"><tr><th colspan="2" align="left">Exported Functions</th></tr>
+<tr><td><a href="#link-3">link/3</a></td><td/></tr>
+<tr><td><a href="#server-0">server/0</a></td><td/></tr>
+<tr><td><a href="#spawn_link-6">spawn_link/6</a></td><td/></tr>
+<tr><td><a href="#start-0">start/0</a></td><td/></tr>
+</table>
+
+<h2><a name="exported">Exported Functions</a></h2>
+
+<h3><a name="link-3">link/3</a></h3>
+
+<p><code>link(Arg1, Arg2, Arg3) -> term()</code></p>
+<p> </p>
+
+<h3><a name="server-0">server/0</a></h3>
+
+<p><code>server() -> term()</code></p>
+<p> </p>
+
+<h3><a name="spawn_link-6">spawn_link/6</a></h3>
+
+<p><code>spawn_link(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6) -> term()</code></p>
+<p> </p>
+
+<h3><a name="start-0">start/0</a></h3>
+
+<p><code>start() -> term()</code></p>
+<p> </p></body>
+</html>

doc/pibfi_tape.html

+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>Module pibfi_tape</title>
+
+</head>
+<body bgcolor="white">
+<h1>Module pibfi_tape</h1>
+<ul><li>
+<a href="#index">Function index</a></li><li>
+<a href="#exported">Exported functions</a></li></ul>
+
+<h2>Description</h2>
+Tape ADT for the Platonic Ideal Brainf*ck Interpreter.
+ 
+  <p>Now a behaviour.</p>
+ 
+
+<h2><a name="index">Function Index</a></h2>
+
+<table width="100%" border="1"><tr><th colspan="2" align="left">Exported Functions</th></tr>
+<tr><td><a href="#behaviour_info-1">behaviour_info/1</a></td><td/></tr>
+<tr><td><a href="#decrement-1">decrement/1</a></td><td>Decrements the value at the current position on the tape.</td></tr>
+<tr><td><a href="#decrement-2">decrement/2</a></td><td>Decrements the value at the current position on the tape N times.</td></tr>
+<tr><td><a href="#examine-1">examine/1</a></td><td>Examines the state of the tape.</td></tr>
+<tr><td><a href="#increment-1">increment/1</a></td><td>Increments the value at the current position on the tape.</td></tr>
+<tr><td><a href="#increment-2">increment/2</a></td><td>Increments the value at the current position on the tape N times.</td></tr>
+<tr><td><a href="#left-1">left/1</a></td><td>Moves the read/write head one position left on the tape.</td></tr>
+<tr><td><a href="#left-2">left/2</a></td><td>Moves the read/write head N positions left on the tape.</td></tr>
+<tr><td><a href="#read-1">read/1</a></td><td>Returns the value at the current position on the tape.</td></tr>
+<tr><td><a href="#right-1">right/1</a></td><td>Moves the read/write head one position right on the tape.</td></tr>
+<tr><td><a href="#right-2">right/2</a></td><td>Moves the read/write head N positions right on the tape.</td></tr>
+<tr><td><a href="#server-2">server/2</a></td><td/></tr>
+<tr><td><a href="#start-3">start/3</a></td><td>Starts and returns the pid of a new tape server.</td></tr>
+<tr><td><a href="#write-2">write/2</a></td><td>Places the given value at the current position on the tape.</td></tr>
+</table>
+
+<h2><a name="exported">Exported Functions</a></h2>
+
+<h3><a name="behaviour_info-1">behaviour_info/1</a></h3>
+
+<p><code>behaviour_info(Arg1) -> term()</code></p>
+<p> </p>
+
+<h3><a name="decrement-1">decrement/1</a></h3>
+
+<p><code>decrement(<a href="#type-tape">tape()</a>) -> ok | {error, Reason}</code></p>
+<p>Decrements the value at the current position on the tape.</p>
+
+<h3><a name="decrement-2">decrement/2</a></h3>
+
+<p><code>decrement(<a href="#type-tape">tape()</a>, N::integer()) -> ok | {error, Reason}</code></p>
+<p>Decrements the value at the current position on the tape N times.</p>
+
+<h3><a name="examine-1">examine/1</a></h3>
+
+<p><code>examine(TapePid::pid()) -> ok | {error, Reason}</code></p>
+<p>Examines the state of the tape.</p>
+
+<h3><a name="increment-1">increment/1</a></h3>
+
+<p><code>increment(<a href="#type-tape">tape()</a>) -> ok | {error, Reason}</code></p>
+<p>Increments the value at the current position on the tape.</p>
+
+<h3><a name="increment-2">increment/2</a></h3>
+
+<p><code>increment(<a href="#type-tape">tape()</a>, N::integer()) -> ok | {error, Reason}</code></p>
+<p>Increments the value at the current position on the tape N times.</p>
+
+<h3><a name="left-1">left/1</a></h3>
+
+<p><code>left(pid()) -> ok</code></p>
+<p>Moves the read/write head one position left on the tape.</p>
+
+<h3><a name="left-2">left/2</a></h3>
+
+<p><code>left(pid(), N::integer()) -> ok</code></p>
+<p>Moves the read/write head N positions left on the tape.</p>
+
+<h3><a name="read-1">read/1</a></h3>
+
+<p><code>read(pid()) -> integer()</code></p>
+<p>Returns the value at the current position on the tape.</p>
+
+<h3><a name="right-1">right/1</a></h3>
+
+<p><code>right(pid()) -> ok</code></p>
+<p>Moves the read/write head one position right on the tape.</p>
+
+<h3><a name="right-2">right/2</a></h3>
+
+<p><code>right(pid(), N::integer()) -> ok</code></p>
+<p>Moves the read/write head N positions right on the tape.</p>
+
+<h3><a name="server-2">server/2</a></h3>
+
+<p><code>server(Arg1, Arg2) -> term()</code></p>
+<p> </p>
+
+<h3><a name="start-3">start/3</a></h3>
+
+<p><code>start(<a href="#type-module">module()</a>, Supervisor::pid(), [<a href="#type-option">option()</a>]) -> pid()<ul><li><a name="type-option">option()</a> = {atom(), term()}</li></ul></code></p>
+<p>Starts and returns the pid of a new tape server.
+  For a description of the allowed options, see the documentation for
+  the <code><a href="pibfi.html">pibfi</a></code> module.</p>
+
+<h3><a name="write-2">write/2</a></h3>
+
+<p><code>write(<a href="#type-tape">tape()</a>, integer()) -> {ok, integer()} | {error, Reason}</code></p>
+<p>Places the given value at the current position on the tape.</p></body>
+</html>

doc/pibfi_tape_dict.html

+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>Module pibfi_tape_dict</title>
+
+</head>
+<body bgcolor="white">
+<h1>Module pibfi_tape_dict</h1>
+<ul><li>
+<a href="#index">Function index</a></li><li>
+<a href="#exported">Exported functions</a></li></ul>
+
+<h2>Description</h2>
+Dict backend for tape ADT for the Platonic Ideal Brainf*ck Interpreter.
+ 
+
+<h2><a name="index">Function Index</a></h2>
+
+<table width="100%" border="1"><tr><th colspan="2" align="left">Exported Functions</th></tr>
+<tr><td><a href="#head-1">head/1</a></td><td/></tr>
+<tr><td><a href="#left-2">left/2</a></td><td>Moves the read/write head N positions left on the tape.</td></tr>
+<tr><td><a href="#new-1">new/1</a></td><td>Creates and returns a new tape.</td></tr>
+<tr><td><a href="#peek-2">peek/2</a></td><td/></tr>
+<tr><td><a href="#poke-3">poke/3</a></td><td/></tr>
+<tr><td><a href="#read-1">read/1</a></td><td>Returns the value at the current position on the tape.</td></tr>
+<tr><td><a href="#right-2">right/2</a></td><td>Moves the read/write head N positions right on the tape.</td></tr>
+<tr><td><a href="#write-2">write/2</a></td><td>Places the given value at the current position on the tape.</td></tr>
+</table>
+
+<h2><a name="exported">Exported Functions</a></h2>
+
+<h3><a name="head-1">head/1</a></h3>
+
+<p><code>head(Arg1) -> term()</code></p>
+<p> </p>
+
+<h3><a name="left-2">left/2</a></h3>
+
+<p><code>left(<a href="#type-tape">tape()</a>, N::integer()) -> {<a href="#type-tape">tape()</a>, integer()}</code></p>
+<p>Moves the read/write head N positions left on the tape.</p>
+
+<h3><a name="new-1">new/1</a></h3>
+
+<p><code>new([<a href="#type-option">option()</a>]) -> <a href="#type-tape">tape()</a><ul><li><a name="type-option">option()</a> = {atom(), term()}</li><li><a name="type-tape">tape()</a> = <a href="#type-tape">tape()</a></li></ul></code></p>
+<p>Creates and returns a new tape.
+  For a description of the allowed options, see the documentation for
+  the <code><a href="pibfi.html">pibfi</a></code> module.</p>
+
+<h3><a name="peek-2">peek/2</a></h3>
+
+<p><code>peek(Arg1, Arg2) -> term()</code></p>
+<p> </p>
+
+<h3><a name="poke-3">poke/3</a></h3>
+
+<p><code>poke(Arg1, Arg2, Arg3) -> term()</code></p>
+<p> </p>
+
+<h3><a name="read-1">read/1</a></h3>
+
+<p><code>read(<a href="#type-tape">tape()</a>) -> integer()</code></p>
+<p>Returns the value at the current position on the tape.</p>
+
+<h3><a name="right-2">right/2</a></h3>
+
+<p><code>right(<a href="#type-tape">tape()</a>, N::integer()) -> {<a href="#type-tape">tape()</a>, integer()}</code></p>
+<p>Moves the read/write head N positions right on the tape.</p>
+
+<h3><a name="write-2">write/2</a></h3>
+
+<p><code>write(<a href="#type-tape">tape()</a>, integer()) -> {<a href="#type-tape">tape()</a>, integer()}</code></p>
+<p>Places the given value at the current position on the tape.</p></body>
+</html>

doc/pibfi_tape_dynarray.html

+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>Module pibfi_tape_dynarray</title>
+
+</head>
+<body bgcolor="white">
+<h1>Module pibfi_tape_dynarray</h1>
+<ul><li>
+<a href="#index">Function index</a></li><li>
+<a href="#exported">Exported functions</a></li></ul>
+
+<h2>Description</h2>
+dynarray backend for tape ADT for <code>pibfi</code>.
+ 
+
+<h2><a name="index">Function Index</a></h2>
+
+<table width="100%" border="1"><tr><th colspan="2" align="left">Exported Functions</th></tr>
+<tr><td><a href="#decrement-2">decrement/2</a></td><td>Decrements the value at the current position on the tape N times.</td></tr>
+<tr><td><a href="#head-1">head/1</a></td><td/></tr>
+<tr><td><a href="#increment-2">increment/2</a></td><td>Increments the value at the current position on the tape N times.</td></tr>
+<tr><td><a href="#left-2">left/2</a></td><td>Moves the read/write head N positions left on the tape.</td></tr>
+<tr><td><a href="#new-1">new/1</a></td><td>Creates and returns a new dynarray-backed tape.</td></tr>
+<tr><td><a href="#peek-2">peek/2</a></td><td/></tr>
+<tr><td><a href="#poke-3">poke/3</a></td><td/></tr>
+<tr><td><a href="#read-1">read/1</a></td><td>Returns the value at the current position on the tape.</td></tr>
+<tr><td><a href="#right-2">right/2</a></td><td>Moves the read/write head N positions right on the tape.</td></tr>
+<tr><td><a href="#write-2">write/2</a></td><td>Places the given value at the current position on the tape.</td></tr>
+</table>
+
+<h2><a name="exported">Exported Functions</a></h2>
+
+<h3><a name="decrement-2">decrement/2</a></h3>
+
+<p><code>decrement(<a href="#type-tape">tape()</a>, N::integer()) -> <a href="#type-tape">tape()</a></code></p>
+<p>Decrements the value at the current position on the tape N times.</p>
+
+<h3><a name="head-1">head/1</a></h3>
+
+<p><code>head(Arg1) -> term()</code></p>
+<p> </p>
+
+<h3><a name="increment-2">increment/2</a></h3>
+
+<p><code>increment(<a href="#type-tape">tape()</a>, N::integer()) -> <a href="#type-tape">tape()</a></code></p>
+<p>Increments the value at the current position on the tape N times.</p>
+
+<h3><a name="left-2">left/2</a></h3>
+
+<p><code>left(<a href="#type-tape">tape()</a>, N::integer()) -> {<a href="#type-tape">tape()</a>, integer()}</code></p>
+<p>Moves the read/write head N positions left on the tape.</p>
+
+<h3><a name="new-1">new/1</a></h3>
+
+<p><code>new([<a href="#type-option">option()</a>]) -> <a href="#type-tape">tape()</a><ul><li><a name="type-option">option()</a> = {atom(), term()}</li><li><a name="type-tape">tape()</a> = <a href="#type-tape">tape()</a></li></ul></code></p>
+<p>Creates and returns a new dynarray-backed tape.</p>
+
+<h3><a name="peek-2">peek/2</a></h3>
+
+<p><code>peek(Arg1, Arg2) -> term()</code></p>
+<p> </p>
+
+<h3><a name="poke-3">poke/3</a></h3>
+
+<p><code>poke(Arg1, Arg2, Arg3) -> term()</code></p>
+<p> </p>
+
+<h3><a name="read-1">read/1</a></h3>
+
+<p><code>read(<a href="#type-tape">tape()</a>) -> integer()</code></p>
+<p>Returns the value at the current position on the tape.</p>
+
+<h3><a name="right-2">right/2</a></h3>
+
+<p><code>right(<a href="#type-tape">tape()</a>, N::integer()) -> {<a href="#type-tape">tape()</a>, integer()}</code></p>
+<p>Moves the read/write head N positions right on the tape.</p>
+
+<h3><a name="write-2">write/2</a></h3>
+
+<p><code>write(<a href="#type-tape">tape()</a>, integer()) -> {<a href="#type-tape">tape()</a>, integer()}</code></p>
+<p>Places the given value at the current position on the tape.</p></body>
+</html>

doc/pibfi_tape_ets.html

+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>Module pibfi_tape_ets</title>
+
+</head>
+<body bgcolor="white">
+<h1>Module pibfi_tape_ets</h1>
+<ul><li>
+<a href="#index">Function index</a></li><li>
+<a href="#exported">Exported functions</a></li></ul>
+
+<h2>Description</h2>
+ETS backend for tape ADT for the Platonic Ideal Brainf*ck Interpreter.
+ 
+
+<h2><a name="index">Function Index</a></h2>
+
+<table width="100%" border="1"><tr><th colspan="2" align="left">Exported Functions</th></tr>
+<tr><td><a href="#head-1">head/1</a></td><td/></tr>
+<tr><td><a href="#left-2">left/2</a></td><td>Moves the read/write head N positions left on the tape.</td></tr>
+<tr><td><a href="#new-1">new/1</a></td><td>Creates and returns a new ETS-backed tape.</td></tr>
+<tr><td><a href="#peek-2">peek/2</a></td><td/></tr>
+<tr><td><a href="#poke-3">poke/3</a></td><td/></tr>
+<tr><td><a href="#read-1">read/1</a></td><td>Returns the value at the current position on the tape.</td></tr>
+<tr><td><a href="#right-2">right/2</a></td><td>Moves the read/write head N positions right on the tape.</td></tr>
+<tr><td><a href="#write-2">write/2</a></td><td>Places the given value at the current position on the tape.</td></tr>
+</table>
+
+<h2><a name="exported">Exported Functions</a></h2>
+
+<h3><a name="head-1">head/1</a></h3>
+
+<p><code>head(Arg1) -> term()</code></p>
+<p> </p>
+
+<h3><a name="left-2">left/2</a></h3>
+
+<p><code>left(<a href="#type-tape">tape()</a>, N::integer()) -> {<a href="#type-tape">tape()</a>, integer()}</code></p>
+<p>Moves the read/write head N positions left on the tape.</p>
+
+<h3><a name="new-1">new/1</a></h3>
+
+<p><code>new([<a href="#type-option">option()</a>]) -> <a href="#type-tape">tape()</a><ul><li><a name="type-option">option()</a> = {atom(), term()}</li><li><a name="type-tape">tape()</a> = <a href="#type-tape">tape()</a></li></ul></code></p>
+<p>Creates and returns a new ETS-backed tape.</p>
+
+<h3><a name="peek-2">peek/2</a></h3>
+
+<p><code>peek(Arg1, Arg2) -> term()</code></p>
+<p> </p>
+
+<h3><a name="poke-3">poke/3</a></h3>
+
+<p><code>poke(Arg1, Arg2, Arg3) -> term()</code></p>
+<p> </p>
+
+<h3><a name="read-1">read/1</a></h3>
+
+<p><code>read(<a href="#type-tape">tape()</a>) -> integer()</code></p>
+<p>Returns the value at the current position on the tape.</p>
+
+<h3><a name="right-2">right/2</a></h3>
+
+<p><code>right(<a href="#type-tape">tape()</a>, N::integer()) -> {<a href="#type-tape">tape()</a>, integer()}</code></p>
+<p>Moves the read/write head N positions right on the tape.</p>
+
+<h3><a name="write-2">write/2</a></h3>
+
+<p><code>write(<a href="#type-tape">tape()</a>, integer()) -> {<a href="#type-tape">tape()</a>, integer()}</code></p>
+<p>Places the given value at the current position on the tape.</p></body>
+</html>

doc/pibfi_tape_tuple.html

+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>Module pibfi_tape_tuple</title>
+
+</head>
+<body bgcolor="white">
+<h1>Module pibfi_tape_tuple</h1>
+<ul><li>
+<a href="#index">Function index</a></li><li>
+<a href="#exported">Exported functions</a></li></ul>
+
+<h2>Description</h2>
+Tuple backend for tape ADT for <code>pibfi</code>.
+ 
+
+<h2><a name="index">Function Index</a></h2>
+
+<table width="100%" border="1"><tr><th colspan="2" align="left">Exported Functions</th></tr>
+<tr><td><a href="#decrement-2">decrement/2</a></td><td>Decrements the value at the current position on the tape N times.</td></tr>
+<tr><td><a href="#head-1">head/1</a></td><td/></tr>
+<tr><td><a href="#increment-2">increment/2</a></td><td>Increments the value at the current position on the tape N times.</td></tr>
+<tr><td><a href="#left-2">left/2</a></td><td>Moves the read/write head N positions left on the tape.</td></tr>
+<tr><td><a href="#new-1">new/1</a></td><td>Creates and returns a new tuple-backed tape.</td></tr>
+<tr><td><a href="#peek-2">peek/2</a></td><td/></tr>
+<tr><td><a href="#poke-3">poke/3</a></td><td/></tr>
+<tr><td><a href="#read-1">read/1</a></td><td>Returns the value at the current position on the tape.</td></tr>
+<tr><td><a href="#right-2">right/2</a></td><td>Moves the read/write head N positions right on the tape.</td></tr>
+<tr><td><a href="#write-2">write/2</a></td><td>Places the given value at the current position on the tape.</td></tr>
+</table>
+
+<h2><a name="exported">Exported Functions</a></h2>
+
+<h3><a name="decrement-2">decrement/2</a></h3>
+
+<p><code>decrement(<a href="#type-tape">tape()</a>, N::integer()) -> <a href="#type-tape">tape()</a></code></p>
+<p>Decrements the value at the current position on the tape N times.</p>
+
+<h3><a name="head-1">head/1</a></h3>
+
+<p><code>head(Arg1) -> term()</code></p>
+<p> </p>
+
+<h3><a name="increment-2">increment/2</a></h3>
+
+<p><code>increment(<a href="#type-tape">tape()</a>, N::integer()) -> <a href="#type-tape">tape()</a></code></p>
+<p>Increments the value at the current position on the tape N times.</p>
+
+<h3><a name="left-2">left/2</a></h3>
+
+<p><code>left(<a href="#type-tape">tape()</a>, N::integer()) -> {<a href="#type-tape">tape()</a>, integer()}</code></p>
+<p>Moves the read/write head N positions left on the tape.</p>
+
+<h3><a name="new-1">new/1</a></h3>
+
+<p><code>new([<a href="#type-option">option()</a>]) -> <a href="#type-tape">tape()</a><ul><li><a name="type-option">option()</a> = {atom(), term()}</li><li><a name="type-tape">tape()</a> = <a href="#type-tape">tape()</a></li></ul></code></p>
+<p>Creates and returns a new tuple-backed tape.</p>
+
+<h3><a name="peek-2">peek/2</a></h3>
+
+<p><code>peek(Arg1, Arg2) -> term()</code></p>
+<p> </p>
+
+<h3><a name="poke-3">poke/3</a></h3>
+
+<p><code>poke(Arg1, Arg2, Arg3) -> term()</code></p>
+<p> </p>
+
+<h3><a name="read-1">read/1</a></h3>
+
+<p><code>read(<a href="#type-tape">tape()</a>) -> integer()</code></p>
+<p>Returns the value at the current position on the tape.</p>
+
+<h3><a name="right-2">right/2</a></h3>
+
+<p><code>right(<a href="#type-tape">tape()</a>, N::integer()) -> {<a href="#type-tape">tape()</a>, integer()}</code></p>
+<p>Moves the read/write head N positions right on the tape.</p>
+
+<h3><a name="write-2">write/2</a></h3>
+
+<p><code>write(<a href="#type-tape">tape()</a>, integer()) -> {<a href="#type-tape">tape()</a>, integer()}</code></p>
+<p>Places the given value at the current position on the tape.</p></body>
+</html>

doc/pibfi_xlat.html

+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>Module pibfi_xlat</title>
+
+</head>
+<body bgcolor="white">
+<h1>Module pibfi_xlat</h1>
+<ul><li>
+<a href="#index">Function index</a></li><li>
+<a href="#exported">Exported functions</a></li></ul>
+
+<h2>Description</h2>
+Character translation server for <code>pibfi</code>.
+ 
+  <p>This is not efficient.  An efficient implementation would compile
+  the candidates into a finite-state machine first.  This doesn't do that.</p>
+ 
+
+<h2><a name="index">Function Index</a></h2>
+
+<table width="100%" border="1"><tr><th colspan="2" align="left">Exported Functions</th></tr>
+<tr><td><a href="#flush-1">flush/1</a></td><td>Causes the xlat server to flush all its characters to the output,
+  even ones in the process of matching candidate strings.</td></tr>
+<tr><td><a href="#notify-2">notify/2</a></td><td>Notifies the other end of the connection.</td></tr>
+<tr><td><a href="#send-2">send/2</a></td><td>Sends a character or characters to an xlat server for translation.</td></tr>
+<tr><td><a href="#server-2">server/2</a></td><td>Spawned by <code>start/2</code>, should not be called
+  directly by user code.</td></tr>
+<tr><td><a href="#start-2">start/2</a></td><td>Starts an xlat server.</td></tr>
+<tr><td><a href="#test-0">test/0</a></td><td/></tr>
+</table>
+
+<h2><a name="exported">Exported Functions</a></h2>
+
+<h3><a name="flush-1">flush/1</a></h3>
+
+<p><code>flush(<a href="#type-xlat">xlat()</a>) -> ok</code></p>
+<p>Causes the xlat server to flush all its characters to the output,
+  even ones in the process of matching candidate strings.  Typically
+  this is called before the output is closed.</p>
+
+<h3><a name="notify-2">notify/2</a></h3>
+
+<p><code>notify(<a href="#type-xlat">xlat()</a>, term()) -> ok</code></p>
+<p>Notifies the other end of the connection.
+  They will receive a <code>{Xlat::pid(), Notifier::pid(), message, term()}</code> message.</p>
+
+<h3><a name="send-2">send/2</a></h3>
+
+<p><code>send(<a href="#type-xlat">xlat()</a>, char() | string()) -> ok</code></p>
+<p>Sends a character or characters to an xlat server for translation.</p>
+
+<h3><a name="server-2">server/2</a></h3>
+
+<p><code>server(<a href="#type-candidates">candidates()</a>, Dest::pid()) -> <a href="#type-never_returns">never_returns()</a></code></p>
+<p>Spawned by <code>start/2</code>, should not be called
+  directly by user code.</p>
+
+<h3><a name="start-2">start/2</a></h3>
+
+<p><code>start(<a href="#type-candidates">candidates()</a>, Dest::pid()) -> <a href="#type-xlat">xlat()</a><ul><li><a name="type-candidates">candidates()</a> = [{string(), string()}]</li><li><a name="type-xlat">xlat()</a> = pid()</li><li><a name="type-string">string()</a> = [char()]</li><li><a name="type-char">char()</a> = integer()</li></ul></code></p>
+<p>Starts an xlat server.  Candidates is a list of pairs of strings.
+  Characters are sent to the xlat server with the <code>send/2</code>
+  function.  When they match the left
+  string of a candidate, the right string is sent to Dest instead.
+  If they do not match any candidates, they are sent through unaltered.
+  Characters are sent to Dest in the form
+  <code>{xlat(), xlat_char, char()}</code>.
+  Note that if two candidates have the same left string, the result of
+  the translation is undefined.  Also note that if one candidate has
+  a left string that is a prefix of another candidate's left string,
+  that second candidate will never match (the shorter one will always
+  be matched first.)</p>
+
+<h3><a name="test-0">test/0</a></h3>
+
+<p><code>test() -> term()</code></p>
+<p> </p></body>
+</html>

ebin/pibfi.beam

Binary file added.

ebin/pibfi_filter.beam

Binary file added.

ebin/pibfi_input.beam

Binary file added.

ebin/pibfi_interpreter.beam

Binary file added.

ebin/pibfi_io.beam

Binary file added.

ebin/pibfi_optimizer.beam

Binary file added.

ebin/pibfi_options.beam

Binary file added.

ebin/pibfi_parser.beam

Binary file added.

ebin/pibfi_statistics.beam

Binary file added.

ebin/pibfi_stripper.beam

Binary file added.

ebin/pibfi_supervisor.beam

Binary file added.

ebin/pibfi_tape.beam

Binary file added.

ebin/pibfi_tape_dict.beam

Binary file added.

ebin/pibfi_tape_dynarray.beam

Binary file added.

ebin/pibfi_tape_ets.beam

Binary file added.

ebin/pibfi_tape_tuple.beam

Binary file added.

ebin/pibfi_xlat.beam

Binary file added.
+,[.#,]>++++++++++.
+|Oh look, a here-doc.
+>+++++++++++++++++++++++++++++++++++<+[[,.----------]>.<+]
++[,----------]
+>+++++++++[<++++++++>-]<.>+++++++[<++++>-]<+.+++++++..+++.[-]>++++++++[<++++>-]
+<.>+++++++++++[<+++++>-]<.>++++++++[<+++>-]<.+++.------.--------.[-]>++++++++[
+<++++>-]<+.[-]++++++++++.
+%%% BEGIN bf.erl %%%
+%%%
+%%% bf - pedantic Brainf*ck interpreter in Erlang
+%%% Copyright (c)2002 Cat's Eye Technologies.  All rights reserved.
+%%%
+%%% Redistribution and use in source and binary forms, with or without
+%%% modification, are permitted provided that the following conditions
+%%% are met:
+%%%
+%%%   Redistributions of source code must retain the above copyright
+%%%   notice, this list of conditions and the following disclaimer.
+%%%
+%%%   Redistributions in binary form must reproduce the above copyright
+%%%   notice, this list of conditions and the following disclaimer in
+%%%   the documentation and/or other materials provided with the
+%%%   distribution.
+%%%
+%%%   Neither the name of Cat's Eye Technologies nor the names of its
+%%%   contributors may be used to endorse or promote products derived
+%%%   from this software without specific prior written permission.
+%%%
+%%% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+%%% CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+%%% INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+%%% MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+%%% DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
+%%% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+%%% OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+%%% PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+%%% OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+%%% ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+%%% OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+%%% OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+%%% POSSIBILITY OF SUCH DAMAGE. 
+
+%% @doc Cat's Eye Technologies' Erlang Brainf*ck Interpreter.
+%%
+%% <p>An implementation of the world's most beautifulest langugage
+%% in the world's second most beautifulest language.</p>
+%% <p>This program demonstrates:</p>
+%% <ul>
+%% <li> sequential programming in Erlang </li>
+%% <li> simulating Brainf*ck's updatable store by passing arguments </li>
+%% </ul>
+%% <p>Variable names used in this program:</p>
+%% <ul>
+%% <li> I = Instruction pointer </li>
+%% <li> B = Brainf*ck program </li>
+%% <li> D = Data pointer (tape head position) </li>
+%% <li> M = Memory (Brainf*ck tape) </li>
+%% </ul>
+%%
+%% @end
+
+-module(bf).
+-vsn('2002.1208').
+-copyright('Copyright (c)2002 Cat`s Eye Technologies. All rights reserved.').
+
+-export([interpret/1, interpret/2, test/1]).
+
+%% @spec interpret(B::[instruction()], StorageSize::integer()) ->
+%%   {integer(), tuple()}
+%%         instruction() = integer()
+%% @doc The main user interface to the Brainf*ck interpreter.
+%% The user generally passes a list, which is parsed into a tuple.
+%% In this tuple, each Brainf*ck instruction represented by
+%% an atom, except for <code>[</code> and <code>]</code>,
+%% which are represented by a nested tuple to make interpretation simpler.
+%% The return value is a tuple containing the data pointer and
+%% another tuple representing the state of the Brainf*ck tape
+%% after all is said and done.
+
+interpret(B, N) when tuple(B) -> interpret(1, B, 1, erlang:make_tuple(N, 0));
+interpret(B, N) when list(B)  -> interpret(parse(B), N).
+
+%% @spec interpret(B::[instruction()]) -> {integer(), tuple()}
+%% @equiv interpret(Program, 512)
+
+interpret(B) -> interpret(B, 512).  % default memsize, use interpret/2 to specify
+
+%% @spec interpret(I::integer(), B::[instruction()], D::integer(), M::tuple) -> {integer(), tuple()}
+%% @doc The internal driver which implements the execution loop.
+%% When the I pointer is at the end of the program, processing is finished.
+%% But more usually, I will be travelling forward through B.
+
+interpret(I, B, D, M) when I > size(B) -> {D, M};
+interpret(I, B, D, M) ->
+  {D2, M2} = execute(element(I, B), D, M),
+  interpret(I + 1, B, D2, M2).
+
+%% @spec execute(instruction(), D::integer(), M::tuple) -> {integer(), tuple()}
+%% @doc Executes specific, individual instructions.  Erlang doesn't have an
+%% updatable store like Brainf*ck (unless you count the process dictionary
+%% (which you probably shouldn't,)) so instead we approach the problem by
+%% continually deriving new stores from old stores, returning the new
+%% store to the caller each time this function is called.
+
+execute($>, D, M) -> {D + 1, M};
+execute($<, D, M) -> {D - 1, M};
+execute($+, D, M) -> {D, setelement(D, M, element(D, M) + 1)};
+execute($-, D, M) -> {D, setelement(D, M, element(D, M) - 1)};
+
+%% <p>I/O is fairly crude, and could stand to be improved.</p>
+
+execute($., D, M) -> io:put_chars([element(D, M)]), {D, M};
+execute($,, D, M) -> {D, setelement(D, M, hd(io:get_chars('bf> ', 1)))};
+
+%% <p>The 'while' loop.  A tuple represents a [...] structure; if
+%% the data pointer points to a non-zero, the nested Brainf*ck
+%% subprogram is executed, and the check is repeated.</p>
+
+execute(B,  D, M) when tuple(B), element(D, M) == 0 -> {D, M};
+execute(B,  D, M) when tuple(B) ->
+  {D2, M2} = interpret(1, B, D, M),
+  execute(B, D2, M2);
+
+%% <p>Finally, comments and other line noise are ignored.</p>
+
+execute(_, D, M) -> {D, M}.
+
+%% @spec parse([instruction()]) -> tuple()
+%% @doc Takes a string (list of ASCII values) and butchers
+%% it into a nested tuple data structure, suitable for interpretation.
+%% Writing this function elegantly
+%% was much trickier than writing the imperative processing engine above.
+
+parse(L) -> parse({}, L).  % default is to add to fresh tuple
+
+parse(U, []) -> U;
+parse(U, [$]|T]) -> {U, T};
+parse(U, [$[|T]) ->
+  {V, L} = parse({}, T),
+  parse(erlang:append_element(U, V), L);
+parse(U, [H |T]) ->
+  parse(erlang:append_element(U, H), T).
+
+%% @spec test(Test::integer()) -> {integer(), tuple()}
+%% @doc Test functions, numbered from 1 upwards.  They implement two of the
+%% programs from the original Brainf*ck archive (hello and atoi).
+
+test(1) -> test(hello);
+test(hello) -> interpret("
+>+++++++++[<++++++++>-]<.>+++++++[<++++>-]<+.+++++++..+++.[-]>++++++++[<++++>-]
+<.>+++++++++++[<+++++>-]<.>++++++++[<+++>-]<.+++.------.--------.[-]>++++++++[
+<++++>-]<+.[-]++++++++++."
+);
+
+test(2) -> test(atoi);
+test(atoi) -> interpret("
+==== ==== ====
+cont digi num
+==== ==== ====
+
++
+[
+ -                         cont=0
+ >,
+ ======SUB10======
+ ----------
+ 
+ [                         not 10
+  <+>                      cont=1
+  =====SUB38======
+  ----------
+  ----------
+  ----------
+  --------
+
+  >
+  =====MUL10=======
+  [>+>+<<-]>>[<<+>>-]<     dup
+
+  >>>+++++++++
+  [
+   <<<
+   [>+>+<<-]>>[<<+>>-]<    dup
+   [<<+>>-]
+   >>-
+  ]
+  <<<[-]<
+  ======RMOVE1======
+  <
+  [>+<-]
+ ]
+ <
+]
+>>[<<+>>-]<<
+#"
+).
+
+%%% END of bf.erl %%%
+%%% BEGIN pibfi.erl %%%
+%%%
+%%% pibfi - Platonic Ideal Brainf*ck Interpreter
+%%% Copyright (c)2003 Cat's Eye Technologies.  All rights reserved.
+%%%
+%%% Redistribution and use in source and binary forms, with or without
+%%% modification, are permitted provided that the following conditions