byte printer

main
Matthew Butterick 5 years ago
parent 2032c17a4c
commit 5c35cc8be1

@ -1,5 +1,5 @@
#lang racket/base #lang racket/base
(require racket/match racket/dict "int.rkt" "base.rkt") (require racket/match racket/dict racket/format racket/string racket/sequence "int.rkt" "base.rkt")
(provide (all-defined-out)) (provide (all-defined-out))
(define (length-resolvable? x) (define (length-resolvable? x)
@ -14,25 +14,32 @@
[(? x:int?) #:when port (decode x port)] [(? x:int?) #:when port (decode x port)]
[_ (raise-argument-error 'resolve-length "fixed-size argument" x)])) [_ (raise-argument-error 'resolve-length "fixed-size argument" x)]))
(define-values (PropertyDescriptor-prop PropertyDescriptor? _) (define (pretty-print-bytes bstr
(make-impersonator-property 'PropertyDescriptor)) #:radix [radix 16]
#:offset-min-width [offset-min-width 4]
(define (PropertyDescriptor [opts (make-hash)]) #:row-length [bytes-per-row 16]
(define mh (make-hash)) #:max-value [max-value 256])
(for ([(k v) (in-hash opts)]) (define bs (bytes->list bstr))
(hash-set! mh k v)) (define offset-str-length
(impersonate-hash mh (max offset-min-width
(λ (h k) (values k (λ (h k v) v))) (string-length (let ([lbs (length bs)])
(λ (h k v) (values k v)) (~r (- lbs (remainder lbs bytes-per-row)))))))
(λ (h k) k) (display
(λ (h k) k) (string-join
PropertyDescriptor-prop (for/list ([row-bs (in-slice bytes-per-row bs)]
#true)) [ridx (in-naturals)])
(string-append
(module+ test (let ([idxstr (~r (* ridx bytes-per-row))])
(require rackunit) (string-append idxstr
(define pd (PropertyDescriptor)) (make-string (- offset-str-length (string-length idxstr)) #\space)))
(hash-set! pd 'k 42) " "
(check-equal? (hash-ref pd 'k) 42) (string-join
(check-true (PropertyDescriptor? pd)) (let* ([max-digit-width (string-length (~r (sub1 max-value) #:base radix))]
(check-true (hash? pd))) [strs (for/list ([b (in-list row-bs)])
(~r b #:base radix #:min-width max-digit-width #:pad-string "0"))])
(for/list ([2strs (in-slice 2 strs)])
(string-join 2strs "·"))) " ")
(let ([shortfall (* (- bytes-per-row (length row-bs)) 3)])
(make-string shortfall #\space))
" "
(format "~a" (bytes->string/utf-8 (apply bytes row-bs))))) "\n")))
Loading…
Cancel
Save