Newer
Older
pwg / pwg.lisp
;;;; 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)))))