#!/usr/bin/python3
# ===================================================================
# Use the enigma machine encrypt/decrypt a file
#
# Note: for simplicity sake, for this first program
# a. any characters not in the enigma machine simulation's
# alphabet, they will pass thru unchanged to the
# output file.
# b. the exception to rule "a" is that spaces will be
# converted to an 'X'.
# c. all characters in the input file will be converted to
# uppercase before processing.
# ===================================================================
from EnigmaConfig import EnigmaConfig
from EnigmaMachine import EnigmaMachine
import copy
import os
import sys
inputfile = 'xx.txt'
outputfile = 'yy.txt'
configfile = 'enigma_config_26.csv'
# -------------------------------------------------------------------
# ---- encrypt/decrypt character
# -------------------------------------------------------------------
def char_to_idx(c,abc):
for i in range(len(abc)):
if c == abc[i]:
return i
return -1
def convert_char(c,abc,abcunk):
if c == ' ':
c = abcunk
c = c.upper()
if c in em.abc:
idx = char_to_idx(c,abc)
idxx = em.substitution(idx)
##print(f'c={c} idx={idx} idxx={idxx}')
return (True,abc[idxx])
return (False,c)
# -------------------------------------------------------------------
# ---- main
# -------------------------------------------------------------------
# ---- input/out file on command line?
l = len(sys.argv)
if l != 1:
if l == 3:
inputfile = sys.argv[1]
outputfile = sys.argv[2]
else:
print()
print(f'wrong number ({l}) of command line arguments')
print()
sys.exit()
# ---- create an enigma machine object
em = EnigmaMachine(configfile)
# ---- process input/output files
total_chars = 0
line_count = 0
chars_converted = 0
inFile = open(inputfile,'r')
outfile= open(outputfile,'w')
for line in inFile:
line_count += 1
total_chars += len(line)
lst_in = list(line)
lst_out = copy.copy(lst_in)
##print(f'lst_in = {lst_in}')
##print(f'lst_out= {lst_out}')
for i in range(len(lst_in)):
c = lst_in[i]
tf,cc = convert_char(c,em.abc,em.abcunk)
lst_out[i] = cc
if tf:
chars_converted += 1
str_out = ''.join(lst_out)
outfile.write(str_out)
inFile.close()
outfile.close()
# ---- display processing stats
print()
print(f'In file : {inputfile}')
print(f'Out file : {outputfile}')
print(f'lines read : {line_count}')
print(f'total chars : {total_chars}')
print(f'chars converted: {chars_converted}')
print()