commit 317831950795c10fa8ac2242bea21b4c3e726b54
parent aabe60928a8070ea42435e7202090c05e90424d9
Author: Tomas Hlavaty <tom@logand.com>
Date: Sat, 20 Sep 2014 13:38:07 +0200
writers added
Diffstat:
1 file changed, 18 insertions(+), 3 deletions(-)
diff --git a/rw.lisp b/rw.lisp
@@ -46,10 +46,12 @@
:slurp
:till
:wrap-reader
+ :wrap-writer
:write-octets
:write-u16
:write-u32
- :write-u8))
+ :write-u8
+ :writer))
(in-package :rw)
@@ -267,6 +269,15 @@
;; TODO next-u64|128
;; TODO next-s8|16|32|64|128
+(defun writer (x)
+ (etypecase x
+ ;;(list (lambda () (pop x)))
+ (vector
+ (if (adjustable-array-p x)
+ (lambda (v) (vector-push-extend v x))
+ (let ((i -1))
+ (lambda (v) (setf (aref x (incf i)) v)))))))
+
(defun char-writer (stream)
(lambda (x)
(write-char x stream)))
@@ -291,8 +302,8 @@
(defun copy (reader writer)
(do (x)
- ((not (setq x (next-u8 reader))))
- (write-u8 writer x)))
+ ((not (setq x (funcall reader))))
+ (funcall writer x)))
(defun write-octets (writer x)
(etypecase x
@@ -349,3 +360,7 @@
(let ((z (rw:next reader)))
(when z
(funcall fn z)))))
+
+(defun wrap-writer (writer fn)
+ (lambda (x)
+ (funcall writer (funcall fn x))))