Upgrade everything for SBCL.
[lisp] / safely.lisp
index 0a05f8b..b5d7ff8 100644 (file)
           #:safely-writing))
 (in-package #:safely)
 
+#+(or cmu sbcl)
+(eval-when (:compile-toplevel :execute)
+  (import #+cmu '(ext:unix-namestring unix:unix-link)
+         #+sbcl '(sb-int:unix-namestring)))
+
 (defstruct (safely (:predicate safelyp))
   "Stores information about how to commit or undo safe writes."
   (streams nil)
   (safely-unwind (safely-trail safe))
   (safely-reset safe))
 
+#+sbcl
+(defun unix-link (from to)
+  (sb-unix::int-syscall ("link" sb-alien:c-string sb-alien:c-string)
+                       from to))
+
 (defun safe-copy (file tag)
   "Make a copy of the FILE.  Return the new name."
 
-  #+cmu
+  #+(or cmu sbcl)
   ;; Use link(2) where available.
   (generate-fresh-file-name file tag
                            (lambda (name)
-                             (let ((from (ext:unix-namestring file t))
-                                   (to (ext:unix-namestring name nil)))
+                             (let ((from (unix-namestring file t))
+                                   (to (unix-namestring name nil)))
                                (and from to
-                                    (unix:unix-link from to)))))
+                                    (unix-link from to)))))
 
-  #-cmu
+  #-(or cmu sbcl)
   ;; Otherwise just copy the file contents and hope for the best.
   (with-open-file (input file :element-type :default)
     (multiple-value-bind