File: buffer.scm

package info (click to toggle)
scheme48 1.8%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 14,980 kB
  • ctags: 14,127
  • sloc: lisp: 76,272; ansic: 71,514; sh: 3,026; makefile: 637
file content (75 lines) | stat: -rw-r--r-- 2,244 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
; Copyright (c) 1993-2008 by Richard Kelsey.  See file COPYING.


; (port->stream port type) -> stream or error value
; (
;
;
;


(define-record-type stream :stream
  (make-stream port type buffer size loc limit)
  (port   input-port stream-port set-stream-port!)
  (type   integer stream-type set-stream-type!)
  ;; pointer the start of the buffer
  (buffer address stream-buffer set-stream-buffer!)
  (size   integer stream-size set-stream-size!)
  ;; pointer to the next char to be read or the next slot to be written
  (loc    address stream-loc set-stream-loc!)
  ;; end of the available caharacters
  (limit  address stream-limit set-stream-limit!))

(define-record-type z :z
  (make-z a)
  (a stream z-a set-z-a!))

(define buffer-size 1024)

(define (port->stream port type)
  (let* ((buffer (allocate-memory buffer-size))
	 (stream (make-stream port type buffer buffer-size buffer buffer)))
    (if (or ; (null-memory? buffer)
	 (null-pointer? stream))
	(error "out of memory"))
    (make-z stream)))

(define (stream-read-char stream)
  (let ((loc (stream-loc stream)))
    (cond ((address< loc (stream-limit stream))
	   (let ((ch (unsigned-byte-ref loc)))
	     (set-stream-loc! stream (address+ (stream-loc stream) 1))
	     ch))
	  (else
	   (let ((buffer (stream-buffer stream)))
	     (call-with-values
	      (lambda ()
		(read-block (stream-port stream)
			    buffer
			    (stream-size stream)))
	      (lambda (count ignore status)
		(cond ((= count 0)   ; EOF
		       0)
		      (else
		       (set-stream-loc! stream (address+ buffer 1))
		       (set-stream-limit! stream (address+ buffer count))
		       (unsigned-byte-ref buffer))))))))))

; this will need to be PCLUSR'd.

(define (stream-write-char stream char)
  (let ((loc (stream-loc stream)))
    (cond ((< loc (stream-limit stream))
	   (unsigned-byte-set! loc char)
	   (set-stream-loc! stream (+ 1 (stream-loc stream))))
	  (else
	   (let* ((buffer (stream-buffer stream))
		  (count (write-block (stream-port stream)
				      buffer
				      (stream-limit stream))))
	     (cond ((= count 0)   ; EOF
		    0)
		   (else
		    (set-stream-loc! stream (+ buffer 1))
		    (set-stream-limit! stream (+ buffer count))
		    (unsigned-byte-ref buffer))))))))