pwg

pwg – a password generator

// includes
// globals

int main(int argc, char *argv[]) {
	{
		// unit-tests
	}
	// main
}
// ...
	// main
	// state
	// process args
	// generate
// ...
// ...
// includes
	#include <string>
	#include <iostream>
// ...
// ...
	// generate
	std::string pw;
	// generate pw
	std::cout << pw << '\n';
// ...
// ...
	// state
	int upper_count = 3;
	std::string upper_set { "ABCDEFGHJKLMNPQRSTUVWXYZ" };
// ...
// ...
// includes
	#include <random>
// ...
// ...
// globals
	using Uniform = std::uniform_int_distribution<int>;

	template<typename RE> std::string random_select(
		const std::string &source,
		int count, RE &re
	) {
		std::string result;
		// random select
		return result;
	}
// ...
// ...
		// unit-tests
		using TestEngine = std::linear_congruential_engine<
			unsigned, 1, 0, 0x7ff
		>;
		// unit-tests 2
// ...
// ...
// includes
	#include <exception>
// ...
// ...
		// unit-tests 2
		{
			TestEngine te { 0 };
			if (random_select("abc", 4, te) != "aaaa") {
				throw std::logic_error("random select");
			}
		}
// ...
// ...
		// random select
		int max = source.size() - 1;
		if (max < 0) {
			throw std::invalid_argument("no chars");
		}
		Uniform d { 0, max };
		for (int i = 0; i < count; ++i) {
			result += source[d(re)];
		}
// ...
// ...
	// state
	auto seed { (std::random_device {})() };
// ...
// ...
	// generate pw
	std::mt19937 re { seed };
	// generate pw 2
// ...
// ...
	// generate pw 2
	pw += random_select(upper_set, upper_count, re);
	// generate pw 3
// ...
// ...
	// state
	int lower_count = 3;
	std::string lower_set { "abcdefghijkmnopqrstuvwxyz" };
// ...
// ...
	// generate pw 3
	pw += random_select(
		lower_set, lower_count, re
	);
	// generate pw 4
// ...
// ...
// includes
	#include <algorithm>
// ...
// ...
	// generate pw 4
	std::shuffle(pw.begin(), pw.end(), re);
// ...
// ...
	// state
	int digit_count = 2;
	std::string digit_set { "23456789" };
// ...
// ...
	// generate pw 3
	pw += random_select(digit_set, digit_count, re);
// ...
// ...
	// state
	int special_count = 2;
	std::string special_set { ".,:;!?+-*/[](){}" };
// ...
// ...
	// generate pw 3
	pw += random_select(
		special_set, special_count, re
	);
// ...
// ...
// globals
	int to_int(const std::string &s, int d) {
		try {
			d = std::stoi(s);
		}
		catch (...) {
			// to int err msg
		}
		return d;
	}
// ...
// ...
			// to int err msg
			std::cerr << "Can't convert `" <<
				s << "` to integer; " <<
				"will use " << d <<
				" instead.\n";
// ...
// ...
	// process args
	if (argc > 1) {
		upper_count = to_int(
			argv[1], upper_count
		);
	}
// ...
// ...
	// process args
	if (argc > 2) {
		lower_count = to_int(
			argv[2], lower_count
		);
	}
// ...
// ...
	// process args
	if (argc > 3) {
		digit_count = to_int(
			argv[3], digit_count
		);
	}
// ...
// ...
	// process args
	if (argc > 4) {
		special_count = to_int(
			argv[4], special_count
		);
	}
// ...
// ...
	// process args
	if (argc > 5) {
		std::string s { argv[5] };
		if (s.size()) {
			special_set = argv[5];
		} else {
			std::cerr << "Specials are "
				"empty; will use `" <<
				special_set <<
				"` instead.\n";
		}
	}
// ...
// ...
	// process args
	if (argc > 6) {
		seed = to_int(argv[6], seed);
	}
// ...