Viewing:
const std = @import("std");
const rand = std.crypto.random;
const chars_basic = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890";
// shell friendly characters
const chars_shell = "~@%*-_:,.";
const chars_special = "!#$^&()=+[{}]|\\;<>/?";
const password_chars_all = chars_basic ++ chars_shell ++ chars_special;
const Args = struct { character_set: []const u8, pass_length: u8 };
const defaultPassLength: u8 = 20;
fn getArgs() !Args {
const theArgs = std.os.argv;
const numArgs = theArgs.len;
if (numArgs == 1) {
return Args{ .character_set = password_chars_all, .pass_length = 20 };
}
if (numArgs == 2) {
const pass_length = try std.fmt.parseInt(u8, std.mem.span(theArgs[1]), 10);
return Args{ .character_set = password_chars_all, .pass_length = pass_length };
}
const pass_length = try std.fmt.parseInt(u8, std.mem.span(theArgs[2]), 10);
var the_char_set: []const u8 = std.mem.span(theArgs[1]);
if (std.mem.eql(u8, the_char_set, "basic")) {
the_char_set = chars_basic;
} else if (std.mem.eql(u8, the_char_set, "shell")) {
the_char_set = chars_basic ++ chars_shell;
}
return Args{ .character_set = the_char_set, .pass_length = pass_length };
}
pub fn main() !void {
const args = try getArgs();
const stdout = std.io.getStdOut().writer();
var output: [255]u8 = undefined;
var i = args.pass_length;
const character_set_length = args.character_set.len;
while (i > 0) {
i -= 1;
const j = rand.intRangeAtMost(u8, 0, @as(u8, @truncate(character_set_length - 1)));
output[i] = args.character_set[j];
}
try stdout.print("{s}\n", .{output});
}