diff --git a/CMakeLists.txt b/CMakeLists.txt index 36a96c2..7b34f76 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,4 +3,4 @@ project(passwdgen) set(CMAKE_CXX_STANDARD 20) -add_executable(passwdgen main.cpp) \ No newline at end of file +add_executable(passwdgen passwdgen.cpp) \ No newline at end of file diff --git a/main.cpp b/passwdgen.cpp similarity index 65% rename from main.cpp rename to passwdgen.cpp index 582b899..b06b512 100644 --- a/main.cpp +++ b/passwdgen.cpp @@ -1,6 +1,12 @@ +// +// passwdgen.cpp +// Created by Greg Gauthier on 2020.10.22. +// + #include #include + std::string random_string(std::size_t length, bool punc) { std::string CHARACTERS; std::string ALPHANUM = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; @@ -13,7 +19,7 @@ std::string random_string(std::size_t length, bool punc) { } std::random_device random_device; std::mt19937 generator(random_device()); - std::uniform_int_distribution<> distribution(0, CHARACTERS.size() - 1); + std::uniform_int_distribution<> distribution(0.0, CHARACTERS.size() - 1.0); std::string random_string; for (std::size_t i = 0; i < length; ++i) { @@ -25,15 +31,15 @@ std::string random_string(std::size_t length, bool punc) { void show_usage(std::string binname) { std::cerr << "Usage: " << binname << " [OPTIONS] " << std::endl << "Options:" << std::endl - << "\t-h, --help \t\tShow this help message" << std::endl - << "\t-l, --length \t\tThe length of the password (default: 32)" << std::endl + << "\t-h, --help \t\tShow this help message" << std::endl + << "\t-l, --length [n] \t\tThe length of the password (default: 32)" << std::endl << "\t-p, --punctuation \t\tToggle special characters (default: false)" << std::endl; } int main(int argc, char *argv[]) { std::string passlenstr; - int passlen; + int passlen = 0; bool punc = false; if (argc < 1) { @@ -48,18 +54,24 @@ int main(int argc, char *argv[]) { } else if (arg == "-p") { punc = true; } else if ((arg == "-l") || (arg == "--length")) { - passlenstr = argv[i + 1]; - if (passlenstr.empty()) { - std::cerr << "--destination option requires one argument." << std::endl; + if (not argv[i +1]) { + std::cerr << "Specify a password length" << std::endl; return 1; + } else { + passlenstr = argv[i + 1]; + try { + passlen = std::stoi(passlenstr); + } catch (const std::invalid_argument& e){ + std::cerr << "Length must be a valid integer" << std::endl; + return 1; + } } } } - if (passlenstr.empty()) { - passlenstr = "32"; + if (passlen == 0) { + passlen = 32; } - passlen = std::stoi(passlenstr); std::string password = random_string(passlen, punc); std::cout << password << std::endl; return 0;