From 4c0c4db0702048488a9712dbba7cad862c667d54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= Date: Wed, 15 Mar 2017 21:54:34 +0100 Subject: [PATCH] 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. --- Makefile.am | 2 + build-aux/download.scm | 4 +- guix/base16.scm | 83 +++++++++++++++++++++++++++++++++++ guix/derivations.scm | 1 + guix/docker.scm | 1 + guix/import/snix.scm | 3 +- guix/pk-crypto.scm | 6 +-- guix/scripts/authenticate.scm | 4 +- guix/scripts/download.scm | 4 +- guix/scripts/hash.scm | 2 +- guix/store.scm | 1 + guix/utils.scm | 65 +-------------------------- tests/base16.scm | 34 ++++++++++++++ tests/hash.scm | 2 +- tests/pk-crypto.scm | 3 +- tests/utils.scm | 9 +--- 16 files changed, 138 insertions(+), 86 deletions(-) create mode 100644 guix/base16.scm create mode 100644 tests/base16.scm diff --git a/Makefile.am b/Makefile.am index dea70de00f..ff37a46355 100644 --- a/Makefile.am +++ b/Makefile.am @@ -30,6 +30,7 @@ nodist_noinst_SCRIPTS = \ include gnu/local.mk MODULES = \ + guix/base16.scm \ guix/base32.scm \ guix/base64.scm \ guix/cpio.scm \ @@ -251,6 +252,7 @@ TEST_EXTENSIONS = .scm .sh if CAN_RUN_TESTS SCM_TESTS = \ + tests/base16.scm \ tests/base32.scm \ tests/base64.scm \ tests/cpio.scm \ diff --git a/build-aux/download.scm b/build-aux/download.scm index 1e91e4b87c..8f41f33b14 100644 --- a/build-aux/download.scm +++ b/build-aux/download.scm @@ -1,5 +1,5 @@ ;;; GNU Guix --- Functional package management for GNU -;;; Copyright © 2012, 2013 Ludovic Courtès +;;; Copyright © 2012, 2013, 2017 Ludovic Courtès ;;; Copyright © 2014, 2015 Mark H Weaver ;;; ;;; This file is part of GNU Guix. @@ -26,7 +26,7 @@ (web client) (rnrs io ports) (srfi srfi-11) - (guix utils) + (guix base16) (guix hash)) (define %url-base diff --git a/guix/base16.scm b/guix/base16.scm new file mode 100644 index 0000000000..6c15a9f588 --- /dev/null +++ b/guix/base16.scm @@ -0,0 +1,83 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2012, 2014, 2017 Ludovic Courtès +;;; +;;; 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 . + +(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))) + diff --git a/guix/derivations.scm b/guix/derivations.scm index 47a783f42f..e02d1ee036 100644 --- a/guix/derivations.scm +++ b/guix/derivations.scm @@ -31,6 +31,7 @@ #:use-module (ice-9 vlist) #:use-module (guix store) #:use-module (guix utils) + #:use-module (guix base16) #:use-module (guix memoization) #:use-module (guix combinators) #:use-module (guix monads) diff --git a/guix/docker.scm b/guix/docker.scm index dbe1e5351c..6dabaf25b0 100644 --- a/guix/docker.scm +++ b/guix/docker.scm @@ -19,6 +19,7 @@ (define-module (guix docker) #:use-module (guix hash) #:use-module (guix store) + #:use-module (guix base16) #:use-module (guix utils) #:use-module ((guix build utils) #:select (delete-file-recursively diff --git a/guix/import/snix.scm b/guix/import/snix.scm index bc75cbfda5..778768ff2d 100644 --- a/guix/import/snix.scm +++ b/guix/import/snix.scm @@ -1,5 +1,5 @@ ;;; GNU Guix --- Functional package management for GNU -;;; Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016 Ludovic Courtès +;;; Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 Ludovic Courtès ;;; ;;; This file is part of GNU Guix. ;;; @@ -39,6 +39,7 @@ #:use-module ((guix build utils) #:select (package-name->name+version)) #:use-module (guix import utils) + #:use-module (guix base16) #:use-module (guix base32) #:use-module (guix config) #:use-module (guix gnu-maintenance) diff --git a/guix/pk-crypto.scm b/guix/pk-crypto.scm index f90c2e61d5..7017006a71 100644 --- a/guix/pk-crypto.scm +++ b/guix/pk-crypto.scm @@ -1,5 +1,5 @@ ;;; GNU Guix --- Functional package management for GNU -;;; Copyright © 2013, 2014, 2015 Ludovic Courtès +;;; Copyright © 2013, 2014, 2015, 2017 Ludovic Courtès ;;; ;;; This file is part of GNU Guix. ;;; @@ -17,9 +17,7 @@ ;;; along with GNU Guix. If not, see . (define-module (guix pk-crypto) - #:use-module ((guix utils) - #:select (bytevector->base16-string - base16-string->bytevector)) + #:use-module (guix base16) #:use-module (guix gcrypt) #:use-module (system foreign) diff --git a/guix/scripts/authenticate.scm b/guix/scripts/authenticate.scm index d9f799df26..d9a312f1da 100644 --- a/guix/scripts/authenticate.scm +++ b/guix/scripts/authenticate.scm @@ -1,5 +1,5 @@ ;;; GNU Guix --- Functional package management for GNU -;;; Copyright © 2013, 2014, 2015, 2016 Ludovic Courtès +;;; Copyright © 2013, 2014, 2015, 2016, 2017 Ludovic Courtès ;;; ;;; This file is part of GNU Guix. ;;; @@ -18,7 +18,7 @@ (define-module (guix scripts authenticate) #:use-module (guix config) - #:use-module (guix utils) + #:use-module (guix base16) #:use-module (guix pk-crypto) #:use-module (guix pki) #:use-module (guix ui) diff --git a/guix/scripts/download.scm b/guix/scripts/download.scm index dffff79729..1ddfd648cd 100644 --- a/guix/scripts/download.scm +++ b/guix/scripts/download.scm @@ -1,5 +1,5 @@ ;;; GNU Guix --- Functional package management for GNU -;;; Copyright © 2012, 2013, 2015, 2016 Ludovic Courtès +;;; Copyright © 2012, 2013, 2015, 2016, 2017 Ludovic Courtès ;;; ;;; This file is part of GNU Guix. ;;; @@ -21,7 +21,7 @@ #:use-module (guix scripts) #:use-module (guix store) #:use-module (guix hash) - #:use-module (guix utils) + #:use-module (guix base16) #:use-module (guix base32) #:use-module ((guix download) #:hide (url-fetch)) #:use-module ((guix build download) diff --git a/guix/scripts/hash.scm b/guix/scripts/hash.scm index 640b2417d2..a048b53461 100644 --- a/guix/scripts/hash.scm +++ b/guix/scripts/hash.scm @@ -24,7 +24,7 @@ #:use-module (guix serialization) #:use-module (guix ui) #:use-module (guix scripts) - #:use-module (guix utils) + #:use-module (guix base16) #:use-module (ice-9 binary-ports) #:use-module (rnrs files) #:use-module (ice-9 match) diff --git a/guix/store.scm b/guix/store.scm index cce460f3ce..2f05351767 100644 --- a/guix/store.scm +++ b/guix/store.scm @@ -22,6 +22,7 @@ #:use-module (guix memoization) #:use-module (guix serialization) #:use-module (guix monads) + #:use-module (guix base16) #:autoload (guix base32) (bytevector->base32-string) #:autoload (guix build syscalls) (terminal-columns) #:use-module (rnrs bytevectors) diff --git a/guix/utils.scm b/guix/utils.scm index b72e3f233f..bc90686de0 100644 --- a/guix/utils.scm +++ b/guix/utils.scm @@ -28,15 +28,12 @@ #:use-module (srfi srfi-11) #:use-module (srfi srfi-26) #:use-module (srfi srfi-39) - #:use-module (srfi srfi-60) - #:use-module (rnrs bytevectors) #:use-module (ice-9 binary-ports) #:autoload (rnrs io ports) (make-custom-binary-input-port) #:use-module ((rnrs bytevectors) #:select (bytevector-u8-set!)) #:use-module (guix memoization) #:use-module ((guix build utils) #:select (dump-port)) #:use-module ((guix build syscalls) #:select (mkdtemp! fdatasync)) - #:use-module (ice-9 vlist) #:use-module (ice-9 format) #:autoload (ice-9 popen) (open-pipe*) #:autoload (ice-9 rdelim) (read-line) @@ -46,10 +43,7 @@ #:use-module ((ice-9 iconv) #:prefix iconv:) #:use-module (system foreign) #:re-export (memoize) ; for backwards compatibility - #:export (bytevector->base16-string - base16-string->bytevector - - strip-keyword-arguments + #:export (strip-keyword-arguments default-keyword-arguments substitute-keyword-arguments ensure-keyword-arguments @@ -98,63 +92,6 @@ call-with-compressed-output-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. diff --git a/tests/base16.scm b/tests/base16.scm new file mode 100644 index 0000000000..a64b650bec --- /dev/null +++ b/tests/base16.scm @@ -0,0 +1,34 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2012, 2017 Ludovic Courtès +;;; +;;; 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 . + +(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") diff --git a/tests/hash.scm b/tests/hash.scm index 86501dca2d..b189e435c8 100644 --- a/tests/hash.scm +++ b/tests/hash.scm @@ -18,7 +18,7 @@ (define-module (test-hash) #:use-module (guix hash) - #:use-module (guix utils) + #:use-module (guix base16) #:use-module (srfi srfi-1) #:use-module (srfi srfi-11) #:use-module (srfi srfi-64) diff --git a/tests/pk-crypto.scm b/tests/pk-crypto.scm index 5024a15a43..fe33a6f7b5 100644 --- a/tests/pk-crypto.scm +++ b/tests/pk-crypto.scm @@ -1,5 +1,5 @@ ;;; GNU Guix --- Functional package management for GNU -;;; Copyright © 2013, 2014 Ludovic Courtès +;;; Copyright © 2013, 2014, 2017 Ludovic Courtès ;;; ;;; This file is part of GNU Guix. ;;; @@ -19,6 +19,7 @@ (define-module (test-pk-crypto) #:use-module (guix pk-crypto) #:use-module (guix utils) + #:use-module (guix base16) #:use-module (guix hash) #:use-module (srfi srfi-1) #:use-module (srfi srfi-11) diff --git a/tests/utils.scm b/tests/utils.scm index bcfaa14faa..035886dd16 100644 --- a/tests/utils.scm +++ b/tests/utils.scm @@ -1,5 +1,5 @@ ;;; GNU Guix --- Functional package management for GNU -;;; Copyright © 2012, 2013, 2014, 2015, 2016 Ludovic Courtès +;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017 Ludovic Courtès ;;; Copyright © 2014 Eric Bavier ;;; Copyright © 2016 Mathieu Lirzin ;;; @@ -36,13 +36,6 @@ (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" (let ((samples '(("i586-gnu0.3" "i686-gnu") ("x86_64-unknown-linux-gnu" "x86_64-linux")