read_enigma_config_file.py

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