changelog shortlog graph tags branches changeset files file revisions raw help

Mercurial > demo / annotate examples/db/xdb/io.lisp

changeset 41: 81b7333f27f8
author: Richard Westhaver <ellis@rwest.io>
date: Sun, 16 Jun 2024 22:15:04 -0400
permissions: -rw-r--r--
description: more examples
41
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
1
 ;;; io/blob.lisp --- Blob Database IO
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
2
 
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
3
 ;;
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
4
 
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
5
 ;;; Code:
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
6
 (in-package :xdb)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
7
 
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
8
 ;;; IO
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
9
 (defvar *fsync-data* nil)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
10
 
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
11
 (defconstant +buffer-size+ 8192)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
12
 
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
13
 (deftype word () 'sb-ext:word)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
14
 
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
15
 (defstruct (input-stream
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
16
             (:predicate nil))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
17
   (fd nil :type word)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
18
   (left 0 :type word)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
19
   (buffer-start (sb-sys:sap-int
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
20
                  (sb-alien::%make-alien (* sb-vm:n-byte-bits
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
21
                                            (+ +buffer-size+ 3))))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
22
    :type word)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
23
   (buffer-end 0 :type word)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
24
   (buffer-position 0 :type word))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
25
 
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
26
 (defstruct (output-stream
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
27
             (:predicate nil))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
28
   (fd nil :type word)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
29
   (buffer-start (sb-sys:sap-int
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
30
                  (sb-alien::%make-alien (* sb-vm:n-byte-bits
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
31
                                            (+ +buffer-size+ 3))))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
32
                 :type word)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
33
   (buffer-end 0 :type word)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
34
   (buffer-position 0 :type word))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
35
 
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
36
 (defun open-file (file-stream
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
37
                   &key direction)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
38
   (if (eql direction :output)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
39
       (let ((output (make-output-stream
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
40
                      :fd (sb-sys:fd-stream-fd file-stream))))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
41
         (setf (output-stream-buffer-position output)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
42
               (output-stream-buffer-start output)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
43
               (output-stream-buffer-end output)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
44
               (+ (output-stream-buffer-start output)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
45
                  +buffer-size+))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
46
         output)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
47
       (make-input-stream
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
48
        :fd (sb-sys:fd-stream-fd file-stream)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
49
        :left (file-length file-stream))))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
50
 
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
51
 (defun close-input-stream (stream)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
52
   (sb-alien:alien-funcall
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
53
    (sb-alien:extern-alien "free"
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
54
                           (function (values) sb-alien:long))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
55
    (input-stream-buffer-start stream)))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
56
 
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
57
 (defun close-output-stream (stream)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
58
   (flush-buffer stream)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
59
   (sb-alien:alien-funcall
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
60
    (sb-alien:extern-alien "free"
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
61
                           (function (values) sb-alien:long))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
62
    (output-stream-buffer-start stream)))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
63
 
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
64
 (declaim (inline stream-end-of-file-p))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
65
 (defun stream-end-of-file-p (stream)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
66
   (and (>= (input-stream-buffer-position stream)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
67
            (input-stream-buffer-end stream))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
68
        (zerop (input-stream-left stream))))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
69
 
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
70
 (declaim (inline sap-ref-24))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
71
 (defun sap-ref-24 (sap offset)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
72
   (declare (optimize speed (safety 0))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
73
            (fixnum offset))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
74
   (mask-field (byte 24 0) (sb-sys:sap-ref-32 sap offset)))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
75
 
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
76
 (declaim (inline n-sap-ref))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
77
 (defun n-sap-ref (n sap &optional (offset 0))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
78
   (funcall (ecase n
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
79
              (1 #'sb-sys:sap-ref-8)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
80
              (2 #'sb-sys:sap-ref-16)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
81
              (3 #'sap-ref-24)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
82
              (4 #'sb-sys:sap-ref-32))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
83
            sap
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
84
            offset))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
85
 
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
86
 (declaim (inline unix-read))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
87
 (defun unix-read (fd buf len)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
88
   (declare (optimize (sb-c::float-accuracy 0)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
89
                      (space 0)))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
90
   (declare (type sb-unix::unix-fd fd)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
91
            (type word len))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
92
   (sb-alien:alien-funcall
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
93
    (sb-alien:extern-alien "read"
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
94
                           (function sb-alien:int
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
95
                                     sb-alien:int sb-alien:long sb-alien:int))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
96
    fd buf len))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
97
 
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
98
 (declaim (inline unix-read))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
99
 (defun unix-write (fd buf len)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
100
   (declare (optimize (sb-c::float-accuracy 0)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
101
                      (space 0)))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
102
   (declare (type sb-unix::unix-fd fd)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
103
            (type word len))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
104
   (sb-alien:alien-funcall
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
105
    (sb-alien:extern-alien "write"
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
106
                           (function sb-alien:int
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
107
                                     sb-alien:int sb-alien:long sb-alien:int))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
108
    fd buf len))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
109
 
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
110
 (defun fill-buffer (stream offset)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
111
   (let ((length (unix-read (input-stream-fd stream)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
112
                            (+ (input-stream-buffer-start stream) offset)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
113
                            (- +buffer-size+ offset))))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
114
     (setf (input-stream-buffer-end stream)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
115
           (+ (input-stream-buffer-start stream) (+ length offset)))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
116
     (decf (input-stream-left stream) length))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
117
   t)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
118
 
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
119
 (defun refill-buffer (n stream)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
120
   (declare (type word n)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
121
            (input-stream stream))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
122
   (let ((left-n-bytes (- (input-stream-buffer-end stream)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
123
                          (input-stream-buffer-position stream))))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
124
     (when (> (- n left-n-bytes)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
125
              (input-stream-left stream))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
126
       (error "End of file ~a" stream))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
127
     (unless (zerop left-n-bytes)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
128
       (setf (sb-sys:sap-ref-word (sb-sys:int-sap (input-stream-buffer-start stream)) 0)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
129
             (n-sap-ref left-n-bytes (sb-sys:int-sap (input-stream-buffer-position stream)))))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
130
     (fill-buffer stream left-n-bytes))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
131
   (let ((start (input-stream-buffer-start stream)))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
132
     (setf (input-stream-buffer-position stream)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
133
           (+ start n)))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
134
   t)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
135
 
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
136
 (declaim (inline advance-input-stream))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
137
 (defun advance-input-stream (n stream)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
138
   (declare (optimize (space 0))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
139
            (type word n)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
140
            (type input-stream stream))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
141
   (let* ((sap (input-stream-buffer-position stream))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
142
          (new-sap (sb-ext:truly-the word (+ sap n))))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
143
     (declare (word sap new-sap))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
144
     (cond ((> new-sap (input-stream-buffer-end stream))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
145
            (refill-buffer n stream)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
146
            (sb-sys:int-sap (input-stream-buffer-start stream)))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
147
           (t
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
148
            (setf (input-stream-buffer-position stream)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
149
                  new-sap)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
150
            (sb-sys:int-sap sap)))))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
151
 
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
152
 (declaim (inline read-n-bytes))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
153
 (defun read-n-bytes (n stream)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
154
   (declare (optimize (space 0))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
155
            (type word n))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
156
   (n-sap-ref n (advance-input-stream n stream)))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
157
 
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
158
 (declaim (inline read-n-signed-bytes))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
159
 (defun read-n-signed-bytes (n stream)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
160
   (declare (optimize speed)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
161
            (sb-ext:muffle-conditions sb-ext:compiler-note)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
162
            (type (integer 1 4) n))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
163
   (funcall (ecase n
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
164
              (1 #'sb-sys:signed-sap-ref-8)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
165
              (2 #'sb-sys:signed-sap-ref-16)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
166
              ;; (3 )
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
167
              (4 #'sb-sys:signed-sap-ref-32))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
168
            (advance-input-stream n stream)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
169
            0))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
170
 
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
171
 (declaim (inline write-n-signed-bytes))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
172
 (defun write-n-signed-bytes (value n stream)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
173
   (declare (optimize speed)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
174
            (sb-ext:muffle-conditions sb-ext:compiler-note)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
175
            (fixnum n))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
176
   (ecase n
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
177
     (1 (setf (sb-sys:signed-sap-ref-8 (advance-output-stream n stream) 0)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
178
              value))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
179
     (2 (setf (sb-sys:signed-sap-ref-16 (advance-output-stream n stream) 0)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
180
              value))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
181
     ;; (3 )
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
182
     (4 (setf (sb-sys:signed-sap-ref-32 (advance-output-stream n stream) 0)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
183
              value)))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
184
   t)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
185
 
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
186
 (defun flush-buffer (stream)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
187
   (unix-write (output-stream-fd stream)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
188
               (output-stream-buffer-start stream)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
189
               (- (output-stream-buffer-position stream)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
190
                  (output-stream-buffer-start stream))))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
191
 
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
192
 (declaim (inline advance-output-stream))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
193
 (defun advance-output-stream (n stream)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
194
   (declare (optimize (space 0) (safety 0))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
195
            (type word n)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
196
            (type output-stream stream)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
197
            ((integer 1 4) n))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
198
   (let* ((sap (output-stream-buffer-position stream))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
199
          (new-sap (sb-ext:truly-the word (+ sap n))))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
200
     (declare (word sap new-sap))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
201
     (cond ((> new-sap (output-stream-buffer-end stream))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
202
            (flush-buffer stream)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
203
            (setf (output-stream-buffer-position stream)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
204
                  (+ (output-stream-buffer-start stream)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
205
                     n))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
206
            (sb-sys:int-sap (output-stream-buffer-start stream)))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
207
           (t
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
208
            (setf (output-stream-buffer-position stream)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
209
                  new-sap)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
210
            (sb-sys:int-sap sap)))))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
211
 
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
212
 (declaim (inline write-n-bytes))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
213
 (defun write-n-bytes (value n stream)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
214
   (declare (optimize (space 0))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
215
            (type word n))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
216
   (setf (sb-sys:sap-ref-32
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
217
          (advance-output-stream n stream)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
218
          0)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
219
         value))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
220
 ;;;
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
221
 
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
222
 (declaim (inline copy-mem))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
223
 (defun copy-mem (from to length)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
224
   (let ((words-end (- length (rem length sb-vm:n-word-bytes))))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
225
     (loop for i by sb-vm:n-word-bytes below words-end
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
226
           do (setf (sb-sys:sap-ref-word to i)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
227
                    (sb-sys:sap-ref-word from i)))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
228
     (loop for i from words-end below length
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
229
           do (setf (sb-sys:sap-ref-8 to i)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
230
                    (sb-sys:sap-ref-8 from i)))))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
231
 
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
232
 (declaim (inline read-ascii-string-optimized))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
233
 (defun read-ascii-string-optimized (length string stream)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
234
   (declare (type fixnum length)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
235
            (optimize (speed 3))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
236
            )
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
237
   (sb-sys:with-pinned-objects (string)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
238
     (let ((sap (advance-input-stream length stream))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
239
           (string-sap (sb-sys:vector-sap string)))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
240
       (copy-mem sap string-sap length)))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
241
   string)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
242
 (defmacro with-io-file ((stream file
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
243
                          &key append (direction :input))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
244
                         &body body)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
245
   (let ((fd-stream (gensym)))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
246
     `(with-open-file (,fd-stream ,file
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
247
                                  :element-type '(unsigned-byte 8)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
248
                                  :direction ,direction
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
249
                                  ,@(and (eql direction :output)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
250
                                         `(:if-exists ,(if append
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
251
                                                           :append
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
252
                                                           :supersede)))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
253
                                  ,@(and append
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
254
                                         `(:if-does-not-exist :create)))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
255
        (let ((,stream (open-file ,fd-stream :direction ,direction)))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
256
          (unwind-protect
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
257
               (progn ,@body)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
258
            ,@(ecase direction
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
259
                (:output
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
260
                 `((close-output-stream ,stream)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
261
                   (when *fsync-data*
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
262
                     (sb-posix:fdatasync
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
263
                      (sb-sys:fd-stream-fd ,fd-stream)))))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
264
                (:input
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
265
                 `((close-input-stream ,stream)))))))))