| 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))))
|
|---|