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, "]")
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)
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)
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))
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)
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")
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)
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'
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)
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)
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()
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")
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)
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)
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)
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)
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)
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())})
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]
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)
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))
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)
def funge_and(inter): a = u.pop_with_zero(inter) b = u.pop_with_zero(inter) inter.stack.append(int(bool(a and b)))
def funge_not(inter): a = u.pop_with_zero(inter) inter.stack.append(int(not a))
def funge_xor(inter): a = u.pop_with_zero(inter) b = u.pop_with_zero(inter) inter.stack.append(int(bool(a) ^ bool(b)))
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'))
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))
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))
def test_pop_empty_stack(self): self.assertEqual(0, u.pop_with_zero(self.inter))
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))