buffer.scm 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. ; Part of Scheme 48 1.9. See file COPYING for notices and license.
  2. ; Authors: Richard Kelsey, Mike Sperber
  3. ; (port->stream port type) -> stream or error value
  4. ; (
  5. ;
  6. ;
  7. ;
  8. (define-record-type stream :stream
  9. (make-stream port type buffer size loc limit)
  10. (port input-port stream-port set-stream-port!)
  11. (type integer stream-type set-stream-type!)
  12. ;; pointer the start of the buffer
  13. (buffer address stream-buffer set-stream-buffer!)
  14. (size integer stream-size set-stream-size!)
  15. ;; pointer to the next char to be read or the next slot to be written
  16. (loc address stream-loc set-stream-loc!)
  17. ;; end of the available caharacters
  18. (limit address stream-limit set-stream-limit!))
  19. (define-record-type z :z
  20. (make-z a)
  21. (a stream z-a set-z-a!))
  22. (define buffer-size 1024)
  23. (define (port->stream port type)
  24. (let* ((buffer (allocate-memory buffer-size))
  25. (stream (make-stream port type buffer buffer-size buffer buffer)))
  26. (if (or ; (null-memory? buffer)
  27. (null-pointer? stream))
  28. (error "out of memory"))
  29. (make-z stream)))
  30. (define (stream-read-char stream)
  31. (let ((loc (stream-loc stream)))
  32. (cond ((address< loc (stream-limit stream))
  33. (let ((ch (unsigned-byte-ref loc)))
  34. (set-stream-loc! stream (address+ (stream-loc stream) 1))
  35. ch))
  36. (else
  37. (let ((buffer (stream-buffer stream)))
  38. (call-with-values
  39. (lambda ()
  40. (read-block (stream-port stream)
  41. buffer
  42. (stream-size stream)))
  43. (lambda (count ignore status)
  44. (cond ((= count 0) ; EOF
  45. 0)
  46. (else
  47. (set-stream-loc! stream (address+ buffer 1))
  48. (set-stream-limit! stream (address+ buffer count))
  49. (unsigned-byte-ref buffer))))))))))
  50. ; this will need to be PCLUSR'd.
  51. (define (stream-write-char stream char)
  52. (let ((loc (stream-loc stream)))
  53. (cond ((< loc (stream-limit stream))
  54. (unsigned-byte-set! loc char)
  55. (set-stream-loc! stream (+ 1 (stream-loc stream))))
  56. (else
  57. (let* ((buffer (stream-buffer stream))
  58. (count (write-block (stream-port stream)
  59. buffer
  60. (stream-limit stream))))
  61. (cond ((= count 0) ; EOF
  62. 0)
  63. (else
  64. (set-stream-loc! stream (+ buffer 1))
  65. (set-stream-limit! stream (+ buffer count))
  66. (unsigned-byte-ref buffer))))))))