From d7689a8562d5e77b3728aff6fa723d46102738a5 Mon Sep 17 00:00:00 2001 From: ayushagrawal24 Date: Fri, 10 Jul 2020 23:35:13 +0530 Subject: [PATCH 1/8] Create .gitignore --- .gitignore | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e502c69 --- /dev/null +++ b/.gitignore @@ -0,0 +1,35 @@ +# Prerequisites +*.d + +# Compiled Object files +*.slo +*.lo +*.o +*.obj + +# Precompiled Headers +*.gch +*.pch + +# Compiled Dynamic libraries +*.so +*.dylib +*.dll + +# Fortran module files +*.mod +*.smod + +# Compiled Static libraries +*.lai +*.la +*.a +*.lib + +# Executables +*.exe +*.out +*.app + +# XCode project +*.xcodeproj From c89022245e480bde6ee3aba5b4de3c51d7f979b1 Mon Sep 17 00:00:00 2001 From: Ayush Agrawal Date: Sat, 11 Jul 2020 04:23:14 +0530 Subject: [PATCH 2/8] Working encoder --- .DS_Store | Bin 0 -> 6148 bytes EnigmaMachine/.DS_Store | Bin 0 -> 6148 bytes .../EnigmaMachine.xcodeproj/project.pbxproj | 312 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../UserInterfaceState.xcuserstate | Bin 0 -> 47207 bytes .../xcschemes/xcschememanagement.plist | 14 + EnigmaMachine/EnigmaMachine/EnigmaMachine.cpp | 35 ++ EnigmaMachine/EnigmaMachine/EnigmaMachine.hpp | 21 ++ EnigmaMachine/EnigmaMachine/Rotor.cpp | 68 ++++ EnigmaMachine/EnigmaMachine/Rotor.hpp | 29 ++ EnigmaMachine/EnigmaMachine/RotorSet.cpp | 41 +++ EnigmaMachine/EnigmaMachine/RotorSet.hpp | 26 ++ EnigmaMachine/EnigmaMachine/Utils/config.h | 42 +++ EnigmaMachine/EnigmaMachine/Utils/utils.hpp | 32 ++ EnigmaMachine/EnigmaMachine/main.cpp | 19 ++ 16 files changed, 654 insertions(+) create mode 100644 .DS_Store create mode 100644 EnigmaMachine/.DS_Store create mode 100644 EnigmaMachine/EnigmaMachine.xcodeproj/project.pbxproj create mode 100644 EnigmaMachine/EnigmaMachine.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 EnigmaMachine/EnigmaMachine.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 EnigmaMachine/EnigmaMachine.xcodeproj/project.xcworkspace/xcuserdata/ayushagrawal.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 EnigmaMachine/EnigmaMachine.xcodeproj/xcuserdata/ayushagrawal.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 EnigmaMachine/EnigmaMachine/EnigmaMachine.cpp create mode 100644 EnigmaMachine/EnigmaMachine/EnigmaMachine.hpp create mode 100644 EnigmaMachine/EnigmaMachine/Rotor.cpp create mode 100644 EnigmaMachine/EnigmaMachine/Rotor.hpp create mode 100644 EnigmaMachine/EnigmaMachine/RotorSet.cpp create mode 100644 EnigmaMachine/EnigmaMachine/RotorSet.hpp create mode 100644 EnigmaMachine/EnigmaMachine/Utils/config.h create mode 100644 EnigmaMachine/EnigmaMachine/Utils/utils.hpp create mode 100644 EnigmaMachine/EnigmaMachine/main.cpp diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..bca3b186422bad3d581261070390cf1b53faf320 GIT binary patch literal 6148 zcmeHKO-lno41Li(R7B{}+$-p zFvE_6Yi#j=JL&?@?C-ET4!gkWC~VGv?Kkcx`u`Y7r~2`7UCBT)kPIXPKVpDqwq$ha zm~AqU3?u`e3}}BSRAC#~Io7R%O)UY4x<*%_ty)4kC9n-?Ybml-Vb`zhH=29kk)#(*`` z`E*=g5)O)H#ah(hb?cODT9ql96)#?5sn{jPm=crjUUek$r5vYV@lMMU< F1Mi7mD7ydv literal 0 HcmV?d00001 diff --git a/EnigmaMachine/.DS_Store b/EnigmaMachine/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..9fa36f4de111691834bb18c625dd593f6456e24e GIT binary patch literal 6148 zcmeHK!Ab)`41Lia3L^BT$N2)Gf3TGH=*9kkx?9@Hw!0{T$N5ix#+PI&71x6ZB9g%5 zWiy%V&MTcv0LbjQnF134V-7`8V?fkBICWBjPl;kVcDTbeM~%%uqQB_UZ$HNZdu*}B z@%L}(TQyI0d*5{}w}*?b!*GQcZn{H*6?#0$1-}URw_cQdHqYR=yQAjWl z3~Fs>GxYVpT9Z z(nAqnO7x{tS`6{!^rsS670iyl98#JODQ`YBFNbTgBnyXBj-i8rVBjMI+WS%_TK^aP zOAa>q77{8L2nPNu12UQ~=QHlE)Yeb?)LNT3ZaGvmE~`PIZKarKrI-(Tj$GQL&nLAx YUlq)bnnnG#oER4YBP3KX@CyvQ0W(N0ga7~l literal 0 HcmV?d00001 diff --git a/EnigmaMachine/EnigmaMachine.xcodeproj/project.pbxproj b/EnigmaMachine/EnigmaMachine.xcodeproj/project.pbxproj new file mode 100644 index 0000000..8fc6ce1 --- /dev/null +++ b/EnigmaMachine/EnigmaMachine.xcodeproj/project.pbxproj @@ -0,0 +1,312 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 64FDE08A24B8E42F003D1B0D /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 64FDE08924B8E42F003D1B0D /* main.cpp */; }; + 64FDE09224B8E48E003D1B0D /* EnigmaMachine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 64FDE09024B8E48E003D1B0D /* EnigmaMachine.cpp */; }; + 64FDE09924B8F57E003D1B0D /* RotorSet.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 64FDE09724B8F57E003D1B0D /* RotorSet.cpp */; }; + 64FDE0A424B925CF003D1B0D /* Rotor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 64FDE0A224B925CF003D1B0D /* Rotor.cpp */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 64FDE08424B8E42F003D1B0D /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 64FDE08624B8E42F003D1B0D /* EnigmaMachine */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = EnigmaMachine; sourceTree = BUILT_PRODUCTS_DIR; }; + 64FDE08924B8E42F003D1B0D /* main.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = ""; }; + 64FDE09024B8E48E003D1B0D /* EnigmaMachine.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = EnigmaMachine.cpp; sourceTree = ""; }; + 64FDE09124B8E48E003D1B0D /* EnigmaMachine.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = EnigmaMachine.hpp; sourceTree = ""; }; + 64FDE09724B8F57E003D1B0D /* RotorSet.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = RotorSet.cpp; sourceTree = ""; }; + 64FDE09824B8F57E003D1B0D /* RotorSet.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = RotorSet.hpp; sourceTree = ""; }; + 64FDE0A224B925CF003D1B0D /* Rotor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Rotor.cpp; sourceTree = ""; }; + 64FDE0A324B925CF003D1B0D /* Rotor.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = Rotor.hpp; sourceTree = ""; }; + 64FDE0A624B926DC003D1B0D /* config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = config.h; sourceTree = ""; }; + 64FDE0A724B926DC003D1B0D /* utils.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = utils.hpp; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 64FDE08324B8E42F003D1B0D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 64FDE07D24B8E42F003D1B0D = { + isa = PBXGroup; + children = ( + 64FDE08824B8E42F003D1B0D /* EnigmaMachine */, + 64FDE08724B8E42F003D1B0D /* Products */, + ); + sourceTree = ""; + }; + 64FDE08724B8E42F003D1B0D /* Products */ = { + isa = PBXGroup; + children = ( + 64FDE08624B8E42F003D1B0D /* EnigmaMachine */, + ); + name = Products; + sourceTree = ""; + }; + 64FDE08824B8E42F003D1B0D /* EnigmaMachine */ = { + isa = PBXGroup; + children = ( + 64FDE0A524B926DC003D1B0D /* Utils */, + 64FDE0A224B925CF003D1B0D /* Rotor.cpp */, + 64FDE0A324B925CF003D1B0D /* Rotor.hpp */, + 64FDE08924B8E42F003D1B0D /* main.cpp */, + 64FDE09024B8E48E003D1B0D /* EnigmaMachine.cpp */, + 64FDE09124B8E48E003D1B0D /* EnigmaMachine.hpp */, + 64FDE09724B8F57E003D1B0D /* RotorSet.cpp */, + 64FDE09824B8F57E003D1B0D /* RotorSet.hpp */, + ); + path = EnigmaMachine; + sourceTree = ""; + }; + 64FDE0A524B926DC003D1B0D /* Utils */ = { + isa = PBXGroup; + children = ( + 64FDE0A624B926DC003D1B0D /* config.h */, + 64FDE0A724B926DC003D1B0D /* utils.hpp */, + ); + path = Utils; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 64FDE08524B8E42F003D1B0D /* EnigmaMachine */ = { + isa = PBXNativeTarget; + buildConfigurationList = 64FDE08D24B8E42F003D1B0D /* Build configuration list for PBXNativeTarget "EnigmaMachine" */; + buildPhases = ( + 64FDE08224B8E42F003D1B0D /* Sources */, + 64FDE08324B8E42F003D1B0D /* Frameworks */, + 64FDE08424B8E42F003D1B0D /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = EnigmaMachine; + productName = EnigmaMachine; + productReference = 64FDE08624B8E42F003D1B0D /* EnigmaMachine */; + productType = "com.apple.product-type.tool"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 64FDE07E24B8E42F003D1B0D /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1130; + ORGANIZATIONNAME = "Ayush Agrawal"; + TargetAttributes = { + 64FDE08524B8E42F003D1B0D = { + CreatedOnToolsVersion = 11.3; + }; + }; + }; + buildConfigurationList = 64FDE08124B8E42F003D1B0D /* Build configuration list for PBXProject "EnigmaMachine" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 64FDE07D24B8E42F003D1B0D; + productRefGroup = 64FDE08724B8E42F003D1B0D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 64FDE08524B8E42F003D1B0D /* EnigmaMachine */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 64FDE08224B8E42F003D1B0D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 64FDE0A424B925CF003D1B0D /* Rotor.cpp in Sources */, + 64FDE09224B8E48E003D1B0D /* EnigmaMachine.cpp in Sources */, + 64FDE08A24B8E42F003D1B0D /* main.cpp in Sources */, + 64FDE09924B8F57E003D1B0D /* RotorSet.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 64FDE08B24B8E42F003D1B0D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.15; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + }; + name = Debug; + }; + 64FDE08C24B8E42F003D1B0D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.15; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = macosx; + }; + name = Release; + }; + 64FDE08E24B8E42F003D1B0D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 562SMMQ9U5; + ENABLE_HARDENED_RUNTIME = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 64FDE08F24B8E42F003D1B0D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 562SMMQ9U5; + ENABLE_HARDENED_RUNTIME = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 64FDE08124B8E42F003D1B0D /* Build configuration list for PBXProject "EnigmaMachine" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 64FDE08B24B8E42F003D1B0D /* Debug */, + 64FDE08C24B8E42F003D1B0D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 64FDE08D24B8E42F003D1B0D /* Build configuration list for PBXNativeTarget "EnigmaMachine" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 64FDE08E24B8E42F003D1B0D /* Debug */, + 64FDE08F24B8E42F003D1B0D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 64FDE07E24B8E42F003D1B0D /* Project object */; +} diff --git a/EnigmaMachine/EnigmaMachine.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/EnigmaMachine/EnigmaMachine.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..94ff194 --- /dev/null +++ b/EnigmaMachine/EnigmaMachine.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/EnigmaMachine/EnigmaMachine.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/EnigmaMachine/EnigmaMachine.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/EnigmaMachine/EnigmaMachine.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/EnigmaMachine/EnigmaMachine.xcodeproj/project.xcworkspace/xcuserdata/ayushagrawal.xcuserdatad/UserInterfaceState.xcuserstate b/EnigmaMachine/EnigmaMachine.xcodeproj/project.xcworkspace/xcuserdata/ayushagrawal.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..655876cb29899f1029e672ddfe7259128f5ec779 GIT binary patch literal 47207 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 aEwOKj?f;HEssH=-yYv6&o&SB8IR6Lln_Bw- literal 0 HcmV?d00001 diff --git a/EnigmaMachine/EnigmaMachine.xcodeproj/xcuserdata/ayushagrawal.xcuserdatad/xcschemes/xcschememanagement.plist b/EnigmaMachine/EnigmaMachine.xcodeproj/xcuserdata/ayushagrawal.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..f43f716 --- /dev/null +++ b/EnigmaMachine/EnigmaMachine.xcodeproj/xcuserdata/ayushagrawal.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + EnigmaMachine.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/EnigmaMachine/EnigmaMachine/EnigmaMachine.cpp b/EnigmaMachine/EnigmaMachine/EnigmaMachine.cpp new file mode 100644 index 0000000..0246819 --- /dev/null +++ b/EnigmaMachine/EnigmaMachine/EnigmaMachine.cpp @@ -0,0 +1,35 @@ +// +// Enigma.cpp +// EnigmaMachine +// +// Created by Ayush Agrawal on 10/07/20. +// Copyright © 2020 Ayush Agrawal. All rights reserved. +// + +#include "EnigmaMachine.hpp" +#include "Utils/utils.hpp" + +EnigmaMachine::EnigmaMachine(int rot_nos[NO_OF_ROTORS]): _rotorSet(rot_nos) { + for (int i = 0; i < 26; i++){ + _intCharMap.push_back('A' + i); + } +} + + +std::string EnigmaMachine::encode(std::string inputStr){ + std::string inpCopy = custom_utils::removeSpace(inputStr); + + inpCopy = custom_utils::toUppercase(inpCopy); + + std::string outputStr; + for (int i = 0; i < inpCopy.size(); i++){ + char charIn = (char) inpCopy[i]; + int intIn = _intCharMap.find( charIn ); + int intOut = _rotorSet.parseValue( intIn ); + char charOut = _intCharMap[intOut]; + + outputStr.push_back(charOut); + } + + return outputStr; +} diff --git a/EnigmaMachine/EnigmaMachine/EnigmaMachine.hpp b/EnigmaMachine/EnigmaMachine/EnigmaMachine.hpp new file mode 100644 index 0000000..cc994e8 --- /dev/null +++ b/EnigmaMachine/EnigmaMachine/EnigmaMachine.hpp @@ -0,0 +1,21 @@ +// +// Enigma.hpp +// EnigmaMachine +// +// Created by Ayush Agrawal on 10/07/20. +// Copyright © 2020 Ayush Agrawal. All rights reserved. +// + +#pragma once +#include "RotorSet.hpp" +#include +#include + +class EnigmaMachine { + RotorSet _rotorSet; + std::string _intCharMap; + +public: + EnigmaMachine(int rot_nos[NO_OF_ROTORS]); + std::string encode(std::string input); +}; diff --git a/EnigmaMachine/EnigmaMachine/Rotor.cpp b/EnigmaMachine/EnigmaMachine/Rotor.cpp new file mode 100644 index 0000000..7e393ae --- /dev/null +++ b/EnigmaMachine/EnigmaMachine/Rotor.cpp @@ -0,0 +1,68 @@ +// +// Rotors.cpp +// EnigmaMachine +// +// Created by Ayush Agrawal on 10/07/20. +// Copyright © 2020 Ayush Agrawal. All rights reserved. +// +// Rotor::runThrough adapted from Code_Bullet's code at https://github.com/Code-Bullet/Enigma-Simulator/blob/master/enigmaSim/Rotor.pde + +#include "Rotor.hpp" + +Rotor::Rotor(int rotorNumber, int rotorPosition) { + _rotorNo = rotorNumber; + _rotorPos = rotorPosition; + _offset = 0; + + setWiring(_rotorNo); +} + +void Rotor::setWiring(int no){ + switch(no) { + case ROTOR_1: + custom_utils::copyArr2D(_wiring, wiring_rotor1); + break; + case ROTOR_2: + custom_utils::copyArr2D(_wiring, wiring_rotor2); + break; + case ROTOR_3: + custom_utils::copyArr2D(_wiring, wiring_rotor3); + break; + case ROTOR_4: + custom_utils::copyArr2D(_wiring, wiring_rotor4); + break; + case ROTOR_5: + custom_utils::copyArr2D(_wiring, wiring_rotor5); + break; + case REFLECTOR: + custom_utils::copyArr2D(_wiring, wiring_reflector); + } +} + +int Rotor::runThrough(int input, bool forward){ + if (forward) { + input = (input + _offset) % 26; + + return _wiring[input][1]; + } else { + for (int i = 0; i< 26; i++) { + if (input == _wiring[i][1]) { + int output = ( _wiring[i][0]- _offset ) % 26; + + if (output < 0){ + output = 26 + output; + } + return output; + } + } + } + return -1; +} + +void Rotor::rotate(){ + _offset = (_offset + 1) % 26; +} + +int Rotor::position(){ + return _rotorPos; +} diff --git a/EnigmaMachine/EnigmaMachine/Rotor.hpp b/EnigmaMachine/EnigmaMachine/Rotor.hpp new file mode 100644 index 0000000..b6bfea3 --- /dev/null +++ b/EnigmaMachine/EnigmaMachine/Rotor.hpp @@ -0,0 +1,29 @@ +// +// Rotors.cpp +// EnigmaMachine +// +// Created by Ayush Agrawal on 10/07/20. +// Copyright © 2020 Ayush Agrawal. All rights reserved. +// + +#pragma once + +#include "Utils/config.h" +#include "Utils/utils.hpp" + +class Rotor { +private: + int _offset; + int _rotorNo; + int _rotorPos; + int _wiring[26][2]; + + void setWiring(int no); + +public: + Rotor(){ }; + Rotor(int rotorNumber, int rotorPosition); + int runThrough(int input, bool forward = true); + void rotate(); + int position(); +}; diff --git a/EnigmaMachine/EnigmaMachine/RotorSet.cpp b/EnigmaMachine/EnigmaMachine/RotorSet.cpp new file mode 100644 index 0000000..2fb1067 --- /dev/null +++ b/EnigmaMachine/EnigmaMachine/RotorSet.cpp @@ -0,0 +1,41 @@ +// +// RotorSet.cpp +// EnigmaMachine +// +// Created by Ayush Agrawal on 11/07/20. +// Copyright © 2020 Ayush Agrawal. All rights reserved. +// + +#include "RotorSet.hpp" + +RotorSet::RotorSet(int rot_nos[NO_OF_ROTORS]) { + for (int i = 0; i < NO_OF_ROTORS; i++){ + _rotors[i] = Rotor(rot_nos[i], i+1); + } + _reflector = Rotor(REFLECTOR, 4); + + _rotationNo = 0; +} + + +int RotorSet::parseValue(int input){ + int value = input; + + for (int i = 0; i < NO_OF_ROTORS; i++){ + value = _rotors[i].runThrough(value); + } + value = _reflector.runThrough(value); + for (int i = NO_OF_ROTORS - 1; i >= 0; i--){ + value = _rotors[i].runThrough(value, false); + } + + _rotationNo++; + + for (int i = 0; i < NO_OF_ROTORS; i++){ + if (_rotationNo % (int)pow(26,i)){ + _rotors[i].rotate(); + } + } + + return value; +} diff --git a/EnigmaMachine/EnigmaMachine/RotorSet.hpp b/EnigmaMachine/EnigmaMachine/RotorSet.hpp new file mode 100644 index 0000000..845c672 --- /dev/null +++ b/EnigmaMachine/EnigmaMachine/RotorSet.hpp @@ -0,0 +1,26 @@ +// +// RotorSet.hpp +// EnigmaMachine +// +// Created by Ayush Agrawal on 11/07/20. +// Copyright © 2020 Ayush Agrawal. All rights reserved. +// + +#pragma once + +#include "Rotor.hpp" +#include + +#define NO_OF_ROTORS 3 + +class RotorSet { +private: + Rotor _rotors[NO_OF_ROTORS]; + Rotor _reflector; + + long int _rotationNo; + +public: + RotorSet(int rot_nos[NO_OF_ROTORS]); + int parseValue(int input); +}; diff --git a/EnigmaMachine/EnigmaMachine/Utils/config.h b/EnigmaMachine/EnigmaMachine/Utils/config.h new file mode 100644 index 0000000..8e13520 --- /dev/null +++ b/EnigmaMachine/EnigmaMachine/Utils/config.h @@ -0,0 +1,42 @@ +// +// config.h +// EnigmaMachine +// +// Created by Ayush Agrawal on 10/07/20. +// Copyright © 2020 Ayush Agrawal. All rights reserved. +// + +#pragma once + +//Rotor names +#define ROTOR_1 1 +#define ROTOR_2 2 +#define ROTOR_3 3 +#define ROTOR_4 4 +#define ROTOR_5 5 +#define REFLECTOR 6 + +//Rotor Wirings +const int wiring_rotor1[][2] = { {0, 15}, {1, 4}, {2, 25}, {3, 20}, {4, 14}, {5, 7}, {6, 23}, {7, 18}, {8, 2}, + {9, 21}, {10, 5}, {11, 12}, {12, 19}, {13, 1}, {14, 6}, {15, 11}, {16, 17}, {17, 8}, + {18, 13}, {19, 16}, {20, 9}, {21, 22}, {22, 0}, {23, 24}, {24, 3}, {25, 10} }; + +const int wiring_rotor2[][2] = { {0, 25}, {1, 14}, {2, 20}, {3, 4}, {4, 18}, {5, 24}, {6, 3}, {7, 10}, {8, 5}, + {9, 22}, {10, 15}, {11, 2}, {12, 8}, {13, 16}, {14, 23}, {15, 7}, {16, 12}, {17, 21}, + {18, 1}, {19, 11}, {20, 6}, {21, 13}, {22, 9}, {23, 17}, {24, 0}, {25, 19} }; + +const int wiring_rotor3[][2] = { {0, 4}, {1, 7}, {2, 17}, {3, 21}, {4, 23}, {5, 6}, {6, 0}, {7, 14}, {8, 1}, + {9, 16}, {10, 20}, {11, 18}, {12, 8}, {13, 12}, {14, 25}, {15, 5}, {16, 11}, {17, 24}, + {18, 13}, {19, 22}, {20, 10}, {21, 19}, {22, 15}, {23, 3}, {24, 9}, {25, 2} }; + +const int wiring_rotor4[][2] = { {0, 8}, {1, 12}, {2, 4}, {3, 19}, {4, 2}, {5, 6}, {6, 5}, {7, 17}, {8, 0}, + {9, 24}, {10, 18}, {11, 16}, {12, 1}, {13, 25}, {14, 23}, {15, 22}, {16, 11}, {17, 7}, + {18, 10}, {19, 3}, {20, 21}, {21, 20}, {22, 15}, {23, 14}, {24, 9}, {25, 13} }; + +const int wiring_rotor5[][2] = { {0, 16}, {1, 22}, {2, 4}, {3, 17}, {4, 19}, {5, 25}, {6, 20}, {7, 8}, {8, 14}, + {9, 0}, {10, 18}, {11, 3}, {12, 5}, {13, 6}, {14, 7}, {15, 9}, {16, 10}, {17, 15}, + {18, 24}, {19, 23}, {20, 2}, {21, 21}, {22, 1}, {23, 13}, {24, 12}, {25, 11} }; + +const int wiring_reflector[][2] = { {0, 21}, {1, 10}, {2, 22}, {3, 17}, {4, 6}, {5, 8}, {6, 4}, {7, 19}, {8, 5}, + {9, 25}, {10, 1}, {11, 20}, {12, 18}, {13, 15}, {14, 16}, {15, 13}, {16, 14}, {17, 3}, + {18, 12}, {19, 7}, {20, 11}, {21, 0}, {22, 2}, {23, 24}, {24, 23}, {25, 9} }; diff --git a/EnigmaMachine/EnigmaMachine/Utils/utils.hpp b/EnigmaMachine/EnigmaMachine/Utils/utils.hpp new file mode 100644 index 0000000..5a22ef7 --- /dev/null +++ b/EnigmaMachine/EnigmaMachine/Utils/utils.hpp @@ -0,0 +1,32 @@ +// +// ArrayFunctions.hpp +// EnigmaMachine +// +// Created by Ayush Agrawal on 11/07/20. +// Copyright © 2020 Ayush Agrawal. All rights reserved. +// + +#pragma once +#include + +namespace custom_utils { + inline void copyArr2D(int arTo[26][2], const int arFrom[26][2], int size = 26){ + for (int i = 0; i < size; i++){ + for (int j = 0; j < 2; j++){ + arTo[i][j] = arFrom[i][j]; + } + } + } + + inline std::string removeSpace(std::string str){ + str.erase(remove_if(str.begin(), str.end(), isspace),str.end()); + + return str; + } + + inline std::string toUppercase(std::string str){ + std::transform(str.begin(), str.end(),str.begin(), ::toupper); + return str; + } + +} diff --git a/EnigmaMachine/EnigmaMachine/main.cpp b/EnigmaMachine/EnigmaMachine/main.cpp new file mode 100644 index 0000000..1daad1f --- /dev/null +++ b/EnigmaMachine/EnigmaMachine/main.cpp @@ -0,0 +1,19 @@ +// +// main.cpp +// EnigmaMachine +// +// Created by Ayush Agrawal on 10/07/20. +// Copyright © 2020 Ayush Agrawal. All rights reserved. +// + +#include +#include "EnigmaMachine.hpp" +#include "Utils/config.h" + +int main(int argc, const char * argv[]) { + int rotorNumbers[NO_OF_ROTORS] = {ROTOR_1, ROTOR_2, ROTOR_3}; + EnigmaMachine enigmaMachine(rotorNumbers); + + std::cout << enigmaMachine.encode("NANANANANA BATMAN") << "\n"; + +} From b998d26875ec66da111d742afff4aa2921f9b3d5 Mon Sep 17 00:00:00 2001 From: ayushagrawal24 Date: Sat, 11 Jul 2020 04:30:43 +0530 Subject: [PATCH 3/8] Update .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index e502c69..2b6e61d 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,4 @@ # XCode project *.xcodeproj +xcuserdata/ From 2679077bd29a1c03e215a56afc12055db81f3d68 Mon Sep 17 00:00:00 2001 From: ayushagrawal24 Date: Sat, 11 Jul 2020 04:31:35 +0530 Subject: [PATCH 4/8] Update .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 2b6e61d..25115ba 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,4 @@ # XCode project *.xcodeproj xcuserdata/ +EnigmaMachine.xcodeproj From 402a1d5661501820bbe387eaf2de0d3bddea4fc5 Mon Sep 17 00:00:00 2001 From: ayushagrawal24 Date: Sat, 11 Jul 2020 04:32:18 +0530 Subject: [PATCH 5/8] Update .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 25115ba..4144fa1 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,4 @@ *.xcodeproj xcuserdata/ EnigmaMachine.xcodeproj +.DS_Store From 7cec8896bb01db28c45763f19d4b32e974d1c97d Mon Sep 17 00:00:00 2001 From: Ayush Agrawal Date: Sat, 11 Jul 2020 16:27:51 +0530 Subject: [PATCH 6/8] Made dynamic and string-friendly --- .DS_Store | Bin 6148 -> 6148 bytes .../EnigmaMachine.xcodeproj/project.pbxproj | 6 ++ .../UserInterfaceState.xcuserstate | Bin 47207 -> 49997 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 6 ++ EnigmaMachine/EnigmaMachine/EnigmaMachine.cpp | 8 +- EnigmaMachine/EnigmaMachine/EnigmaMachine.hpp | 2 +- EnigmaMachine/EnigmaMachine/Reflector.cpp | 47 +++++++++++ EnigmaMachine/EnigmaMachine/Reflector.hpp | 18 +++++ EnigmaMachine/EnigmaMachine/Rotor.cpp | 76 +++++++++++------- EnigmaMachine/EnigmaMachine/Rotor.hpp | 21 +++-- EnigmaMachine/EnigmaMachine/RotorSet.cpp | 41 +++++----- EnigmaMachine/EnigmaMachine/RotorSet.hpp | 12 +-- EnigmaMachine/EnigmaMachine/Utils/config.h | 64 ++++++++++----- EnigmaMachine/EnigmaMachine/main.cpp | 2 +- 14 files changed, 213 insertions(+), 90 deletions(-) create mode 100644 EnigmaMachine/EnigmaMachine.xcodeproj/xcuserdata/ayushagrawal.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist create mode 100644 EnigmaMachine/EnigmaMachine/Reflector.cpp create mode 100644 EnigmaMachine/EnigmaMachine/Reflector.hpp diff --git a/.DS_Store b/.DS_Store index bca3b186422bad3d581261070390cf1b53faf320..9650a4e6c7fe1e0ed5972fedc106f4ba75c7f73a 100644 GIT binary patch delta 14 VcmZoMXffE3#>mLHIh}E?7yu&g1W*6~ delta 16 XcmZoMXffE3#yHuXQG9bPW4jmtFaiZY diff --git a/EnigmaMachine/EnigmaMachine.xcodeproj/project.pbxproj b/EnigmaMachine/EnigmaMachine.xcodeproj/project.pbxproj index 8fc6ce1..e5ee540 100644 --- a/EnigmaMachine/EnigmaMachine.xcodeproj/project.pbxproj +++ b/EnigmaMachine/EnigmaMachine.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 642ADE3024B9C4F900C0A06A /* Reflector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 642ADE2E24B9C4F900C0A06A /* Reflector.cpp */; }; 64FDE08A24B8E42F003D1B0D /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 64FDE08924B8E42F003D1B0D /* main.cpp */; }; 64FDE09224B8E48E003D1B0D /* EnigmaMachine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 64FDE09024B8E48E003D1B0D /* EnigmaMachine.cpp */; }; 64FDE09924B8F57E003D1B0D /* RotorSet.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 64FDE09724B8F57E003D1B0D /* RotorSet.cpp */; }; @@ -26,6 +27,8 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 642ADE2E24B9C4F900C0A06A /* Reflector.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Reflector.cpp; sourceTree = ""; }; + 642ADE2F24B9C4F900C0A06A /* Reflector.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = Reflector.hpp; sourceTree = ""; }; 64FDE08624B8E42F003D1B0D /* EnigmaMachine */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = EnigmaMachine; sourceTree = BUILT_PRODUCTS_DIR; }; 64FDE08924B8E42F003D1B0D /* main.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = ""; }; 64FDE09024B8E48E003D1B0D /* EnigmaMachine.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = EnigmaMachine.cpp; sourceTree = ""; }; @@ -76,6 +79,8 @@ 64FDE09124B8E48E003D1B0D /* EnigmaMachine.hpp */, 64FDE09724B8F57E003D1B0D /* RotorSet.cpp */, 64FDE09824B8F57E003D1B0D /* RotorSet.hpp */, + 642ADE2E24B9C4F900C0A06A /* Reflector.cpp */, + 642ADE2F24B9C4F900C0A06A /* Reflector.hpp */, ); path = EnigmaMachine; sourceTree = ""; @@ -148,6 +153,7 @@ files = ( 64FDE0A424B925CF003D1B0D /* Rotor.cpp in Sources */, 64FDE09224B8E48E003D1B0D /* EnigmaMachine.cpp in Sources */, + 642ADE3024B9C4F900C0A06A /* Reflector.cpp in Sources */, 64FDE08A24B8E42F003D1B0D /* main.cpp in Sources */, 64FDE09924B8F57E003D1B0D /* RotorSet.cpp in Sources */, ); diff --git a/EnigmaMachine/EnigmaMachine.xcodeproj/project.xcworkspace/xcuserdata/ayushagrawal.xcuserdatad/UserInterfaceState.xcuserstate b/EnigmaMachine/EnigmaMachine.xcodeproj/project.xcworkspace/xcuserdata/ayushagrawal.xcuserdatad/UserInterfaceState.xcuserstate index 655876cb29899f1029e672ddfe7259128f5ec779..e4ecf5fee606698fb70993fc9a5a230e1d34030b 100644 GIT binary patch delta 24725 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 hG@ol)xN#fPo+j6yx`5)Zlk& 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 UsB5>&*)N7dU!&K*7YZyFAEdM1RR910 diff --git a/EnigmaMachine/EnigmaMachine.xcodeproj/xcuserdata/ayushagrawal.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/EnigmaMachine/EnigmaMachine.xcodeproj/xcuserdata/ayushagrawal.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 0000000..695f077 --- /dev/null +++ b/EnigmaMachine/EnigmaMachine.xcodeproj/xcuserdata/ayushagrawal.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,6 @@ + + + diff --git a/EnigmaMachine/EnigmaMachine/EnigmaMachine.cpp b/EnigmaMachine/EnigmaMachine/EnigmaMachine.cpp index 0246819..a96218f 100644 --- a/EnigmaMachine/EnigmaMachine/EnigmaMachine.cpp +++ b/EnigmaMachine/EnigmaMachine/EnigmaMachine.cpp @@ -9,7 +9,7 @@ #include "EnigmaMachine.hpp" #include "Utils/utils.hpp" -EnigmaMachine::EnigmaMachine(int rot_nos[NO_OF_ROTORS]): _rotorSet(rot_nos) { +EnigmaMachine::EnigmaMachine(int rot_nos[NO_OF_ROTORS], int reflectorType): _rotorSet(rot_nos, reflectorType) { for (int i = 0; i < 26; i++){ _intCharMap.push_back('A' + i); } @@ -23,11 +23,7 @@ std::string EnigmaMachine::encode(std::string inputStr){ std::string outputStr; for (int i = 0; i < inpCopy.size(); i++){ - char charIn = (char) inpCopy[i]; - int intIn = _intCharMap.find( charIn ); - int intOut = _rotorSet.parseValue( intIn ); - char charOut = _intCharMap[intOut]; - + char charOut = _rotorSet.parseValue( inpCopy[i] ); outputStr.push_back(charOut); } diff --git a/EnigmaMachine/EnigmaMachine/EnigmaMachine.hpp b/EnigmaMachine/EnigmaMachine/EnigmaMachine.hpp index cc994e8..a368281 100644 --- a/EnigmaMachine/EnigmaMachine/EnigmaMachine.hpp +++ b/EnigmaMachine/EnigmaMachine/EnigmaMachine.hpp @@ -16,6 +16,6 @@ class EnigmaMachine { std::string _intCharMap; public: - EnigmaMachine(int rot_nos[NO_OF_ROTORS]); + EnigmaMachine(int rot_nos[NO_OF_ROTORS], int reflectorType); std::string encode(std::string input); }; diff --git a/EnigmaMachine/EnigmaMachine/Reflector.cpp b/EnigmaMachine/EnigmaMachine/Reflector.cpp new file mode 100644 index 0000000..b2de0ee --- /dev/null +++ b/EnigmaMachine/EnigmaMachine/Reflector.cpp @@ -0,0 +1,47 @@ +// +// Reflector.cpp +// EnigmaMachine +// +// Created by Ayush Agrawal on 11/07/20. +// Copyright © 2020 Ayush Agrawal. All rights reserved. +// + +#include "Reflector.hpp" + +Reflector::Reflector(int type){ + _rotorNo = type; + setWiring(_rotorNo); +} + +char Reflector::runThrough(char input, bool forward = true) { + int intInp; + char output; + + forward = true; + + intInp = alphabet.find(input); + output = _wiring[intInp]; + nextRot -> runThrough(output, false); + + return output; +} + +void Reflector::setWiring(int type){ + switch(type){ + case REFLECTOR_B: + _wiring = wiring_reflectorB; + break; + case REFLECTOR_B_THIN: + _wiring = wiring_reflectorB_thin; + break; + case REFLECTOR_C: + _wiring = wiring_reflectorC; + break; + case REFLECTOR_C_THIN: + _wiring = wiring_reflectorC_thin; + break; + default: + _wiring = alphabet; + break; + } +} diff --git a/EnigmaMachine/EnigmaMachine/Reflector.hpp b/EnigmaMachine/EnigmaMachine/Reflector.hpp new file mode 100644 index 0000000..f1a6ab0 --- /dev/null +++ b/EnigmaMachine/EnigmaMachine/Reflector.hpp @@ -0,0 +1,18 @@ +// +// Reflector.hpp +// EnigmaMachine +// +// Created by Ayush Agrawal on 11/07/20. +// Copyright © 2020 Ayush Agrawal. All rights reserved. +// + +#pragma once +#include "Rotor.hpp" + +class Reflector : public Rotor { +public: + Reflector(int type); + char runThrough(char input, bool forward); + void setWiring(int type); + void rotate() {}; +}; diff --git a/EnigmaMachine/EnigmaMachine/Rotor.cpp b/EnigmaMachine/EnigmaMachine/Rotor.cpp index 7e393ae..48de88c 100644 --- a/EnigmaMachine/EnigmaMachine/Rotor.cpp +++ b/EnigmaMachine/EnigmaMachine/Rotor.cpp @@ -5,58 +5,74 @@ // Created by Ayush Agrawal on 10/07/20. // Copyright © 2020 Ayush Agrawal. All rights reserved. // -// Rotor::runThrough adapted from Code_Bullet's code at https://github.com/Code-Bullet/Enigma-Simulator/blob/master/enigmaSim/Rotor.pde #include "Rotor.hpp" -Rotor::Rotor(int rotorNumber, int rotorPosition) { +Rotor::Rotor(int rotorNumber) { _rotorNo = rotorNumber; - _rotorPos = rotorPosition; _offset = 0; - + + prevRot = nullptr; + nextRot = nullptr; + setWiring(_rotorNo); } -void Rotor::setWiring(int no){ - switch(no) { +void Rotor::setWiring(int type){ + switch(type) { case ROTOR_1: - custom_utils::copyArr2D(_wiring, wiring_rotor1); + _wiring = wiring_rotor1; + _notch = rot1_notch; break; case ROTOR_2: - custom_utils::copyArr2D(_wiring, wiring_rotor2); + _wiring = wiring_rotor1; + _notch = rot2_notch; break; case ROTOR_3: - custom_utils::copyArr2D(_wiring, wiring_rotor3); + _wiring = wiring_rotor1; + _notch = rot3_notch; break; case ROTOR_4: - custom_utils::copyArr2D(_wiring, wiring_rotor4); + _wiring = wiring_rotor1; + _notch = rot4_notch; break; case ROTOR_5: - custom_utils::copyArr2D(_wiring, wiring_rotor5); + _wiring = wiring_rotor1; + _notch = rot5_notch; + break; + default: + _wiring = alphabet; + _notch = 'A'; break; - case REFLECTOR: - custom_utils::copyArr2D(_wiring, wiring_reflector); } } -int Rotor::runThrough(int input, bool forward){ +char Rotor::runThrough(char input, bool forward){ + int intInp; + char output; + if (forward) { - input = (input + _offset) % 26; - - return _wiring[input][1]; + intInp = alphabet.find(input); + intInp = (intInp + _offset) % 26; + output = _wiring[intInp]; + nextRot -> runThrough(output, true); } else { - for (int i = 0; i< 26; i++) { - if (input == _wiring[i][1]) { - int output = ( _wiring[i][0]- _offset ) % 26; - - if (output < 0){ - output = 26 + output; - } - return output; - } + intInp = _wiring.find(input); + intInp = (intInp - _offset)%26; + if (intInp < 0){ + intInp += 26; } + output = alphabet[intInp]; + if(prevRot != nullptr){ + prevRot -> runThrough(output, false); + } + } + + if (_wiring[_offset] == _notch){ + nextRot -> rotate(); } - return -1; + + return output; } void Rotor::rotate(){ @@ -64,5 +80,9 @@ void Rotor::rotate(){ } int Rotor::position(){ - return _rotorPos; + return _offset; +} + +void Rotor::setOffset(int num){ + _offset = num % 26; } diff --git a/EnigmaMachine/EnigmaMachine/Rotor.hpp b/EnigmaMachine/EnigmaMachine/Rotor.hpp index b6bfea3..8dab831 100644 --- a/EnigmaMachine/EnigmaMachine/Rotor.hpp +++ b/EnigmaMachine/EnigmaMachine/Rotor.hpp @@ -11,19 +11,26 @@ #include "Utils/config.h" #include "Utils/utils.hpp" +#include + class Rotor { private: int _offset; - int _rotorNo; - int _rotorPos; - int _wiring[26][2]; + char _notch; - void setWiring(int no); +protected: + int _rotorNo; + std::string _wiring; public: + Rotor* nextRot; + Rotor* prevRot; + Rotor(){ }; - Rotor(int rotorNumber, int rotorPosition); - int runThrough(int input, bool forward = true); - void rotate(); + Rotor(int rotorNumber); + virtual char runThrough(char input, bool forward); + virtual void rotate(); int position(); + virtual void setWiring(int type); + void setOffset(int num); }; diff --git a/EnigmaMachine/EnigmaMachine/RotorSet.cpp b/EnigmaMachine/EnigmaMachine/RotorSet.cpp index 2fb1067..a504c10 100644 --- a/EnigmaMachine/EnigmaMachine/RotorSet.cpp +++ b/EnigmaMachine/EnigmaMachine/RotorSet.cpp @@ -7,35 +7,32 @@ // #include "RotorSet.hpp" +#include -RotorSet::RotorSet(int rot_nos[NO_OF_ROTORS]) { +RotorSet::RotorSet(int rot_nos[NO_OF_ROTORS], int reflectorType) { for (int i = 0; i < NO_OF_ROTORS; i++){ - _rotors[i] = Rotor(rot_nos[i], i+1); + _rotors[i] = new Rotor(rot_nos[i]); } - _reflector = Rotor(REFLECTOR, 4); + _reflector = new Reflector(reflectorType); - _rotationNo = 0; -} - - -int RotorSet::parseValue(int input){ - int value = input; - - for (int i = 0; i < NO_OF_ROTORS; i++){ - value = _rotors[i].runThrough(value); - } - value = _reflector.runThrough(value); - for (int i = NO_OF_ROTORS - 1; i >= 0; i--){ - value = _rotors[i].runThrough(value, false); + for (int i = 0; i < NO_OF_ROTORS - 1; i++){ + _rotors[i]->nextRot = _rotors[i+1]; + _rotors[i+1]->prevRot = _rotors[i]; } - _rotationNo++; - + _rotors[NO_OF_ROTORS - 1]->nextRot = _reflector; + _reflector->nextRot = _rotors[NO_OF_ROTORS - 1]; +} + +RotorSet::~RotorSet(){ for (int i = 0; i < NO_OF_ROTORS; i++){ - if (_rotationNo % (int)pow(26,i)){ - _rotors[i].rotate(); - } + delete _rotors[i]; } - +} + +int RotorSet::parseValue(char input){ + char value = _rotors[0]->runThrough(input, true); + _rotors[0] -> rotate(); + return value; } diff --git a/EnigmaMachine/EnigmaMachine/RotorSet.hpp b/EnigmaMachine/EnigmaMachine/RotorSet.hpp index 845c672..03e2b53 100644 --- a/EnigmaMachine/EnigmaMachine/RotorSet.hpp +++ b/EnigmaMachine/EnigmaMachine/RotorSet.hpp @@ -9,18 +9,18 @@ #pragma once #include "Rotor.hpp" +#include "Reflector.hpp" #include #define NO_OF_ROTORS 3 class RotorSet { private: - Rotor _rotors[NO_OF_ROTORS]; - Rotor _reflector; + Rotor* _rotors[NO_OF_ROTORS]; + Rotor* _reflector; - long int _rotationNo; - public: - RotorSet(int rot_nos[NO_OF_ROTORS]); - int parseValue(int input); + RotorSet(int rot_nos[NO_OF_ROTORS], int reflectorType); + ~RotorSet(); + int parseValue(char input); }; diff --git a/EnigmaMachine/EnigmaMachine/Utils/config.h b/EnigmaMachine/EnigmaMachine/Utils/config.h index 8e13520..61599cf 100644 --- a/EnigmaMachine/EnigmaMachine/Utils/config.h +++ b/EnigmaMachine/EnigmaMachine/Utils/config.h @@ -8,35 +8,61 @@ #pragma once +#include + //Rotor names #define ROTOR_1 1 #define ROTOR_2 2 #define ROTOR_3 3 #define ROTOR_4 4 #define ROTOR_5 5 -#define REFLECTOR 6 +#define REFLECTOR_B 6 +#define REFLECTOR_B_THIN 7 +#define REFLECTOR_C 8 +#define REFLECTOR_C_THIN 9 //Rotor Wirings -const int wiring_rotor1[][2] = { {0, 15}, {1, 4}, {2, 25}, {3, 20}, {4, 14}, {5, 7}, {6, 23}, {7, 18}, {8, 2}, - {9, 21}, {10, 5}, {11, 12}, {12, 19}, {13, 1}, {14, 6}, {15, 11}, {16, 17}, {17, 8}, - {18, 13}, {19, 16}, {20, 9}, {21, 22}, {22, 0}, {23, 24}, {24, 3}, {25, 10} }; +//const int wiring_rotor1[][2] = { {0, 15}, {1, 4}, {2, 25}, {3, 20}, {4, 14}, {5, 7}, {6, 23}, {7, 18}, {8, 2}, +// {9, 21}, {10, 5}, {11, 12}, {12, 19}, {13, 1}, {14, 6}, {15, 11}, {16, 17}, {17, 8}, +// {18, 13}, {19, 16}, {20, 9}, {21, 22}, {22, 0}, {23, 24}, {24, 3}, {25, 10} }; +// +//const int wiring_rotor2[][2] = { {0, 25}, {1, 14}, {2, 20}, {3, 4}, {4, 18}, {5, 24}, {6, 3}, {7, 10}, {8, 5}, +// {9, 22}, {10, 15}, {11, 2}, {12, 8}, {13, 16}, {14, 23}, {15, 7}, {16, 12}, {17, 21}, +// {18, 1}, {19, 11}, {20, 6}, {21, 13}, {22, 9}, {23, 17}, {24, 0}, {25, 19} }; +// +//const int wiring_rotor3[][2] = { {0, 4}, {1, 7}, {2, 17}, {3, 21}, {4, 23}, {5, 6}, {6, 0}, {7, 14}, {8, 1}, +// {9, 16}, {10, 20}, {11, 18}, {12, 8}, {13, 12}, {14, 25}, {15, 5}, {16, 11}, {17, 24}, +// {18, 13}, {19, 22}, {20, 10}, {21, 19}, {22, 15}, {23, 3}, {24, 9}, {25, 2} }; +// +//const int wiring_rotor4[][2] = { {0, 8}, {1, 12}, {2, 4}, {3, 19}, {4, 2}, {5, 6}, {6, 5}, {7, 17}, {8, 0}, +// {9, 24}, {10, 18}, {11, 16}, {12, 1}, {13, 25}, {14, 23}, {15, 22}, {16, 11}, {17, 7}, +// {18, 10}, {19, 3}, {20, 21}, {21, 20}, {22, 15}, {23, 14}, {24, 9}, {25, 13} }; +// +//const int wiring_rotor5[][2] = { {0, 16}, {1, 22}, {2, 4}, {3, 17}, {4, 19}, {5, 25}, {6, 20}, {7, 8}, {8, 14}, +// {9, 0}, {10, 18}, {11, 3}, {12, 5}, {13, 6}, {14, 7}, {15, 9}, {16, 10}, {17, 15}, +// {18, 24}, {19, 23}, {20, 2}, {21, 21}, {22, 1}, {23, 13}, {24, 12}, {25, 11} }; +// +//const int wiring_reflector[][2] = { {0, 21}, {1, 10}, {2, 22}, {3, 17}, {4, 6}, {5, 8}, {6, 4}, {7, 19}, {8, 5}, +// {9, 25}, {10, 1}, {11, 20}, {12, 18}, {13, 15}, {14, 16}, {15, 13}, {16, 14}, {17, 3}, +// {18, 12}, {19, 7}, {20, 11}, {21, 0}, {22, 2}, {23, 24}, {24, 23}, {25, 9} }; + -const int wiring_rotor2[][2] = { {0, 25}, {1, 14}, {2, 20}, {3, 4}, {4, 18}, {5, 24}, {6, 3}, {7, 10}, {8, 5}, - {9, 22}, {10, 15}, {11, 2}, {12, 8}, {13, 16}, {14, 23}, {15, 7}, {16, 12}, {17, 21}, - {18, 1}, {19, 11}, {20, 6}, {21, 13}, {22, 9}, {23, 17}, {24, 0}, {25, 19} }; +const std::string wiring_rotor1 = "EKMFLGDQVZNTOWYHXUSPAIBRCJ"; +const std::string wiring_rotor2 = "AJDKSIRUXBLHWTMCQGZNPYFVOE"; +const std::string wiring_rotor3 = "BDFHJLCPRTXVZNYEIWGAKMUSQO"; +const std::string wiring_rotor4 = "ESOVPZJAYQUIRHXLNFTGKDCMWB"; +const std::string wiring_rotor5 = "VZBRGITYUPSDNHLXAWMJQOFECK"; +const std::string wiring_reflectorB = "VZBRGITYUPSDNHLXAWMJQOFECK"; +const std::string wiring_reflectorC = "FVPJIAOYEDRZXWGCTKUQSBNMHL"; +const std::string wiring_reflectorB_thin = "ENKQAUYWJICOPBLMDXZVFTHRGS"; +const std::string wiring_reflectorC_thin = "RDOBJNTKVEHMLFCWZAXGYIPSUQ"; +const std::string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; -const int wiring_rotor3[][2] = { {0, 4}, {1, 7}, {2, 17}, {3, 21}, {4, 23}, {5, 6}, {6, 0}, {7, 14}, {8, 1}, - {9, 16}, {10, 20}, {11, 18}, {12, 8}, {13, 12}, {14, 25}, {15, 5}, {16, 11}, {17, 24}, - {18, 13}, {19, 22}, {20, 10}, {21, 19}, {22, 15}, {23, 3}, {24, 9}, {25, 2} }; +const char rot1_notch = 'Q'; +const char rot2_notch = 'E'; +const char rot3_notch = 'V'; +const char rot4_notch = 'J'; +const char rot5_notch = 'Z'; -const int wiring_rotor4[][2] = { {0, 8}, {1, 12}, {2, 4}, {3, 19}, {4, 2}, {5, 6}, {6, 5}, {7, 17}, {8, 0}, - {9, 24}, {10, 18}, {11, 16}, {12, 1}, {13, 25}, {14, 23}, {15, 22}, {16, 11}, {17, 7}, - {18, 10}, {19, 3}, {20, 21}, {21, 20}, {22, 15}, {23, 14}, {24, 9}, {25, 13} }; -const int wiring_rotor5[][2] = { {0, 16}, {1, 22}, {2, 4}, {3, 17}, {4, 19}, {5, 25}, {6, 20}, {7, 8}, {8, 14}, - {9, 0}, {10, 18}, {11, 3}, {12, 5}, {13, 6}, {14, 7}, {15, 9}, {16, 10}, {17, 15}, - {18, 24}, {19, 23}, {20, 2}, {21, 21}, {22, 1}, {23, 13}, {24, 12}, {25, 11} }; -const int wiring_reflector[][2] = { {0, 21}, {1, 10}, {2, 22}, {3, 17}, {4, 6}, {5, 8}, {6, 4}, {7, 19}, {8, 5}, - {9, 25}, {10, 1}, {11, 20}, {12, 18}, {13, 15}, {14, 16}, {15, 13}, {16, 14}, {17, 3}, - {18, 12}, {19, 7}, {20, 11}, {21, 0}, {22, 2}, {23, 24}, {24, 23}, {25, 9} }; diff --git a/EnigmaMachine/EnigmaMachine/main.cpp b/EnigmaMachine/EnigmaMachine/main.cpp index 1daad1f..3a6f32c 100644 --- a/EnigmaMachine/EnigmaMachine/main.cpp +++ b/EnigmaMachine/EnigmaMachine/main.cpp @@ -12,7 +12,7 @@ int main(int argc, const char * argv[]) { int rotorNumbers[NO_OF_ROTORS] = {ROTOR_1, ROTOR_2, ROTOR_3}; - EnigmaMachine enigmaMachine(rotorNumbers); + EnigmaMachine enigmaMachine(rotorNumbers, REFLECTOR_B); std::cout << enigmaMachine.encode("NANANANANA BATMAN") << "\n"; From def93591cd05fadfbdf75bf9640cba443637875b Mon Sep 17 00:00:00 2001 From: Ayush Agrawal Date: Sat, 11 Jul 2020 16:59:58 +0530 Subject: [PATCH 7/8] Added methods to change enigma configuration --- .../UserInterfaceState.xcuserstate | Bin 49997 -> 49448 bytes EnigmaMachine/EnigmaMachine/Reflector.cpp | 1 + EnigmaMachine/EnigmaMachine/Rotor.cpp | 2 + EnigmaMachine/EnigmaMachine/Rotor.hpp | 1 + EnigmaMachine/EnigmaMachine/RotorSet.cpp | 46 +++++++++++++++++- EnigmaMachine/EnigmaMachine/RotorSet.hpp | 8 +++ EnigmaMachine/EnigmaMachine/Utils/config.h | 22 +++++---- 7 files changed, 70 insertions(+), 10 deletions(-) diff --git a/EnigmaMachine/EnigmaMachine.xcodeproj/project.xcworkspace/xcuserdata/ayushagrawal.xcuserdatad/UserInterfaceState.xcuserstate b/EnigmaMachine/EnigmaMachine.xcodeproj/project.xcworkspace/xcuserdata/ayushagrawal.xcuserdatad/UserInterfaceState.xcuserstate index e4ecf5fee606698fb70993fc9a5a230e1d34030b..69b92ccbf78c9a1603f6873dbfc54a772794ddee 100644 GIT binary patch delta 19410 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 delta 19939 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 diff --git a/EnigmaMachine/EnigmaMachine/Reflector.cpp b/EnigmaMachine/EnigmaMachine/Reflector.cpp index b2de0ee..e3afef0 100644 --- a/EnigmaMachine/EnigmaMachine/Reflector.cpp +++ b/EnigmaMachine/EnigmaMachine/Reflector.cpp @@ -27,6 +27,7 @@ char Reflector::runThrough(char input, bool forward = true) { } void Reflector::setWiring(int type){ + _rotorNo = type; switch(type){ case REFLECTOR_B: _wiring = wiring_reflectorB; diff --git a/EnigmaMachine/EnigmaMachine/Rotor.cpp b/EnigmaMachine/EnigmaMachine/Rotor.cpp index 48de88c..ad4a992 100644 --- a/EnigmaMachine/EnigmaMachine/Rotor.cpp +++ b/EnigmaMachine/EnigmaMachine/Rotor.cpp @@ -19,6 +19,8 @@ Rotor::Rotor(int rotorNumber) { } void Rotor::setWiring(int type){ + _rotorNo = type; + switch(type) { case ROTOR_1: _wiring = wiring_rotor1; diff --git a/EnigmaMachine/EnigmaMachine/Rotor.hpp b/EnigmaMachine/EnigmaMachine/Rotor.hpp index 8dab831..c2c1ff4 100644 --- a/EnigmaMachine/EnigmaMachine/Rotor.hpp +++ b/EnigmaMachine/EnigmaMachine/Rotor.hpp @@ -31,6 +31,7 @@ class Rotor { virtual char runThrough(char input, bool forward); virtual void rotate(); int position(); + virtual void setWiring(int type); void setOffset(int num); }; diff --git a/EnigmaMachine/EnigmaMachine/RotorSet.cpp b/EnigmaMachine/EnigmaMachine/RotorSet.cpp index a504c10..c979eee 100644 --- a/EnigmaMachine/EnigmaMachine/RotorSet.cpp +++ b/EnigmaMachine/EnigmaMachine/RotorSet.cpp @@ -7,7 +7,9 @@ // #include "RotorSet.hpp" -#include +#include +#include +#include RotorSet::RotorSet(int rot_nos[NO_OF_ROTORS], int reflectorType) { for (int i = 0; i < NO_OF_ROTORS; i++){ @@ -36,3 +38,45 @@ int RotorSet::parseValue(char input){ return value; } + + +void RotorSet::setRotorOffset(int rotPos, int offset){ + if (rotPos >= NO_OF_ROTORS) return; + offset %= 26; + _rotors[rotPos]->setOffset(offset); + _config[rotPos][1] = offset; +} + +void RotorSet::setReflectorType(int type){ + _reflector->setWiring(type); + _config[NO_OF_ROTORS][0] = type; +} + +void RotorSet::setRotorType(int rotPos, int type){ + if (rotPos >= NO_OF_ROTORS) return; + _rotors[rotPos]->setWiring(type); + _config[rotPos][0] = type; + +} + +void RotorSet::randomConfig(){ + srand(time(0)); + int type; int offset; + std::set typesUsed; + + for (int i = 0; i < NO_OF_ROTORS; i++){ + offset = rand() % 26; + + do { + type = rand() % NO_ROTOR_TYPES; + } while (typesUsed.count(type) > 0); + + typesUsed.insert(type); + + setRotorType(i, type); + setRotorOffset(i, offset); + } + + type = rand() % NO_REFLECTOR_TYPES; + setReflectorType(type); +} diff --git a/EnigmaMachine/EnigmaMachine/RotorSet.hpp b/EnigmaMachine/EnigmaMachine/RotorSet.hpp index 03e2b53..d79c593 100644 --- a/EnigmaMachine/EnigmaMachine/RotorSet.hpp +++ b/EnigmaMachine/EnigmaMachine/RotorSet.hpp @@ -19,8 +19,16 @@ class RotorSet { Rotor* _rotors[NO_OF_ROTORS]; Rotor* _reflector; + int _config[NO_OF_ROTORS+1][2]; + public: RotorSet(int rot_nos[NO_OF_ROTORS], int reflectorType); ~RotorSet(); int parseValue(char input); + + void setRotorOffset(int rotPos, int offset); + void setRotorType(int rotPos, int type); + void setReflectorType(int type); + + void randomConfig(); }; diff --git a/EnigmaMachine/EnigmaMachine/Utils/config.h b/EnigmaMachine/EnigmaMachine/Utils/config.h index 61599cf..5b8ca52 100644 --- a/EnigmaMachine/EnigmaMachine/Utils/config.h +++ b/EnigmaMachine/EnigmaMachine/Utils/config.h @@ -11,15 +11,19 @@ #include //Rotor names -#define ROTOR_1 1 -#define ROTOR_2 2 -#define ROTOR_3 3 -#define ROTOR_4 4 -#define ROTOR_5 5 -#define REFLECTOR_B 6 -#define REFLECTOR_B_THIN 7 -#define REFLECTOR_C 8 -#define REFLECTOR_C_THIN 9 +#define ROTOR_1 0 +#define ROTOR_2 1 +#define ROTOR_3 2 +#define ROTOR_4 3 +#define ROTOR_5 4 + +#define REFLECTOR_B 0 +#define REFLECTOR_B_THIN 1 +#define REFLECTOR_C 2 +#define REFLECTOR_C_THIN 3 + +#define NO_ROTOR_TYPES 5 +#define NO_REFLECTOR_TYPES 4 //Rotor Wirings //const int wiring_rotor1[][2] = { {0, 15}, {1, 4}, {2, 25}, {3, 20}, {4, 14}, {5, 7}, {6, 23}, {7, 18}, {8, 2}, From 56d330a82d32976ed8cf8867e879f2e478faf3df Mon Sep 17 00:00:00 2001 From: Rajat Agarwal Date: Sat, 11 Jul 2020 21:57:34 +0530 Subject: [PATCH 8/8] set up eclipse IDE --- .cproject | 927 ++++++++++++++++++ .project | 71 ++ .../org.eclipse.cdt.managedbuilder.core.prefs | 26 + EnigmaMachine/EnigmaMachine/EnigmaMachine.hpp | 2 +- EnigmaMachine/EnigmaMachine/Rotor.cpp | 12 +- EnigmaMachine/EnigmaMachine/Rotor.hpp | 8 +- EnigmaMachine/EnigmaMachine/RotorSet.cpp | 16 +- EnigmaMachine/EnigmaMachine/RotorSet.hpp | 8 +- EnigmaMachine/EnigmaMachine/Utils/config.h | 3 - EnigmaMachine/EnigmaMachine/Utils/utils.hpp | 10 +- EnigmaMachine/EnigmaMachine/main.cpp | 8 +- 11 files changed, 1058 insertions(+), 33 deletions(-) create mode 100644 .cproject create mode 100644 .project create mode 100644 .settings/org.eclipse.cdt.managedbuilder.core.prefs diff --git a/.cproject b/.cproject new file mode 100644 index 0000000..5e0c132 --- /dev/null +++ b/.cproject @@ -0,0 +1,927 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.project b/.project new file mode 100644 index 0000000..ec53fe2 --- /dev/null +++ b/.project @@ -0,0 +1,71 @@ + + + EnigmaSim + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + ?name? + + + + org.eclipse.cdt.make.core.append_environment + true + + + org.eclipse.cdt.make.core.buildArguments + + + + org.eclipse.cdt.make.core.buildCommand + make + + + org.eclipse.cdt.make.core.buildLocation + ${workspace_loc:/EnigmaSim/Debug} + + + org.eclipse.cdt.make.core.contents + org.eclipse.cdt.make.core.activeConfigSettings + + + org.eclipse.cdt.make.core.enableAutoBuild + false + + + org.eclipse.cdt.make.core.enableCleanBuild + true + + + org.eclipse.cdt.make.core.enableFullBuild + true + + + org.eclipse.cdt.make.core.stopOnError + true + + + org.eclipse.cdt.make.core.useDefaultBuildCmd + true + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + diff --git a/.settings/org.eclipse.cdt.managedbuilder.core.prefs b/.settings/org.eclipse.cdt.managedbuilder.core.prefs new file mode 100644 index 0000000..d4cc1e6 --- /dev/null +++ b/.settings/org.eclipse.cdt.managedbuilder.core.prefs @@ -0,0 +1,26 @@ +#Sat Jul 11 20:12:08 IST 2020 +eclipse.preferences.version=1 +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.debug.1001932859/CPATH/delimiter=; +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.debug.1001932859/CPATH/operation=remove +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.debug.1001932859/CPLUS_INCLUDE_PATH/delimiter=; +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.debug.1001932859/CPLUS_INCLUDE_PATH/operation=remove +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.debug.1001932859/C_INCLUDE_PATH/delimiter=; +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.debug.1001932859/C_INCLUDE_PATH/operation=remove +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.debug.1001932859/append=true +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.debug.1001932859/appendContributed=true +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.release.1101643224/CPATH/delimiter=; +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.release.1101643224/CPATH/operation=remove +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.release.1101643224/CPLUS_INCLUDE_PATH/delimiter=; +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.release.1101643224/CPLUS_INCLUDE_PATH/operation=remove +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.release.1101643224/C_INCLUDE_PATH/delimiter=; +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.release.1101643224/C_INCLUDE_PATH/operation=remove +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.release.1101643224/append=true +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.release.1101643224/appendContributed=true +environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.debug.1001932859/LIBRARY_PATH/delimiter=; +environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.debug.1001932859/LIBRARY_PATH/operation=remove +environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.debug.1001932859/append=true +environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.debug.1001932859/appendContributed=true +environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.release.1101643224/LIBRARY_PATH/delimiter=; +environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.release.1101643224/LIBRARY_PATH/operation=remove +environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.release.1101643224/append=true +environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.release.1101643224/appendContributed=true diff --git a/EnigmaMachine/EnigmaMachine/EnigmaMachine.hpp b/EnigmaMachine/EnigmaMachine/EnigmaMachine.hpp index a368281..f0d031a 100644 --- a/EnigmaMachine/EnigmaMachine/EnigmaMachine.hpp +++ b/EnigmaMachine/EnigmaMachine/EnigmaMachine.hpp @@ -14,7 +14,7 @@ class EnigmaMachine { RotorSet _rotorSet; std::string _intCharMap; - + public: EnigmaMachine(int rot_nos[NO_OF_ROTORS], int reflectorType); std::string encode(std::string input); diff --git a/EnigmaMachine/EnigmaMachine/Rotor.cpp b/EnigmaMachine/EnigmaMachine/Rotor.cpp index ad4a992..d0eaf10 100644 --- a/EnigmaMachine/EnigmaMachine/Rotor.cpp +++ b/EnigmaMachine/EnigmaMachine/Rotor.cpp @@ -11,16 +11,16 @@ Rotor::Rotor(int rotorNumber) { _rotorNo = rotorNumber; _offset = 0; - + prevRot = nullptr; nextRot = nullptr; - + setWiring(_rotorNo); } void Rotor::setWiring(int type){ _rotorNo = type; - + switch(type) { case ROTOR_1: _wiring = wiring_rotor1; @@ -52,7 +52,7 @@ void Rotor::setWiring(int type){ char Rotor::runThrough(char input, bool forward){ int intInp; char output; - + if (forward) { intInp = alphabet.find(input); intInp = (intInp + _offset) % 26; @@ -69,11 +69,11 @@ char Rotor::runThrough(char input, bool forward){ prevRot -> runThrough(output, false); } } - + if (_wiring[_offset] == _notch){ nextRot -> rotate(); } - + return output; } diff --git a/EnigmaMachine/EnigmaMachine/Rotor.hpp b/EnigmaMachine/EnigmaMachine/Rotor.hpp index c2c1ff4..fb12f70 100644 --- a/EnigmaMachine/EnigmaMachine/Rotor.hpp +++ b/EnigmaMachine/EnigmaMachine/Rotor.hpp @@ -17,21 +17,21 @@ class Rotor { private: int _offset; char _notch; - + protected: int _rotorNo; std::string _wiring; - + public: Rotor* nextRot; Rotor* prevRot; - + Rotor(){ }; Rotor(int rotorNumber); virtual char runThrough(char input, bool forward); virtual void rotate(); int position(); - + virtual void setWiring(int type); void setOffset(int num); }; diff --git a/EnigmaMachine/EnigmaMachine/RotorSet.cpp b/EnigmaMachine/EnigmaMachine/RotorSet.cpp index c979eee..2c75562 100644 --- a/EnigmaMachine/EnigmaMachine/RotorSet.cpp +++ b/EnigmaMachine/EnigmaMachine/RotorSet.cpp @@ -16,12 +16,12 @@ RotorSet::RotorSet(int rot_nos[NO_OF_ROTORS], int reflectorType) { _rotors[i] = new Rotor(rot_nos[i]); } _reflector = new Reflector(reflectorType); - + for (int i = 0; i < NO_OF_ROTORS - 1; i++){ _rotors[i]->nextRot = _rotors[i+1]; _rotors[i+1]->prevRot = _rotors[i]; } - + _rotors[NO_OF_ROTORS - 1]->nextRot = _reflector; _reflector->nextRot = _rotors[NO_OF_ROTORS - 1]; } @@ -35,7 +35,7 @@ RotorSet::~RotorSet(){ int RotorSet::parseValue(char input){ char value = _rotors[0]->runThrough(input, true); _rotors[0] -> rotate(); - + return value; } @@ -63,20 +63,20 @@ void RotorSet::randomConfig(){ srand(time(0)); int type; int offset; std::set typesUsed; - + for (int i = 0; i < NO_OF_ROTORS; i++){ offset = rand() % 26; - + do { type = rand() % NO_ROTOR_TYPES; } while (typesUsed.count(type) > 0); - + typesUsed.insert(type); - + setRotorType(i, type); setRotorOffset(i, offset); } - + type = rand() % NO_REFLECTOR_TYPES; setReflectorType(type); } diff --git a/EnigmaMachine/EnigmaMachine/RotorSet.hpp b/EnigmaMachine/EnigmaMachine/RotorSet.hpp index d79c593..6f8cec7 100644 --- a/EnigmaMachine/EnigmaMachine/RotorSet.hpp +++ b/EnigmaMachine/EnigmaMachine/RotorSet.hpp @@ -18,17 +18,17 @@ class RotorSet { private: Rotor* _rotors[NO_OF_ROTORS]; Rotor* _reflector; - + int _config[NO_OF_ROTORS+1][2]; - + public: RotorSet(int rot_nos[NO_OF_ROTORS], int reflectorType); ~RotorSet(); int parseValue(char input); - + void setRotorOffset(int rotPos, int offset); void setRotorType(int rotPos, int type); void setReflectorType(int type); - + void randomConfig(); }; diff --git a/EnigmaMachine/EnigmaMachine/Utils/config.h b/EnigmaMachine/EnigmaMachine/Utils/config.h index 5b8ca52..f69fe5a 100644 --- a/EnigmaMachine/EnigmaMachine/Utils/config.h +++ b/EnigmaMachine/EnigmaMachine/Utils/config.h @@ -67,6 +67,3 @@ const char rot2_notch = 'E'; const char rot3_notch = 'V'; const char rot4_notch = 'J'; const char rot5_notch = 'Z'; - - - diff --git a/EnigmaMachine/EnigmaMachine/Utils/utils.hpp b/EnigmaMachine/EnigmaMachine/Utils/utils.hpp index 5a22ef7..e1d531c 100644 --- a/EnigmaMachine/EnigmaMachine/Utils/utils.hpp +++ b/EnigmaMachine/EnigmaMachine/Utils/utils.hpp @@ -8,7 +8,7 @@ #pragma once #include - +#include namespace custom_utils { inline void copyArr2D(int arTo[26][2], const int arFrom[26][2], int size = 26){ for (int i = 0; i < size; i++){ @@ -17,16 +17,16 @@ namespace custom_utils { } } } - + inline std::string removeSpace(std::string str){ str.erase(remove_if(str.begin(), str.end(), isspace),str.end()); - + return str; } - + inline std::string toUppercase(std::string str){ std::transform(str.begin(), str.end(),str.begin(), ::toupper); return str; } - + } diff --git a/EnigmaMachine/EnigmaMachine/main.cpp b/EnigmaMachine/EnigmaMachine/main.cpp index 3a6f32c..c3a84a9 100644 --- a/EnigmaMachine/EnigmaMachine/main.cpp +++ b/EnigmaMachine/EnigmaMachine/main.cpp @@ -13,7 +13,11 @@ int main(int argc, const char * argv[]) { int rotorNumbers[NO_OF_ROTORS] = {ROTOR_1, ROTOR_2, ROTOR_3}; EnigmaMachine enigmaMachine(rotorNumbers, REFLECTOR_B); - + int a; + + std::cout << enigmaMachine.encode("NANANANANA BATMAN") << "\n"; - + return 0; + + }