#!/usr/local/bin/klone

;; option parsing

(getopts
"\
USAGE: le [options]
    lists all the files (not directories) recusrively from current dir, 
    and prints a list globally sorted by time
"
("-v" 0 Verbose "verbose: lists subdirectories entered")
("-r" 0 Reverse "sorts in reverse (most recent first)")
)

(setq files (list))			;list of strings
(setq curdir "")

(defun le-file (f st)
  (if (setq s (seconds-to-date (getn st 'mtime)))
    (put files -1
      (+ (String (- (getn s 0) 1900))
	(if (< (setq sn (getn s 1)) 10) "0" "")
	(String sn)
	(if (< (setq sn (getn s 2)) 10) "0" "")
	(String sn)
	","
	(if (< (setq sn (getn s 3)) 10) "0" "")
	(String sn)
;	":"
	(if (< (setq sn (getn s 4)) 10) "0" "")
	(String sn)
	(progn 
	  (setq size (String (/ (+ 1023 (getn st 'size)) 1024)))
	  (subseq "     " (length size))
	)
	size
	"k  "
	curdir
	f
))))

(defun le-dir (dir &aux
    (curdir (if (= "" dir) "" (+ curdir dir "/")))
    (*current-directory* *current-directory*)
    (to-dir (if (= dir "") "." dir))
    pos
    st
  )
  (if (trap-error 'Errors:BadDirectory (setq *current-directory* to-dir))
    (progn
      (if Verbose (print-format *standard-error*
	  "le: parsing directory %0\n" curdir))
      (dolist (f (directory))
	(if (= S_IFREG 
	    (logand S_IFMT (get (setq st (file-stats f)) 'mode 0))
	  )
	  (le-file f st)
	  
	  (= S_IFDIR (logand S_IFMT (get st 'mode 0)))
	  (le-dir f)
    )))
    (print-format *standard-error* "le: cannot go into directory: %0\n"
      to-dir
)))

	
(defun r-compare (o1 o2)
  (- (compare o1 o2))
)

(le-dir "")
(sort files (if Reverse r-compare compare))
(dolist (f files)
  (write f)
  (write "\n")
)
