Name: 2009-08-18 10:35
Output a thousand Sussmen in an individualistic way.
#!/usr/bin/python
CC = "gcc"
tokens = "><+-[].,#"
import sys, os
if sys.stdin.isatty():
sys.stderr.write("Usage: %s < file.bf\n" % sys.argv[0])
sys.exit(1)
t = filter(lambda a: a in tokens, "".join(sys.stdin.readlines()))
c, p, n = ['int main() {', 'unsigned char mem[9999], *p = mem;'], 0, False
while p < len(t):
add = 0
while t[p] == '+' or t[p] == '-':
add += 1 if t[p] == '+' else -1
p += 1
if add == 1:
c.append('++*p;')
elif add == -1:
c.append('--*p;')
elif add < 0:
c.append('*p -= %d;' % (add * -1))
elif add > 0:
c.append('*p += %d;' % add)
add = 0
while t[p] == '>' or t[p] == '<':
add += 1 if t[p] == '>' else -1
p += 1
if add == 1:
c.append('++p;')
elif add == -1:
c.append('--p;')
elif add < 0:
c.append('p -= %d;' % (add * -1))
elif add > 0:
c.append('p += %d;' % add)
if t[p] == '[':
c.append('while (*p) {')
p += 1
elif t[p] == ']':
c.append('}')
p += 1
elif t[p] == '.':
if n:
c.append('printf("%d ", *p);')
else:
c.append('putchar(*p);')
p += 1
elif t[p] == ',':
c.append('*p = getchar();')
p += 1
elif t[p] == '#':
c[0] = "#include <stdio.h>\nint main() {";
n = not n
p =+ 1
c.append('return 0;')
c.append('}')
cfile = os.tempnam() + ".c"
csrc = open(cfile, 'w')
csrc.write("\n".join(c) + "\n")
csrc.close()
args =[CC]
if len(sys.argv) > 1:
args.extend(sys.argv[1:])
args.append(cfile)
os.spawnvpe(os.P_WAIT, CC, args, os.environ)
os.remove(cfile)