From 09816397bfa39bd4b3c85e9f5fc05d30b073bacb Mon Sep 17 00:00:00 2001 From: "Kevin M. Rosenberg" Date: Sat, 25 Sep 2004 13:32:14 +0000 Subject: [PATCH 1/1] r10035: --- io.lisp | 15 +++++++++++++-- package.lisp | 1 + strings.lisp | 13 ++++++++----- 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/io.lisp b/io.lisp index ba68048..aedca99 100644 --- a/io.lisp +++ b/io.lisp @@ -43,6 +43,17 @@ (with-open-file (in file :direction :input) (read-stream-to-string in)))) +(defun read-file-to-usb8-array (file) + "Opens a reads a file. Returns the contents as single unsigned-byte array" + (with-open-file (in file :direction :input) + (let* ((file-len (file-length in)) + (usb8 (make-array file-len :element-type '(unsigned-byte 8))) + (pos (read-sequence usb8 in))) + (unless (= file-len pos) + (error "Length read (~D) doesn't match file length (~D)~%" pos file-len)) + usb8))) + + (defun read-stream-to-strings (in) (let ((lines '()) (eof (gensym))) @@ -311,8 +322,8 @@ (write-char #\: stream) (write-string (aref +datetime-number-strings+ minute) stream))) -(defun copy-binary-stream (in out) - (do* ((buf (make-array 4096 :element-type '(unsigned-byte 8))) +(defun copy-binary-stream (in out &key (chunk-size 4096)) + (do* ((buf (make-array chunk-size :element-type '(unsigned-byte 8))) (pos (read-sequence buf in) (read-sequence buf in))) ((zerop pos)) (write-sequence buf out :end pos))) diff --git a/package.lisp b/package.lisp index fe5e7a4..5f10fb9 100644 --- a/package.lisp +++ b/package.lisp @@ -174,6 +174,7 @@ #:print-file-contents #:read-stream-to-string #:read-file-to-string + #:read-file-to-usb8-array #:read-stream-to-strings #:read-file-to-strings diff --git a/strings.lisp b/strings.lisp index 0c5ae7c..a9b3d0f 100644 --- a/strings.lisp +++ b/strings.lisp @@ -227,17 +227,20 @@ list of characters and replacement strings." (defun make-usb8-array (len) (make-array len :element-type '(unsigned-byte 8))) -(defun usb8-array-to-string (vec) - (declare (type (simple-array (unsigned-byte 8) (*)) vec)) - (let* ((len (length vec)) +(defun usb8-array-to-string (vec &key (start 0) end) + (declare (type (simple-array (unsigned-byte 8) (*)) vec) + (fixnum start)) + (unless end + (setq end (length vec))) + (let* ((len (- end start)) (str (make-string len))) (declare (fixnum len) (simple-string str) - (optimize (speed 3))) + (optimize (speed 3) (safety 0))) (do ((i 0 (1+ i))) ((= i len) str) (declare (fixnum i)) - (setf (schar str i) (code-char (aref vec i)))))) + (setf (schar str i) (code-char (aref vec (the fixnum (+ i start)))))))) (defun string-to-usb8-array (str) (declare (simple-string str)) -- 2.34.1