mixin.lisp 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. (in-package :trivial-gray-streams)
  2. (defclass trivial-gray-stream-mixin () ())
  3. (defgeneric stream-read-sequence
  4. (stream sequence start end &key &allow-other-keys))
  5. (defgeneric stream-write-sequence
  6. (stream sequence start end &key &allow-other-keys))
  7. (defgeneric stream-file-position (stream))
  8. (defgeneric (setf stream-file-position) (newval stream))
  9. (defmethod stream-write-string
  10. ((stream trivial-gray-stream-mixin) seq &optional start end)
  11. (stream-write-sequence stream seq (or start 0) (or end (length seq))))
  12. ;; Implementations should provide this default method, I believe, but
  13. ;; at least sbcl and allegro don't.
  14. (defmethod stream-terpri ((stream trivial-gray-stream-mixin))
  15. (write-char #\newline stream))
  16. (defmethod stream-file-position ((stream trivial-gray-stream-mixin))
  17. nil)
  18. (defmethod (setf stream-file-position)
  19. (newval (stream trivial-gray-stream-mixin))
  20. (declare (ignore newval))
  21. nil)
  22. #+allegro
  23. (progn
  24. (defmethod excl:stream-read-sequence
  25. ((s trivial-gray-stream-mixin) seq &optional start end)
  26. (stream-read-sequence s seq (or start 0) (or end (length seq))))
  27. (defmethod stream:stream-write-sequence
  28. ((s trivial-gray-stream-mixin) seq &optional start end)
  29. (stream-write-sequence s seq (or start 0) (or end (length seq)))))
  30. #+cmu
  31. (progn
  32. (defmethod ext:stream-read-sequence
  33. ((s trivial-gray-stream-mixin) seq &optional start end)
  34. (stream-read-sequence s seq (or start 0) (or end (length seq))))
  35. (defmethod ext:stream-write-sequence
  36. ((s trivial-gray-stream-mixin) seq &optional start end)
  37. (stream-write-sequence s seq (or start 0) (or end (length seq)))))
  38. #+lispworks
  39. (progn
  40. (defmethod stream:stream-read-sequence
  41. ((s trivial-gray-stream-mixin) seq start end)
  42. (stream-read-sequence s seq start end))
  43. (defmethod stream:stream-write-sequence
  44. ((s trivial-gray-stream-mixin) seq start end)
  45. (stream-write-sequence s seq start end))
  46. (defmethod stream:stream-file-position ((stream trivial-gray-stream-mixin))
  47. (stream-file-position stream))
  48. (defmethod (setf stream:stream-file-position)
  49. (newval (stream trivial-gray-stream-mixin))
  50. (setf (stream-file-position stream) newval)))
  51. #+openmcl
  52. (progn
  53. (defmethod ccl:stream-read-vector
  54. ((s trivial-gray-stream-mixin) seq start end)
  55. (stream-read-sequence s seq start end))
  56. (defmethod ccl:stream-write-vector
  57. ((s trivial-gray-stream-mixin) seq start end)
  58. (stream-write-sequence s seq start end)))
  59. ;; up to version 2.43 there were no
  60. ;; stream-read-sequence, stream-write-sequence
  61. ;; functions in CLISP
  62. #+clisp
  63. (eval-when (:compile-toplevel :load-toplevel :execute)
  64. (when (find-symbol "STREAM-READ-SEQUENCE" "GRAY")
  65. (pushnew :clisp-has-stream-read/write-sequence *features*)))
  66. #+clisp
  67. (progn
  68. #+clisp-has-stream-read/write-sequence
  69. (defmethod gray:stream-read-sequence
  70. (seq (s trivial-gray-stream-mixin) &key start end)
  71. (stream-read-sequence s seq (or start 0) (or end (length seq))))
  72. #+clisp-has-stream-read/write-sequence
  73. (defmethod gray:stream-write-sequence
  74. (seq (s trivial-gray-stream-mixin) &key start end)
  75. (stream-write-sequence s seq (or start 0) (or end (length seq))))
  76. ;; Even despite the stream-read/write-sequence are present in newer
  77. ;; CLISP, it's better to provide stream-(read/write)-(byte/char)-sequence
  78. ;; methods too.
  79. ;; Example: if fundamental-binary-input-stream comes in the
  80. ;; class precedence list of your user-defined stream before
  81. ;; the trivial-gray-steam-mixin, the default CLISP's implementation
  82. ;; of the gray:stream-read-sequence will be used; and this default
  83. ;; implementation calls the gray:stream-read-byte-sequence.
  84. ;; Therefore we override gray:stream-read-byte-sequence and call
  85. ;; our stream-read-sequence.
  86. (defmethod gray:stream-read-byte-sequence
  87. ((s trivial-gray-stream-mixin)
  88. seq
  89. &optional start end no-hang interactive)
  90. (when no-hang
  91. (error "this stream does not support the NO-HANG argument"))
  92. (when interactive
  93. (error "this stream does not support the INTERACTIVE argument"))
  94. (stream-read-sequence s seq start end))
  95. (defmethod gray:stream-write-byte-sequence
  96. ((s trivial-gray-stream-mixin)
  97. seq
  98. &optional start end no-hang interactive)
  99. (when no-hang
  100. (error "this stream does not support the NO-HANG argument"))
  101. (when interactive
  102. (error "this stream does not support the INTERACTIVE argument"))
  103. (stream-write-sequence s seq start end))
  104. (defmethod gray:stream-read-char-sequence
  105. ((s trivial-gray-stream-mixin) seq &optional start end)
  106. (stream-read-sequence s seq start end))
  107. (defmethod gray:stream-write-char-sequence
  108. ((s trivial-gray-stream-mixin) seq &optional start end)
  109. (stream-write-sequence s seq start end))
  110. (defmethod gray:stream-position ((stream trivial-gray-stream-mixin) position)
  111. (if position
  112. (setf (stream-file-position stream) position)
  113. (stream-file-position stream))))
  114. #+sbcl
  115. (progn
  116. (defmethod sb-gray:stream-read-sequence
  117. ((s trivial-gray-stream-mixin) seq &optional start end)
  118. (stream-read-sequence s seq (or start 0) (or end (length seq))))
  119. (defmethod sb-gray:stream-write-sequence
  120. ((s trivial-gray-stream-mixin) seq &optional start end)
  121. (stream-write-sequence s seq (or start 0) (or end (length seq))))
  122. (defmethod sb-gray:stream-file-position
  123. ((stream trivial-gray-stream-mixin) &optional position)
  124. (if position
  125. (setf (stream-file-position stream) position)
  126. (stream-file-position stream)))
  127. ;; SBCL extension:
  128. (defmethod sb-gray:stream-line-length ((stream trivial-gray-stream-mixin))
  129. 80))
  130. #+ecl
  131. (progn
  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))))
  135. (defmethod gray:stream-write-sequence
  136. ((s trivial-gray-stream-mixin) seq &optional start end)
  137. (stream-write-sequence s seq (or start 0) (or end (length seq)))))