| f | import sys | f | import sys |
| import struct | | import struct |
| | | |
| n | def read_fat12_disk_image(image_data): | n | def parse_fat12_disk(img): |
| sector_size = 512 | | SECTOR = 512 |
| root_dir_start = 19 * sector_size | | ROOT_OFFSET = 19 * SECTOR |
| root_dir_entries = [] | | entries_list = [] |
| for i in range(224): | | for idx in range(224): |
| entry_start = root_dir_start + i * 32 | | start_pos = ROOT_OFFSET + idx * 32 |
| entry_data = image_data[entry_start:entry_start + 32] | | entry_bytes = img[start_pos:start_pos + 32] |
| if len(entry_data) < 32: | | if len(entry_bytes) < 32: |
| break | | break |
| n | first_byte = entry_data[0] | n | first_char = entry_bytes[0] |
| if first_byte == 0: | | if first_char == 0: |
| break | | break |
| n | if first_byte == 229: | n | if first_char == 229: |
| continue | | continue |
| n | name_bytes = entry_data[0:8] | n | name_part = entry_bytes[0:8] |
| ext_bytes = entry_data[8:11] | | ext_part = entry_bytes[8:11] |
| attr = entry_data[11] | | attributes = entry_bytes[11] |
| if attr & 8: | | if attributes & 8: |
| continue | | continue |
| n | size = struct.unpack('<I', entry_data[28:32])[0] | n | file_size_val = struct.unpack('<I', entry_bytes[28:32])[0] |
| name = name_bytes.decode('cp866', errors='replace').rstrip() | | |
| ext = ext_bytes.decode('cp866', errors='replace').rstrip() | | name_str = name_part.decode('cp866', errors='ignore').rstrip() |
| | | ext_str = ext_part.decode('cp866', errors='ignore').rstrip() |
| if ext: | | if ext_str: |
| filename = f'{name}.{ext}' | | full_name = f'{name_str}.{ext_str}' |
| else: | | else: |
| n | filename = name | n | full_name = name_str |
| is_directory = attr & 16 != 0 | | is_dir_flag = attributes & 16 != 0 |
| root_dir_entries.append((filename, size, is_directory)) | | entries_list.append((full_name, file_size_val, is_dir_flag)) |
| return root_dir_entries | | return entries_list |
| | | |
| n | def main(): | n | def execute_main(): |
| image_data = sys.stdin.buffer.read() | | input_data = sys.stdin.buffer.read() |
| if len(image_data) != 1474560: | | if len(input_data) != 1474560: |
| return | | return |
| n | entries = read_fat12_disk_image(image_data) | n | disk_entries = parse_fat12_disk(input_data) |
| if not entries: | | if not disk_entries: |
| return | | return |
| n | entries.sort(key=lambda x: x[0].upper()) | n | disk_entries.sort(key=lambda item: item[0].upper()) |
| for filename, size, is_directory in entries: | | for entry_name, entry_size, is_dir in disk_entries: |
| if is_directory: | | if is_dir: |
| print(f'{filename:12} dir') | | print(f'{entry_name:12} dir') |
| else: | | else: |
| n | print(f'{filename:12} {size}') | n | print(f'{entry_name:12} {entry_size}') |
| if __name__ == '__main__': | | if __name__ == '__main__': |
| t | main() | t | execute_main() |