;;;; string-hexadecimal.scm -*- Scheme -*- ;;;; Kon Lovett, Jul '18 ;;;; Kon Lovett, Aug '17 ;;;; Kon Lovett, Aug '10 (declare (bound-to-procedure ##sys#signal-hook ##sys#make-string)) (module string-hexadecimal (;export string->hex *string->hex hex->string *hex->string) (import scheme) (import (chicken base)) (import (chicken type)) (import (chicken foreign)) (import (chicken memory representation)) (import to-hex) (import (only type-checks check-natural-fixnum check-string)) ;; (: string->hex (string #!optional fixnum (or boolean fixnum) --> string)) (: hex->string (string #!optional fixnum --> string)) (: *string->hex (string fixnum fixnum --> string)) (: *hex->string (string fixnum fixnum --> string)) ;; (define (check-subvector-indexes loc start end) (unless (<= (check-natural-fixnum loc start 'start) (check-natural-fixnum loc end 'end)) (##sys#signal-hook #:bounds-error loc "illegal subvector specification" start end) ) ) ;; (define (string->hex str #!optional (start 0) (end #f)) (let* ( (len (number-of-bytes (check-string 'string->hex str))) (end (or end len)) ) (check-subvector-indexes 'string->hex start end) (*string->hex str start end) ) ) (define (hex->string str #!optional (start 0) (end #f)) (let* ( (len (number-of-bytes (check-string 'hex->string str))) (end (or end len)) ) (unless (zero? (modulo end 2)) (error 'hex->string "too few characters" str) ) (check-subvector-indexes 'hex->string start end) (*hex->string str start end) ) ) ;; (define (*string->hex str start end) (let ( (len (- end start)) ) (if (zero? len) "" (str_to_hex (##sys#make-string (* len 2)) str start len) ) ) ) (define (*hex->string str start end) (let ( (len (- end start)) ) (if (zero? len) "" (hex_to_str (##sys#make-string (quotient len 2)) str start len) ) ) ) #| (import (only (srfi 1) drop drop-right) (only (srfi 13) string-pad string-concatenate reverse-list->string)) (define ( ch) (string-pad (number->string (char->integer ch) 16) 2 #\0) ) (define (*string->hex str start end) (let* ( (ls (string->list str)) (ls (drop ls start)) (strlen (string-length str)) (ls (drop-right ls (- strlen end))) ) (string-concatenate (map (lambda (c) (string-pad (number->string (char->integer c) 16) 2 #\0)) ls)) ) ) (define (*hex->string str) (let ( (len (string-length str)) ) (let loop ((i 0) (ls '())) (if (<= len i) (reverse-list->string ls) (let ( (ni (+ i 2)) ) (loop ni (cons (integer->char (string->number (substring str i ni) 16)) ls)) ) ) ) ) ) |# ) ;module string-hexadecimal