aboutsummaryrefslogtreecommitdiff
path: root/lib/util.lisp
blob: 290d541d90e315d7cd449e372bd1eab60c8f4d59 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
;;;; util.lisp

(in-package :oneliners.cli)

(defun make-temp-file-name ()
  "Simply makes a file name for a temp file. Uses
UIOP:TEMPORARY-DIRECTORY for the directory."
  (namestring
   (merge-pathnames (format nil "~a~a" (gensym "oneliners") (get-universal-time))
                    (uiop:temporary-directory))))


(defun string-from-editor (&optional contents)
  (let ((filename (make-temp-file-name)))
    (when contents (a:write-string-into-file  contents filename :if-exists :supersede))
    (unwind-protect 
         (magic-ed:magic-ed filename :eval nil :output :string)
      (uiop:delete-file-if-exists filename))))


(defun executable-on-system-p (name)
  "A hack that heuristically determines whether or not an executable
with the provided name is on the system. It is not perfect. It
consults the environment PATH, and looks for the command in any of
the directories that appear in the value of that variable."
  #+unix
  (loop for path in (str:split ":" (uiop:getenv "PATH"))
        for directory = (cons :absolute
                              (cdr (str:split "/" path)))
          thereis (uiop:file-exists-p
                   (make-pathname :name name :directory directory))))

(defun print-to-file (printable-object pathname &optional (if-exists :supersede))
  "Prints an object to a file, ensuring that the containing directory exists first."
  (ensure-directories-exist pathname)
  (with-open-file (out pathname :direction :output :if-exists if-exists)
    (print printable-object out)))