chiark / gitweb /
str: Handy functions for testing prefixes/suffixes.
[lisp] / safely.lisp
index 44a707e1898d92a9fe46c7674f81fff324949618..2477f9a721b7350fb997e31d97937a30b43d39af 100644 (file)
 ;;; it under the terms of the GNU General Public License as published by
 ;;; the Free Software Foundation; either version 2 of the License, or
 ;;; (at your option) any later version.
-;;; 
+;;;
 ;;; This program is distributed in the hope that it will be useful,
 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 ;;; GNU General Public License for more details.
-;;; 
+;;;
 ;;; You should have received a copy of the GNU General Public License
 ;;; along with this program; if not, write to the Free Software Foundation,
 ;;; Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
@@ -30,6 +30,11 @@ (defpackage #:safely
           #: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)
@@ -136,19 +141,24 @@ (defun safely-bail (safe)
   (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
@@ -171,7 +181,7 @@ (defun safe-copy (file tag)
                   (when (< read (length buffer))
                     (return copy))))))
        (close output)))))
-                                             
+
 (defun safely-commit (safe)
   "Commit SAFE.  The files deleted by safely-delete-file are deleted; the
    files created by safely-open-output-stream are renamed over the old
@@ -227,8 +237,7 @@ (defmacro safely-writing ((stream file &rest open-args) &body body)
    temporary file, and if BODY completes, it is renamed to FILE."
   (with-gensyms safe
     `(safely (,safe)
-       (let ((,stream (apply #'safely-open-output-stream
-                            ,safe ,file ,open-args)))
+       (let ((,stream (safely-open-output-stream ,safe ,file ,@open-args)))
         ,@body))))
 
 ;;;----- That's all, folks --------------------------------------------------