コード例 #1
0
ファイル: commands.py プロジェクト: hiba9201/Befunge
def compare_dir(inter):
    b = u.pop_with_zero(inter)
    a = u.pop_with_zero(inter)
    if a < b:
        execute_command(inter, "[")
    elif a > b:
        execute_command(inter, "]")
コード例 #2
0
ファイル: commands.py プロジェクト: hiba9201/Befunge
def sys_info(inter):
    now = dt.datetime.now()
    current_date = (((now.year - 1900) * 256 * 256) + (now.month * 256) +
                    now.day)
    current_time = ((now.hour * 256 * 256) + (now.minute * 256) +
                    now.second)
    size_stack_stack = [len(stack) for stack in inter.stack_stack]
    sys_data = [len(inter.stack_stack), current_time, current_date,
                len(inter.program[-1]), len(inter.program),
                inter.storage_offset, inter.storage_offset,
                inter.delta[0], inter.delta[1], inter.ip[0],
                inter.ip[1], 0, 0, 2, ord(os.sep), 3, 1, 0,
                int((len(f'{sys.maxsize:b}') + 1) / 8), int('01110', 2)]
    environ = [f'{key}={value}' for (key, value) in os.environ.items()]

    num = u.pop_with_zero(inter)
    count = (len(size_stack_stack) + len(sys_data) + len(environ) +
             len(sys.argv[1:]))
    for var in environ:
        u.write_string_to_stack(inter, var)

    for arg in sys.argv[:1]:
        u.write_string_to_stack(inter, arg)

    for size in size_stack_stack:
        inter.stack.append(size)

    for data in sys_data:
        inter.stack.append(data)

    if num > 0:
        chosen_cell = inter.stack[-num]
        for i in range(count):
            u.pop_with_zero(inter)
        inter.stack.append(chosen_cell)
コード例 #3
0
ファイル: commands.py プロジェクト: hiba9201/Befunge
def get(inter):
    try:
        y = u.pop_with_zero(inter)
        x = u.pop_with_zero(inter)
        get_c = ord(inter.program[y][x])
    except IndexError:
        get_c = 0
    inter.stack.append(get_c)
コード例 #4
0
ファイル: STRN.py プロジェクト: hiba9201/Befunge
def get_from_pos(inter):
    y = u.pop_with_zero(inter)
    x = u.pop_with_zero(inter)
    res = []
    cur_char = ''
    while cur_char != '0':
        res.append(cur_char)
        cur_char = inter.program[y][x]
        x += 1
    u.write_string_to_stack(inter, ''.join(res))
コード例 #5
0
def seek_file(inter):
    pos = u.pop_with_zero(inter)
    m = u.pop_with_zero(inter)
    file_num = u.pop_with_zero(inter)

    try:
        inter.files[file_num]['file'].seek(pos, m)
        inter.stack.append(file_num)
    except Exception:
        inter.delta = u.multiply_delta(inter, -1)
コード例 #6
0
ファイル: commands.py プロジェクト: hiba9201/Befunge
def input_file(inter):
    filename = u.collect_string_from_stack(inter)
    y = u.pop_with_zero(inter)
    x = u.pop_with_zero(inter)
    try:
        with open(filename, "r") as f:
            last_x, last_y = u.write_file_to_program(inter, f, x, y)
            inter.stack.append(last_x)
            inter.stack.append(last_y)

    except OSError:
        execute_command(inter, "r")
コード例 #7
0
ファイル: commands.py プロジェクト: hiba9201/Befunge
def put(inter):
    y = u.pop_with_zero(inter)
    x = u.pop_with_zero(inter)
    n = u.pop_with_zero(inter)
    while len(inter.program) < y + 1:
        inter.program.append([" "] * len(inter.program[0]))
    if len(inter.program[y]) < x + 1:
        inter.program[y][len(inter.program[y]):x + 1] = ([" "] *
                                                         (x + 1 -
                                                          len(inter.program[y])
                                                          ))
    inter.program[y][x] = chr(n)
コード例 #8
0
ファイル: STRN.py プロジェクト: hiba9201/Befunge
def put_to_pos(inter):
    y = u.pop_with_zero(inter)
    x = u.pop_with_zero(inter)
    string = u.collect_string_from_stack(inter)

    while len(inter.program) <= y:
        inter.program.append([' '] * u.get_max_len(inter.program))

    for letter in string:
        inter.program[y][x] = letter
        x += 1
    inter.program[y][x] = '0'
コード例 #9
0
def read_file(inter):
    count = u.pop_with_zero(inter)
    file_num = u.pop_with_zero(inter)

    try:
        string = inter.files[file_num]['file'].read(count)
        _, y = inter.files[file_num]['buffer_start']
        x = inter.files[file_num]['buffer_end']
        u.write_line_to_space(inter, string, x, y, strip=False)
        inter.files[file_num]['buffer_end'] = len(string)
        inter.stack.append(file_num)
        for line in inter.program:
            print(''.join(line))
    except Exception:
        inter.delta = u.multiply_delta(inter, -1)
コード例 #10
0
ファイル: commands.py プロジェクト: hiba9201/Befunge
def stack_under_stack(inter):
    if len(inter.stack_stack) == 1:
        execute_command(inter, "r")
        return

    count = u.pop_with_zero(inter)
    if count > 0:
        for _ in range(count):
            item = 0 if len(inter.stack_stack[-2]
                            ) == 0 else inter.stack_stack[-2].pop()
            inter.stack.append(item)
    else:
        for _ in range(-count):
            item = u.pop_with_zero(inter)
            inter.stack_stack[-2].append(item)
コード例 #11
0
def close_file(inter):
    file_num = u.pop_with_zero(inter)
    if not (len(inter.files) > file_num >= 0):
        inter.delta = u.multiply_delta(inter, -1)
        return

    file = inter.files.pop(file_num)
    file['file'].close()
コード例 #12
0
ファイル: commands.py プロジェクト: hiba9201/Befunge
def output_file(inter):
    filename = u.collect_string_from_stack(inter)
    f_y = u.pop_with_zero(inter)
    f_x = u.pop_with_zero(inter)

    s_y = u.pop_with_zero(inter)
    s_x = u.pop_with_zero(inter)

    lines_len = s_x - f_x

    try:
        with open(filename, "w") as f:
            for y in range(f_y, s_y + 1):
                f.write(u.get_line_from_space(inter, f_x, y,
                                              lines_len))
    except OSError:
        execute_command(inter, "r")
コード例 #13
0
def write_file(inter):
    count = u.pop_with_zero(inter)
    file_num = u.pop_with_zero(inter)

    if file_num >= len(inter.files) or file_num < 0:
        inter.delta = u.multiply_delta(inter, -1)
        return

    x, y = inter.files[file_num]['buffer_start']
    line_len = max(count, inter.files[file_num]['buffer_end'] - x)

    string = u.get_line_from_space(inter, x, y, line_len)
    try:
        inter.files[file_num]['file'].write(string)
        inter.files[file_num]['buffer_start'][0] = x + line_len
    except Exception:
        u.write_line_to_space(inter, string, x, y)
        inter.delta = u.multiply_delta(inter, -1)
コード例 #14
0
def read_line(inter):
    file_num = u.pop_with_zero(inter)

    try:
        line = inter.files[file_num]['file'].readline()
        inter.stack.append(file_num)
        u.write_string_to_stack(inter, line)
    except Exception:
        inter.delta = u.multiply_delta(inter, -1)
コード例 #15
0
def print_line(inter):
    file_num = u.pop_with_zero(inter)
    line = u.collect_string_from_stack(inter)

    try:
        inter.files[file_num]['file'].write(f'{line}\n')
        inter.stack.append(file_num)
    except Exception:
        inter.delta = u.multiply_delta(inter, -1)
コード例 #16
0
def get_location(inter):
    file_num = u.pop_with_zero(inter)

    try:
        pos = inter.files[file_num]['file'].tell()
        inter.stack.append(file_num)
        inter.stack.append(pos)
    except Exception:
        inter.delta = u.multiply_delta(inter, -1)
コード例 #17
0
def open_file(inter):
    filename = u.collect_string_from_stack(inter)
    m = u.pop_with_zero(inter)
    y = u.pop_with_zero(inter)
    x = u.pop_with_zero(inter)

    try:
        mode = open_file_mode[m]
    except IndexError:
        inter.delta = u.multiply_delta(inter, -1)
        return

    try:
        opened_file = open(filename, mode, encoding='utf-8')
        inter.files.append({'file': opened_file,
                            'buffer_start': [x, y],
                            'buffer_end': x})
        inter.stack.append(len(inter.files) - 1)
    except OSError:
        inter.delta = u.multiply_delta(inter, -1)
コード例 #18
0
ファイル: commands.py プロジェクト: hiba9201/Befunge
def load_fp(inter):
    count = u.pop_with_zero(inter)
    semantics_arr = []
    for i in range(count):
        semantics_arr.append(chr(u.pop_with_zero(inter)))

    semantics = ''.join(semantics_arr)

    project_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)),
                               os.path.pardir)

    try:
        fp = il.import_module(f'fingerprints.{semantics}', project_dir)
        for letter in reversed(semantics):
            inter.stack.append(ord(letter))
        inter.stack.append(len(semantics))
    except ModuleNotFoundError:
        execute_command(inter, 'r')
        return

    commands.commands.update(fp.commands.commands)
    inter.imported_fps.append({'semantics': semantics,
                               'commands': list(fp.commands.commands.keys())})
コード例 #19
0
ファイル: commands.py プロジェクト: hiba9201/Befunge
def end_block(inter):
    if len(inter.stack_stack) == 1:
        execute_command(inter, "r")
        return
    n = int(u.pop_with_zero(inter))
    toss = inter.stack_stack.pop()

    inter.stack = inter.stack_stack[-1]

    y = u.pop_with_zero(inter)
    x = u.pop_with_zero(inter)

    inter.storage_offset = (x, y)

    if n <= 0:
        for _ in range(min(-n, len(inter.stack))):
            inter.stack.pop()
    else:
        new_stack = [0] * (n - len(toss) + 1)
        new_stack[-1:] = toss[-min(n, len(toss)):]
        inter.stack[len(inter.stack):] = new_stack

    inter.stack = inter.stack_stack[-1]
コード例 #20
0
ファイル: commands.py プロジェクト: hiba9201/Befunge
def unload_fp(inter):
    count = u.pop_with_zero(inter)
    semantics = ""
    for i in range(count):
        semantics += chr(u.pop_with_zero(inter))

    fp_to_unload = list(filter(lambda fp: fp['semantics'] == semantics,
                               inter.imported_fps))

    if not fp_to_unload:
        return

    unload_commands = fp_to_unload[0]['commands']
    del inter.imported_fps[inter.imported_fps.index(fp_to_unload[0])]

    for command in unload_commands:
        del commands.commands[command]

    if len(inter.imported_fps) > 0:
        last_semantics = inter.imported_fps[-1]['semantics']
        fprint = il.import_module(f'fingerprints.{last_semantics}',
                                  os.getcwd())
        commands.commands.update(fprint.commands.commands)
コード例 #21
0
ファイル: commands.py プロジェクト: hiba9201/Befunge
def start_block(inter):
    n = int(u.pop_with_zero(inter))
    if n <= 0:
        inter.stack_stack.append([] * (-n))
    else:
        new_stack = [0] * (n - len(inter.stack) + 1)
        new_stack[-1:] = inter.stack[-min(n, len(inter.stack)):]
        inter.stack_stack.append(new_stack)
    inter.stack.append(inter.storage_offset[0])
    inter.stack.append(inter.storage_offset[1])

    inter.stack = inter.stack_stack[-1]
    inter.storage_offset = (
        (inter.ip[0] + inter.delta[0]) % len(inter.program[0]),
        (inter.ip[1] + inter.delta[1]) % len(inter.program))
コード例 #22
0
def from_base(inter):
    if not inter.input_mode:
        inter.input_mode = True
        return
    inter.input_mode = False
    base = u.pop_with_zero(inter)

    num = ''
    read = inter.io.get()
    while not read.isdigit():
        read = inter.io.get()
    while read.isdigit():
        num += read
        read = inter.io.get()

    res = int(to_base_n(int(num), base))
    inter.stack.append(res)
コード例 #23
0
def funge_and(inter):
    a = u.pop_with_zero(inter)
    b = u.pop_with_zero(inter)
    inter.stack.append(int(bool(a and b)))
コード例 #24
0
def funge_not(inter):
    a = u.pop_with_zero(inter)
    inter.stack.append(int(not a))
コード例 #25
0
def funge_xor(inter):
    a = u.pop_with_zero(inter)
    b = u.pop_with_zero(inter)
    inter.stack.append(int(bool(a) ^ bool(b)))
コード例 #26
0
ファイル: test_interpreter.py プロジェクト: hiba9201/Befunge
 def test_get(self):
     self.inter.stack.append(1)
     self.inter.stack.append(0)
     cmds.execute_command(self.inter, 'g')
     self.assertEqual(u.pop_with_zero(self.inter), ord('h'))
コード例 #27
0
ファイル: test_interpreter.py プロジェクト: hiba9201/Befunge
 def test_read_symb(self):
     self.inp.write("k")
     self.inp.seek(0)
     cmds.execute_command(self.inter, "~")
     cmds.execute_command(self.inter, "~")
     self.assertEqual(ord('k'), u.pop_with_zero(self.inter))
コード例 #28
0
ファイル: test_interpreter.py プロジェクト: hiba9201/Befunge
 def test_execute_failure(self):
     u.write_string_to_stack(self.inter, 'eco')
     cmds.execute_command(self.inter, "=")
     self.assertNotEqual(0, u.pop_with_zero(self.inter))
コード例 #29
0
ファイル: test_interpreter.py プロジェクト: hiba9201/Befunge
 def test_pop_empty_stack(self):
     self.assertEqual(0, u.pop_with_zero(self.inter))
コード例 #30
0
ファイル: test_interpreter.py プロジェクト: hiba9201/Befunge
 def test_pop(self):
     self.inter._push_digit("3")
     self.assertEqual(3, u.pop_with_zero(self.inter))
     self.inter._push_digit("3")
     cmds.execute_command(self.inter, "$")
     self.assertEqual(0, len(self.inter.stack))