;;;; pwg.lisp (in-package #:pwg) (defparameter +characters+ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&()_=") (defparameter +length-characters+ (length +characters+)) (defparameter +default-length+ 8) (defun generate-password (pwd-length) "Generate a password of length PWD-LENGTH" (let ((password (list)) (index 0)) (dotimes (i pwd-length) (setf index (random +length-characters+ (make-random-state t))) (setf password (concatenate 'string password (subseq +characters+ index (1+ index)))) ) (format t "~a~%" password))) (defun show-usage () (format t "USAGE:~% pwg : Generates a password with default length of ~a ~% pwg n : Where n is a positive integer greater than or equal to ~a~%" +default-length+ +default-length+)) ;;;; https://stackoverflow.com/questions/5009853/how-to-pass-arguments-to-saved-sbcl-core (defun main () (let* ((argv (uiop:command-line-arguments)) (first-arg (if (and (not (null argv)) (parse-integer (first argv) :junk-allowed t)) (parse-integer (first argv)) nil))) (cond ((null argv) (generate-password +default-length+)) ((and (numberp first-arg) (>= first-arg +default-length+)) (generate-password first-arg)) (t (show-usage)))))