Return Styles: Pseud0ch, Terminal, Valhalla, NES, Geocities, Blue Moon. Entire thread

Homework

Name: 2009-08-18 10:35

Output a thousand Sussmen in an individualistic way.

Name: Anonymous 2009-08-22 7:35

>>106
This calls for my optimizing Brainfuck compiler!

#!/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)

Newer Posts
Don't change these.
Name: Email:
Entire Thread Thread List