boot2

Playing with the boostrap
git clone https://git.ryansepassi.com/git/boot2.git
Log | Files | Refs | README

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)