source: branches/lispworks/lw-inspector.lisp@ 41

Last change on this file since 41 was 36, checked in by Gail Zacharias, 9 years ago

Update to current eRef version

  • Property svn:eol-style set to native
File size: 2.8 KB
Line 
1;;;-*- Mode: Lisp; Package: WOOD -*-
2
3(in-package :wood)
4
5
6(defconstant *hex-digits* "0123456789ABCDEF")
7
8(defun encode-hex (value string index digits-left)
9 (if (eql digits-left 0)
10 index
11 (let* ((r (logand value #xf))
12 (q (ash value -4))
13 (i (encode-hex q string index (1- digits-left))))
14 (setf (schar string i) (schar *hex-digits* r))
15 (1+ i))))
16
17(defun encode-hex-line (vector start)
18 (let ((end (length vector))
19 (value (make-string (+ 36 1 16)
20 :initial-element #\space
21 :element-type 'base-character)))
22 (flet ((enc (offset value index)
23 (incf offset start)
24 (when (< offset end)
25 (encode-hex (%%load-unsigned-word vector offset) value index 4))))
26 (enc 0 value 0)
27 (enc 2 value 4)
28 (enc 4 value 9)
29 (enc 6 value 13)
30 (enc 8 value 18)
31 (enc 10 value 22)
32 (enc 12 value 27)
33 (enc 14 value 31))
34 (flet ((loadch (str i)
35 (declare (type (simple-array base-char (*)) str)
36 (type fixnum i)
37 (optimize (speed 3) (safety 0)))
38 (schar str i)))
39 (dotimes (i 16)
40 (let ((char (if (< (+ start i) end) (loadch vector (+ start i)) #\Null)))
41 (setf (schar value (+ 37 i))
42 (if (graphic-char-p char) char #\.)))))
43 value))
44
45
46
47
48(defparameter *disk-cache-inspector-buffer*
49 (make-string 16 :element-type 'base-character))
50
51(defmethod lw:get-inspector-values ((disk-cache disk-cache) (mode (eql 'disk-cache-data)))
52 (let* ((size (disk-cache-size disk-cache))
53 (line-count (ceiling size 16))
54 (buffer *disk-cache-inspector-buffer*))
55 (loop for address from 0 below (* line-count 16) by 16
56 collect (let ((label (make-string 8 :initial-element #\space :element-type 'base-char)))
57 (encode-hex address label 0 8)
58 label) into labels
59 collect (progn
60 (fill buffer #\Null)
61 (read-string disk-cache address (min 16 (- size address)) buffer)
62 (encode-hex-line buffer 0)) into values
63 finally return (values labels values))))
64
65
66#+debugging-wood
67(defmethod lw:get-inspector-values ((vector vector) (mode (eql 'hex-data)))
68 (unless (equal (array-element-type vector) '(unsigned-byte 8))
69 (return-from lw:get-inspector-values nil))
70 (let* ((size (length vector))
71 (line-count (ceiling size 16)))
72 (loop for address from 0 below (* line-count 16) by 16
73 collect (let ((label (make-string 8 :initial-element #\space :element-type 'base-char)))
74 (encode-hex address label 0 8)
75 label) into labels
76 collect (encode-hex-line vector address) into values
77 finally return (values labels values))))
Note: See TracBrowser for help on using the repository browser.