#!/usr/bin/python3 # =================================================================== # Enigma Machine Simulation - read configuration file # =================================================================== import re import os import sys import user_interface as ui abc = [] abclen = 0 abcunk = None configfile = 'enigma_config.csv' date = None line_count = 0 plugs = [] reflst = [] rotors = { 'I':[], 'II':[], 'III':[], 'IV':[], 'V':[], 'VI':[], 'VII':[], 'VIII':[] } # ------------------------------------------------------------------- # ---- read enigma machine configuration file # ------------------------------------------------------------------- def EnigmaReadConfigiFile(filename): global abc global abclen global abcunk global date global line_count global plugs global reflst global rotors infile = open(filename,'r') for line in infile: line_count += 1 line = line.strip() if not line: # empty string (line) continue if re.match('^#',line): # comment? continue x = line.split(',') # --- date file created if x[0] =='date': date = x[1] continue # --- alphabet length? if x[0] == 'len': # length tf,i = ui.is_int(x[1]) if tf: if i >= 0: abclen = i continue # --- unknown character? if x[0] == 'unk': # unknown character abcunk = x[1] continue # --- alphabet? if x[0] == 'abc': # alphabet abc.append(x[2]) continue # --- plug? if x[0] == 'plug': # plugboard plugs.append(x[1]) continue # ---- reflector? if x[0] == 'ref': # reflector reflst.append(int(x[1])) continue # ---- rotor? if x[0] in rotors.keys(): # rotor rotors[x[0]].append(x[2]) continue # ---- what? print() print(f'unknow line in config file (line={line_count})\n({line})') sys.exit() infile.close() # ------------------------------------------------------------------- # ---- main # ------------------------------------------------------------------- # ---- configuration file on command line? if len(sys.argv) > 1: configfile = sys.argv[1] if not os.path.exists(configfile): print() print(f'Can not find enigma configuration file ({configfile})') print() sys.exit() # ---- read config file EnigmaReadConfigiFile(configfile) # ---- now set abcidx abcidx = list(range(abclen)) # ---- verify config file data for r in rotors: if len(rotors[r]) != abclen: print() print('bad rotor list length (r)') sys.exit() if len(abc) != abclen: print() print('bad abc list length\n(alphabet)') sys.exit() if len(reflst) != abclen: print() print('bad reflector list length\n(reflector)') sys.exit() for i in range(abclen): j = reflst[i] if reflst[j] != i: print(f'error in reflector pair i={i} j={j}') sys.exit() # ---- print stats print() print(f'input file: {configfile}') print(f'date : {date}') print(f'alphabet len: {len(abc)}') print(f' abclen : {abclen}') print(f' abcunk : {abcunk}') print(f'rotor count: {len(rotors)}') for r in rotors.keys(): print(f' {r:5} len: {len(rotors[r])}') print(f'reflector len: {len(reflst)}') print(f'plugs : {len(plugs)}') print(f'lines read : {line_count}') print()