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}); }