1 ;;;; -*- Mode: Lisp; indent-tabs-mode: nil -*-
3 ;;; --- GRAY stream mixin.
6 (in-package :iolib.common-lisp
)
8 (defclass trivial-gray-stream-mixin
()
11 (defmethod close ((s trivial-gray-stream-mixin
) &key abort
)
12 (declare (ignore abort
))
13 (prog1 (slot-value s
'%open
)
14 (setf (slot-value s
'%open
) nil
)))
16 (defmethod open-stream-p ((s trivial-gray-stream-mixin
))
17 (slot-value s
'%open
))
19 (defgeneric stream-read-sequence
20 (stream sequence start end
&key
&allow-other-keys
))
22 (defgeneric stream-write-sequence
23 (stream sequence start end
&key
&allow-other-keys
))
25 (defgeneric stream-file-position
(stream))
27 (defgeneric (setf stream-file-position
) (newval stream
))
29 (defmethod stream-write-string
30 ((stream trivial-gray-stream-mixin
) seq
&optional start end
)
31 (stream-write-sequence stream seq
(or start
0) (or end
(length seq
))))
33 ;; Implementations should provide this default method, I believe, but
34 ;; at least sbcl and allegro don't.
35 (defmethod stream-terpri ((stream trivial-gray-stream-mixin
))
36 (write-char #\newline stream
))
38 (defmethod stream-file-position ((stream trivial-gray-stream-mixin
))
41 (defmethod (setf stream-file-position
)
42 (newval (stream trivial-gray-stream-mixin
))
43 (declare (ignore newval
))
48 (defmethod excl:stream-read-sequence
49 ((s trivial-gray-stream-mixin
) seq
&optional start end
)
50 (stream-read-sequence s seq
(or start
0) (or end
(length seq
))))
52 (defmethod excl:stream-write-sequence
53 ((s trivial-gray-stream-mixin
) seq
&optional start end
)
54 (stream-write-sequence s seq
(or start
0) (or end
(length seq
)))))
58 (defmethod ext:stream-read-sequence
59 ((s trivial-gray-stream-mixin
) seq
&optional start end
)
60 (stream-read-sequence s seq
(or start
0) (or end
(length seq
))))
62 (defmethod ext:stream-write-sequence
63 ((s trivial-gray-stream-mixin
) seq
&optional start end
)
64 (stream-write-sequence s seq
(or start
0) (or end
(length seq
)))))
68 (defmethod stream:stream-read-sequence
69 ((s trivial-gray-stream-mixin
) seq start end
)
70 (stream-read-sequence s seq start end
))
72 (defmethod stream:stream-write-sequence
73 ((s trivial-gray-stream-mixin
) seq start end
)
74 (stream-write-sequence s seq start end
))
76 (defmethod stream:stream-file-position
((stream trivial-gray-stream-mixin
))
77 (stream-file-position stream
))
79 (defmethod (setf stream
:stream-file-position
)
80 (newval (stream trivial-gray-stream-mixin
))
81 (setf (stream-file-position stream
) newval
)))
85 (defmethod ccl:stream-read-vector
86 ((s trivial-gray-stream-mixin
) seq start end
)
87 (stream-read-sequence s seq start end
))
89 (defmethod ccl:stream-write-vector
90 ((s trivial-gray-stream-mixin
) seq start end
)
91 (stream-write-sequence s seq start end
)))
94 (eval-when (:compile-toplevel
:load-toplevel
:execute
)
95 (let* ((pkg (find-package :gray
))
96 (sym (and pkg
(find-symbol (string '#:stream-read-sequence
) pkg
))))
97 (unless (and sym
(fboundp sym
))
98 (error "Your CLISP does not have ~A and is therefore unsupported"
99 "gray:stream-read-sequence"))))
103 (defmethod gray:stream-read-sequence
104 ((s trivial-gray-stream-mixin
) seq
&key start end
)
105 (stream-read-sequence s seq
(or start
0) (or end
(length seq
))))
107 (defmethod gray:stream-write-sequence
108 ((s trivial-gray-stream-mixin
) seq
&key start end
)
109 (stream-write-sequence s seq
(or start
0) (or end
(length seq
))))
111 (defmethod gray:stream-position
((stream trivial-gray-stream-mixin
) position
)
113 (setf (stream-file-position stream
) position
)
114 (stream-file-position stream
))))
118 (defmethod sb-gray:stream-read-sequence
119 ((s trivial-gray-stream-mixin
) seq
&optional start end
)
120 (stream-read-sequence s seq
(or start
0) (or end
(length seq
))))
122 (defmethod sb-gray:stream-write-sequence
123 ((s trivial-gray-stream-mixin
) seq
&optional start end
)
124 (stream-write-sequence s seq
(or start
0) (or end
(length seq
))))
127 (defmethod sb-gray:stream-line-length
((stream trivial-gray-stream-mixin
))
132 (defmethod gray:stream-read-sequence
133 ((s trivial-gray-stream-mixin
) seq
&optional start end
)
134 (stream-read-sequence s seq
(or start
0) (or end
(length seq
))))
136 (defmethod gray:stream-write-sequence
137 ((s trivial-gray-stream-mixin
) seq
&optional start end
)
138 (stream-write-sequence s seq
(or start
0) (or end
(length seq
)))))