116-hex-conv.scm (3233B)
1 ; Hex support for number->string, string->number, and format ~x. 2 ; Hex digits a-f are lowercase. 3 4 (define (eq-bv a b) (bytevector=? a b)) 5 6 ; ---- number->string with radix 16 ---- 7 8 (if (eq-bv "0" (number->string 0 16)) 0 (sys-exit 1)) 9 (if (eq-bv "1" (number->string 1 16)) 0 (sys-exit 2)) 10 (if (eq-bv "a" (number->string 10 16)) 0 (sys-exit 3)) 11 (if (eq-bv "f" (number->string 15 16)) 0 (sys-exit 4)) 12 (if (eq-bv "10" (number->string 16 16)) 0 (sys-exit 5)) 13 (if (eq-bv "ff" (number->string 255 16)) 0 (sys-exit 6)) 14 (if (eq-bv "100" (number->string 256 16)) 0 (sys-exit 7)) 15 (if (eq-bv "deadbeef" (number->string #xdeadbeef 16)) 0 (sys-exit 8)) 16 (if (eq-bv "-1" (number->string -1 16)) 0 (sys-exit 9)) 17 (if (eq-bv "-ff" (number->string -255 16)) 0 (sys-exit 10)) 18 19 ; Radix 10 still works (regression). 20 (if (eq-bv "42" (number->string 42 10)) 0 (sys-exit 11)) 21 (if (eq-bv "-7" (number->string -7 10)) 0 (sys-exit 12)) 22 23 ; ---- string->number with radix 16 ---- 24 25 (if (= 0 (string->number "0" 16)) 0 (sys-exit 20)) 26 (if (= 1 (string->number "1" 16)) 0 (sys-exit 21)) 27 (if (= 15 (string->number "f" 16)) 0 (sys-exit 22)) 28 (if (= 15 (string->number "F" 16)) 0 (sys-exit 23)) 29 (if (= 16 (string->number "10" 16)) 0 (sys-exit 24)) 30 (if (= 255 (string->number "ff" 16)) 0 (sys-exit 25)) 31 (if (= 255 (string->number "FF" 16)) 0 (sys-exit 26)) 32 (if (= #xdeadbeef (string->number "deadbeef" 16)) 0 (sys-exit 27)) 33 (if (= -1 (string->number "-1" 16)) 0 (sys-exit 28)) 34 (if (= -255 (string->number "-ff" 16)) 0 (sys-exit 29)) 35 36 ; Failure cases for hex parse. 37 (if (not (string->number "" 16)) 0 (sys-exit 30)) 38 (if (not (string->number "-" 16)) 0 (sys-exit 31)) 39 (if (not (string->number "g" 16)) 0 (sys-exit 32)) 40 (if (not (string->number "1g" 16)) 0 (sys-exit 33)) 41 (if (not (string->number "1.5" 16)) 0 (sys-exit 34)) 42 43 ; Radix 10 still works (regression). 44 (if (= 42 (string->number "42" 10)) 0 (sys-exit 35)) 45 (if (= -7 (string->number "-7" 10)) 0 (sys-exit 36)) 46 47 ; ---- Round trip ---- 48 49 (if (= #xabcd (string->number (number->string #xabcd 16) 16)) 0 (sys-exit 40)) 50 (if (= -255 (string->number (number->string -255 16) 16)) 0 (sys-exit 41)) 51 52 ; ---- format ~x ---- 53 54 (define (bv-from bs) 55 (let ((bv (make-bytevector (length bs) 0))) 56 (let loop ((i 0) (xs bs)) 57 (if (null? xs) bv 58 (begin (bytevector-u8-set! bv i (car xs)) 59 (loop (+ i 1) (cdr xs))))))) 60 61 ; Template "~x" -> byte sequence (126 120) 62 (if (eq-bv "0" (format (bv-from '(126 120)) 0)) 0 (sys-exit 50)) 63 (if (eq-bv "ff" (format (bv-from '(126 120)) 255)) 0 (sys-exit 51)) 64 (if (eq-bv "-1" (format (bv-from '(126 120)) -1)) 0 (sys-exit 52)) 65 (if (eq-bv "deadbeef" (format (bv-from '(126 120)) #xdeadbeef)) 0 (sys-exit 53)) 66 67 ; Template "~x ~d ~x" -> mix dec and hex 68 ; "~x ~d ~x" = (126 120 32 126 100 32 126 120) 69 (if (eq-bv "ff 16 10" 70 (format (bv-from '(126 120 32 126 100 32 126 120)) 255 16 16)) 71 0 (sys-exit 54)) 72 73 (sys-exit 0)