-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrecord.lisp
More file actions
49 lines (41 loc) · 1.74 KB
/
record.lisp
File metadata and controls
49 lines (41 loc) · 1.74 KB
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
;; record.lisp
(in-package :record)
(defclass record ()
((value
:initarg :value
:accessor record-value
:documentation "Time record stored as unix timestamp int32")))
(defun make-record (&optional (sec 0))
(make-instance 'record :value sec))
(defun make-random-record ()
(make-instance 'record :value (random (get-universal-time))))
(defun seq-read-i4 (buf)
(let ((i4 0))
(declare (fixnum i4) ((vector (unsigned-byte 8)) buf))
(setf (ldb (byte 8 24) i4) (vector-pop buf))
(setf (ldb (byte 8 16) i4) (vector-pop buf))
(setf (ldb (byte 8 8) i4) (vector-pop buf))
(setf (ldb (byte 8 0) i4) (vector-pop buf))
(- (ldb (byte 32 0) (+ i4 (ash 1 31))) (ash 1 31))))
(defun seq-write-i4 (i4 buf)
(declare (fixnum i4) ((vector (unsigned-byte 8)) buf))
(when (= (length buf) (array-total-size buf))
(error "overflow"))
(vector-push (ldb (byte 8 24) i4) buf)
(vector-push (ldb (byte 8 16) i4) buf)
(vector-push (ldb (byte 8 8) i4) buf)
(vector-push (ldb (byte 8 0) i4) buf))
(defmethod print-object ((r record) stream)
(print-unreadable-object (r stream :type t)
(multiple-value-bind (second minute hour date month year) (decode-universal-time (record-value r))
(format stream "~2,'0d:~2,'0d:~2,'0d ~2,'0d/~2,'0d/~S" hour minute second date month year))))
(defmethod write-record-to-stream ((r record) stream)
(let ((buf (make-array 4 :fill-pointer 0 :element-type '(unsigned-byte 8))))
(seq-write-i4 (record-value r) buf)
(write-sequence buf stream)))
(defun read-record-from-stream (stream)
(let ((buf (make-array 4 :fill-pointer 4 :element-type '(unsigned-byte 8)))
(rc (make-record)))
(read-sequence buf stream)
(setf (record-value rc) (seq-read-i4 (nreverse buf)))
rc))