real-copy-file;real-move-file;copy-stream

master
Avril 4 years ago
parent bbcb4d7c83
commit 01442bcf77
Signed by: flanchan
GPG Key ID: 284488987C31F630

@ -1,6 +1,8 @@
;;;; utils.lisp -- some random utils I collect. might be useful, probably won't be. ;;;; utils.lisp -- some random utils I collect. might be useful, probably won't be.
(defpackage :flan-utils (:use :cl)) (defpackage :flan-utils
(:use :cl)
(:nicknames :fu))
(in-package :flan-utils) (in-package :flan-utils)
(defmacro export* (&rest syms) (defmacro export* (&rest syms)
@ -37,8 +39,28 @@
(defexport (defexport
;;; --- actual (exported) code goes here -- ;;; --- actual (exported) code goes here --
(defun copy-stream (from to &key (buffer-size 4096))
"Block copy byte streams"
(let ((buffer (make-array buffer-size :element-type '(unsigned-byte 8))))
(loop for bytes-read = (read-sequence buffer from)
while (plusp bytes-read)
do (write-sequence buffer to :end bytes-read))))
(defun real-copy-file (from to)
"Copy a file"
(with-open-file (from from :direction :input :element-type '(unsigned-byte 8))
(with-open-file (to to :direction :output :if-exists :supersede :element-type '(unsigned-byte 8))
(copy-stream from to))))
(defun real-move-file (from to)
"Actually move a file"
(real-copy-file from to)
(delete-file from))
(defmacro errors (stmt) (defmacro errors (stmt)
`(let ((ret (handler-case (cons ,stmt nil) `(let ((ret (handler-case (cons ,stmt nil)
(t (c) (cons nil c))))) (t (c) (cons nil c)))))
@ -448,13 +470,15 @@
; --- reader macros ; --- reader macros
(defun sexpr-reader (stream char &key (func 'val)) (defun sexpr-reader (stream char &key (func 'val) (unset t) (keep-char t))
"Read next token only if S expression, else return as is" "Read next token only if S expression, else return as is"
(if (char= (peek-char t stream t nil t) #\() (if (char= (peek-char t stream t nil t) #\()
(values (funcall func (read stream t nil t)) t) (values (funcall func (read stream t nil t)) t)
(let ((*readtable* (copy-readtable))) (let ((*readtable* (copy-readtable)))
(set-macro-character char nil) (and unset (set-macro-character char nil))
(values (read-from-string (strcat (string char) (write-to-string (read stream t nil t)))) nil)))) (if keep-char
(values (read-from-string (strcat (string char) (write-to-string (read stream t nil t)))) nil)
(values (read stream t nil t) nil)))))
(defun not-reader (stream char) (defun not-reader (stream char)
(declare (ignore char)) (declare (ignore char))

Loading…
Cancel
Save