utils: Move base16 procedures to (guix base16).

* guix/utils.scm (bytevector->base16-string, base16-string->bytevector):
Move to...
* guix/base16.scm: ... here.  New file.
* tests/utils.scm ("bytevector->base16-string->bytevector"): Move to...
* tests/base16.scm: ... here.  New file.
* Makefile.am (MODULES): Add guix/base16.scm.
(SCM_TESTS): Add tests/base16.scm.
* build-aux/download.scm, guix/derivations.scm,
guix/docker.scm, guix/import/snix.scm, guix/pk-crypto.scm,
guix/scripts/authenticate.scm, guix/scripts/download.scm,
guix/scripts/hash.scm, guix/store.scm, tests/hash.scm,
tests/pk-crypto.scm: Adjust imports accordingly.
This commit is contained in:
Ludovic Courtès 2017-03-15 21:54:34 +01:00
parent 2c715a9223
commit 4c0c4db070
No known key found for this signature in database
GPG key ID: 090B11993D9AEBB5
16 changed files with 138 additions and 86 deletions

View file

@ -30,6 +30,7 @@ nodist_noinst_SCRIPTS = \
include gnu/local.mk include gnu/local.mk
MODULES = \ MODULES = \
guix/base16.scm \
guix/base32.scm \ guix/base32.scm \
guix/base64.scm \ guix/base64.scm \
guix/cpio.scm \ guix/cpio.scm \
@ -251,6 +252,7 @@ TEST_EXTENSIONS = .scm .sh
if CAN_RUN_TESTS if CAN_RUN_TESTS
SCM_TESTS = \ SCM_TESTS = \
tests/base16.scm \
tests/base32.scm \ tests/base32.scm \
tests/base64.scm \ tests/base64.scm \
tests/cpio.scm \ tests/cpio.scm \

View file

@ -1,5 +1,5 @@
;;; GNU Guix --- Functional package management for GNU ;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2012, 2013 Ludovic Courtès <ludo@gnu.org> ;;; Copyright © 2012, 2013, 2017 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2014, 2015 Mark H Weaver <mhw@netris.org> ;;; Copyright © 2014, 2015 Mark H Weaver <mhw@netris.org>
;;; ;;;
;;; This file is part of GNU Guix. ;;; This file is part of GNU Guix.
@ -26,7 +26,7 @@
(web client) (web client)
(rnrs io ports) (rnrs io ports)
(srfi srfi-11) (srfi srfi-11)
(guix utils) (guix base16)
(guix hash)) (guix hash))
(define %url-base (define %url-base

83
guix/base16.scm Normal file
View file

@ -0,0 +1,83 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2012, 2014, 2017 Ludovic Courtès <ludo@gnu.org>
;;;
;;; This file is part of GNU Guix.
;;;
;;; GNU Guix is free software; you can redistribute it and/or modify it
;;; under the terms of the GNU General Public License as published by
;;; the Free Software Foundation; either version 3 of the License, or (at
;;; your option) any later version.
;;;
;;; GNU Guix is distributed in the hope that it will be useful, but
;;; WITHOUT ANY WARRANTY; without even the implied warranty of
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;;; GNU General Public License for more details.
;;;
;;; You should have received a copy of the GNU General Public License
;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
(define-module (guix base16)
#:use-module (srfi srfi-1)
#:use-module (srfi srfi-26)
#:use-module (srfi srfi-60)
#:use-module (rnrs bytevectors)
#:use-module (ice-9 vlist)
#:use-module (ice-9 format)
#:export (bytevector->base16-string
base16-string->bytevector))
;;;
;;; Base 16.
;;;
(define (bytevector->base16-string bv)
"Return the hexadecimal representation of BV's contents."
(define len
(bytevector-length bv))
(let-syntax ((base16-chars (lambda (s)
(syntax-case s ()
(_
(let ((v (list->vector
(unfold (cut > <> 255)
(lambda (n)
(format #f "~2,'0x" n))
1+
0))))
v))))))
(define chars base16-chars)
(let loop ((i len)
(r '()))
(if (zero? i)
(string-concatenate r)
(let ((i (- i 1)))
(loop i
(cons (vector-ref chars (bytevector-u8-ref bv i)) r)))))))
(define base16-string->bytevector
(let ((chars->value (fold (lambda (i r)
(vhash-consv (string-ref (number->string i 16)
0)
i r))
vlist-null
(iota 16))))
(lambda (s)
"Return the bytevector whose hexadecimal representation is string S."
(define bv
(make-bytevector (quotient (string-length s) 2) 0))
(string-fold (lambda (chr i)
(let ((j (quotient i 2))
(v (and=> (vhash-assv chr chars->value) cdr)))
(if v
(if (zero? (logand i 1))
(bytevector-u8-set! bv j
(arithmetic-shift v 4))
(let ((w (bytevector-u8-ref bv j)))
(bytevector-u8-set! bv j (logior v w))))
(error "invalid hexadecimal character" chr)))
(+ i 1))
0
s)
bv)))

View file

@ -31,6 +31,7 @@ (define-module (guix derivations)
#:use-module (ice-9 vlist) #:use-module (ice-9 vlist)
#:use-module (guix store) #:use-module (guix store)
#:use-module (guix utils) #:use-module (guix utils)
#:use-module (guix base16)
#:use-module (guix memoization) #:use-module (guix memoization)
#:use-module (guix combinators) #:use-module (guix combinators)
#:use-module (guix monads) #:use-module (guix monads)

View file

@ -19,6 +19,7 @@
(define-module (guix docker) (define-module (guix docker)
#:use-module (guix hash) #:use-module (guix hash)
#:use-module (guix store) #:use-module (guix store)
#:use-module (guix base16)
#:use-module (guix utils) #:use-module (guix utils)
#:use-module ((guix build utils) #:use-module ((guix build utils)
#:select (delete-file-recursively #:select (delete-file-recursively

View file

@ -1,5 +1,5 @@
;;; GNU Guix --- Functional package management for GNU ;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org> ;;; Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org>
;;; ;;;
;;; This file is part of GNU Guix. ;;; This file is part of GNU Guix.
;;; ;;;
@ -39,6 +39,7 @@ (define-module (guix import snix)
#:use-module ((guix build utils) #:select (package-name->name+version)) #:use-module ((guix build utils) #:select (package-name->name+version))
#:use-module (guix import utils) #:use-module (guix import utils)
#:use-module (guix base16)
#:use-module (guix base32) #:use-module (guix base32)
#:use-module (guix config) #:use-module (guix config)
#:use-module (guix gnu-maintenance) #:use-module (guix gnu-maintenance)

View file

@ -1,5 +1,5 @@
;;; GNU Guix --- Functional package management for GNU ;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org> ;;; Copyright © 2013, 2014, 2015, 2017 Ludovic Courtès <ludo@gnu.org>
;;; ;;;
;;; This file is part of GNU Guix. ;;; This file is part of GNU Guix.
;;; ;;;
@ -17,9 +17,7 @@
;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. ;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
(define-module (guix pk-crypto) (define-module (guix pk-crypto)
#:use-module ((guix utils) #:use-module (guix base16)
#:select (bytevector->base16-string
base16-string->bytevector))
#:use-module (guix gcrypt) #:use-module (guix gcrypt)
#:use-module (system foreign) #:use-module (system foreign)

View file

@ -1,5 +1,5 @@
;;; GNU Guix --- Functional package management for GNU ;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org> ;;; Copyright © 2013, 2014, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org>
;;; ;;;
;;; This file is part of GNU Guix. ;;; This file is part of GNU Guix.
;;; ;;;
@ -18,7 +18,7 @@
(define-module (guix scripts authenticate) (define-module (guix scripts authenticate)
#:use-module (guix config) #:use-module (guix config)
#:use-module (guix utils) #:use-module (guix base16)
#:use-module (guix pk-crypto) #:use-module (guix pk-crypto)
#:use-module (guix pki) #:use-module (guix pki)
#:use-module (guix ui) #:use-module (guix ui)

View file

@ -1,5 +1,5 @@
;;; GNU Guix --- Functional package management for GNU ;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2012, 2013, 2015, 2016 Ludovic Courtès <ludo@gnu.org> ;;; Copyright © 2012, 2013, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org>
;;; ;;;
;;; This file is part of GNU Guix. ;;; This file is part of GNU Guix.
;;; ;;;
@ -21,7 +21,7 @@ (define-module (guix scripts download)
#:use-module (guix scripts) #:use-module (guix scripts)
#:use-module (guix store) #:use-module (guix store)
#:use-module (guix hash) #:use-module (guix hash)
#:use-module (guix utils) #:use-module (guix base16)
#:use-module (guix base32) #:use-module (guix base32)
#:use-module ((guix download) #:hide (url-fetch)) #:use-module ((guix download) #:hide (url-fetch))
#:use-module ((guix build download) #:use-module ((guix build download)

View file

@ -24,7 +24,7 @@ (define-module (guix scripts hash)
#:use-module (guix serialization) #:use-module (guix serialization)
#:use-module (guix ui) #:use-module (guix ui)
#:use-module (guix scripts) #:use-module (guix scripts)
#:use-module (guix utils) #:use-module (guix base16)
#:use-module (ice-9 binary-ports) #:use-module (ice-9 binary-ports)
#:use-module (rnrs files) #:use-module (rnrs files)
#:use-module (ice-9 match) #:use-module (ice-9 match)

View file

@ -22,6 +22,7 @@ (define-module (guix store)
#:use-module (guix memoization) #:use-module (guix memoization)
#:use-module (guix serialization) #:use-module (guix serialization)
#:use-module (guix monads) #:use-module (guix monads)
#:use-module (guix base16)
#:autoload (guix base32) (bytevector->base32-string) #:autoload (guix base32) (bytevector->base32-string)
#:autoload (guix build syscalls) (terminal-columns) #:autoload (guix build syscalls) (terminal-columns)
#:use-module (rnrs bytevectors) #:use-module (rnrs bytevectors)

View file

@ -28,15 +28,12 @@ (define-module (guix utils)
#:use-module (srfi srfi-11) #:use-module (srfi srfi-11)
#:use-module (srfi srfi-26) #:use-module (srfi srfi-26)
#:use-module (srfi srfi-39) #:use-module (srfi srfi-39)
#:use-module (srfi srfi-60)
#:use-module (rnrs bytevectors)
#:use-module (ice-9 binary-ports) #:use-module (ice-9 binary-ports)
#:autoload (rnrs io ports) (make-custom-binary-input-port) #:autoload (rnrs io ports) (make-custom-binary-input-port)
#:use-module ((rnrs bytevectors) #:select (bytevector-u8-set!)) #:use-module ((rnrs bytevectors) #:select (bytevector-u8-set!))
#:use-module (guix memoization) #:use-module (guix memoization)
#:use-module ((guix build utils) #:select (dump-port)) #:use-module ((guix build utils) #:select (dump-port))
#:use-module ((guix build syscalls) #:select (mkdtemp! fdatasync)) #:use-module ((guix build syscalls) #:select (mkdtemp! fdatasync))
#:use-module (ice-9 vlist)
#:use-module (ice-9 format) #:use-module (ice-9 format)
#:autoload (ice-9 popen) (open-pipe*) #:autoload (ice-9 popen) (open-pipe*)
#:autoload (ice-9 rdelim) (read-line) #:autoload (ice-9 rdelim) (read-line)
@ -46,10 +43,7 @@ (define-module (guix utils)
#:use-module ((ice-9 iconv) #:prefix iconv:) #:use-module ((ice-9 iconv) #:prefix iconv:)
#:use-module (system foreign) #:use-module (system foreign)
#:re-export (memoize) ; for backwards compatibility #:re-export (memoize) ; for backwards compatibility
#:export (bytevector->base16-string #:export (strip-keyword-arguments
base16-string->bytevector
strip-keyword-arguments
default-keyword-arguments default-keyword-arguments
substitute-keyword-arguments substitute-keyword-arguments
ensure-keyword-arguments ensure-keyword-arguments
@ -98,63 +92,6 @@ (define-module (guix utils)
call-with-compressed-output-port call-with-compressed-output-port
canonical-newline-port)) canonical-newline-port))
;;;
;;; Base 16.
;;;
(define (bytevector->base16-string bv)
"Return the hexadecimal representation of BV's contents."
(define len
(bytevector-length bv))
(let-syntax ((base16-chars (lambda (s)
(syntax-case s ()
(_
(let ((v (list->vector
(unfold (cut > <> 255)
(lambda (n)
(format #f "~2,'0x" n))
1+
0))))
v))))))
(define chars base16-chars)
(let loop ((i len)
(r '()))
(if (zero? i)
(string-concatenate r)
(let ((i (- i 1)))
(loop i
(cons (vector-ref chars (bytevector-u8-ref bv i)) r)))))))
(define base16-string->bytevector
(let ((chars->value (fold (lambda (i r)
(vhash-consv (string-ref (number->string i 16)
0)
i r))
vlist-null
(iota 16))))
(lambda (s)
"Return the bytevector whose hexadecimal representation is string S."
(define bv
(make-bytevector (quotient (string-length s) 2) 0))
(string-fold (lambda (chr i)
(let ((j (quotient i 2))
(v (and=> (vhash-assv chr chars->value) cdr)))
(if v
(if (zero? (logand i 1))
(bytevector-u8-set! bv j
(arithmetic-shift v 4))
(let ((w (bytevector-u8-ref bv j)))
(bytevector-u8-set! bv j (logior v w))))
(error "invalid hexadecimal character" chr)))
(+ i 1))
0
s)
bv)))
;;; ;;;
;;; Filtering & pipes. ;;; Filtering & pipes.

34
tests/base16.scm Normal file
View file

@ -0,0 +1,34 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2012, 2017 Ludovic Courtès <ludo@gnu.org>
;;;
;;; This file is part of GNU Guix.
;;;
;;; GNU Guix is free software; you can redistribute it and/or modify it
;;; under the terms of the GNU General Public License as published by
;;; the Free Software Foundation; either version 3 of the License, or (at
;;; your option) any later version.
;;;
;;; GNU Guix is distributed in the hope that it will be useful, but
;;; WITHOUT ANY WARRANTY; without even the implied warranty of
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;;; GNU General Public License for more details.
;;;
;;; You should have received a copy of the GNU General Public License
;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
(define-module (test-base16)
#:use-module (guix base16)
#:use-module (srfi srfi-1)
#:use-module (srfi srfi-64)
#:use-module (rnrs bytevectors))
(test-begin "base16")
(test-assert "bytevector->base16-string->bytevector"
(every (lambda (bv)
(equal? (base16-string->bytevector
(bytevector->base16-string bv))
bv))
(map string->utf8 '("" "f" "fo" "foo" "foob" "fooba" "foobar"))))
(test-end "base16")

View file

@ -18,7 +18,7 @@
(define-module (test-hash) (define-module (test-hash)
#:use-module (guix hash) #:use-module (guix hash)
#:use-module (guix utils) #:use-module (guix base16)
#:use-module (srfi srfi-1) #:use-module (srfi srfi-1)
#:use-module (srfi srfi-11) #:use-module (srfi srfi-11)
#:use-module (srfi srfi-64) #:use-module (srfi srfi-64)

View file

@ -1,5 +1,5 @@
;;; GNU Guix --- Functional package management for GNU ;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2013, 2014 Ludovic Courtès <ludo@gnu.org> ;;; Copyright © 2013, 2014, 2017 Ludovic Courtès <ludo@gnu.org>
;;; ;;;
;;; This file is part of GNU Guix. ;;; This file is part of GNU Guix.
;;; ;;;
@ -19,6 +19,7 @@
(define-module (test-pk-crypto) (define-module (test-pk-crypto)
#:use-module (guix pk-crypto) #:use-module (guix pk-crypto)
#:use-module (guix utils) #:use-module (guix utils)
#:use-module (guix base16)
#:use-module (guix hash) #:use-module (guix hash)
#:use-module (srfi srfi-1) #:use-module (srfi srfi-1)
#:use-module (srfi srfi-11) #:use-module (srfi srfi-11)

View file

@ -1,5 +1,5 @@
;;; GNU Guix --- Functional package management for GNU ;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2012, 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org> ;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2014 Eric Bavier <bavier@member.fsf.org> ;;; Copyright © 2014 Eric Bavier <bavier@member.fsf.org>
;;; Copyright © 2016 Mathieu Lirzin <mthl@gnu.org> ;;; Copyright © 2016 Mathieu Lirzin <mthl@gnu.org>
;;; ;;;
@ -36,13 +36,6 @@ (define temp-file
(test-begin "utils") (test-begin "utils")
(test-assert "bytevector->base16-string->bytevector"
(every (lambda (bv)
(equal? (base16-string->bytevector
(bytevector->base16-string bv))
bv))
(map string->utf8 '("" "f" "fo" "foo" "foob" "fooba" "foobar"))))
(test-assert "gnu-triplet->nix-system" (test-assert "gnu-triplet->nix-system"
(let ((samples '(("i586-gnu0.3" "i686-gnu") (let ((samples '(("i586-gnu0.3" "i686-gnu")
("x86_64-unknown-linux-gnu" "x86_64-linux") ("x86_64-unknown-linux-gnu" "x86_64-linux")