stream.lisp 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. (in-package :hurd-streams)
  2. (defclass hurd-stream (trivial-gray-stream-mixin)
  3. ((port :initform nil
  4. :initarg :port
  5. :accessor port)
  6. (offset :initform 0
  7. :accessor offset)))
  8. (defmethod initialize-instance :after ((stream hurd-stream) &rest initargs)
  9. (declare (ignore initargs))
  10. (with-accessors ((port port))
  11. stream
  12. (unless (port-valid-p port)
  13. (error "Port not valid: ~A" port))))
  14. (defmethod print-object ((istream hurd-stream) stream)
  15. (format stream "#<HURD-STREAM port=~a offset=~a>"
  16. (port istream)
  17. (offset istream)))
  18. (defmethod open-stream-p ((stream hurd-stream))
  19. "Returns a true value if STREAM is open."
  20. (port-valid-p (port stream)))
  21. (defmethod close ((stream hurd-stream) &key abort)
  22. "Closes the stream STREAM."
  23. (declare (ignore abort))
  24. (when (open-stream-p stream)
  25. (port-deallocate (port stream))
  26. (setf (port stream) nil)))
  27. (defmethod stream-element-type ((stream hurd-stream))
  28. "The element type is always unsigned-byte 8."
  29. '(unsigned-byte 8))
  30. (defmethod stream-file-position ((stream hurd-stream))
  31. (offset stream))
  32. (defmethod (setf stream-file-position) (position (stream hurd-stream))
  33. "Sets the file offfset."
  34. (case position
  35. (:end
  36. (setf (offset stream)
  37. (io-seek (port stream)
  38. :offset 0
  39. :whence :seek-end)))
  40. (otherwise
  41. (when (eq position :start)
  42. (setf position 0))
  43. (let ((new-offset (io-seek (port stream)
  44. :offset position
  45. :whence :seek-set)))
  46. (setf (offset stream) new-offset)))))
  47. (defmethod hurd-stream-file-length ((stream hurd-stream))
  48. "Returns stream file length."
  49. (let ((stat (io-stat (port stream))))
  50. (stat-get stat 'st-size)))
  51. (defun %create-adjustable-array (&optional (size 0))
  52. (make-array size
  53. :fill-pointer size
  54. :adjustable t
  55. :element-type '(unsigned-byte 8)))