source: branches/portable/lw-inspector.lisp@ 31

Last change on this file since 31 was 7, checked in by Gail Zacharias, 17 years ago

Credit for Anvita

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