Punt plugin -available? procedures.
authorMatt Birkholz <matt@birchwood-abbey.net>
Tue, 8 Mar 2016 18:41:50 +0000 (11:41 -0700)
committerMatt Birkholz <matt@birchwood-abbey.net>
Tue, 8 Mar 2016 18:41:50 +0000 (11:41 -0700)
Such procedures made sense in (runtime crypto), but make little sense
in a plugin where they are defined only after the plugin is installed
and loaded.

15 files changed:
src/blowfish/blowfish-check.scm
src/blowfish/blowfish.pkg
src/blowfish/blowfish.scm
src/gdbm/gdbm-check.scm
src/gdbm/gdbm.pkg
src/gdbm/gdbm.scm
src/mcrypt/mcrypt-check.scm
src/mcrypt/mcrypt.pkg
src/mcrypt/mcrypt.scm
src/md5/md5-check.scm
src/md5/md5.pkg
src/md5/md5.scm
src/mhash/mhash-check.scm
src/mhash/mhash.pkg
src/mhash/mhash.scm

index 2f89d742f4e35958bdde97621627f67512d38dd9..6aacdfce9292a94c03a7ec4fd6e736d22888f975 100644 (file)
@@ -26,23 +26,21 @@ USA.
 
 ;;;; Test the BLOWFISH option.
 
-(if (not (blowfish-available?))
-    (error "BLOWFISH plugin not found")
-    (let ((sample "Some text to encrypt and decrypt."))
-      (call-with-binary-output-file "test"
-       (lambda (output)
-         (call-with-input-string sample
-           (lambda (input)
-             (blowfish-encrypt-port input output "secret"
-                                    (write-blowfish-file-header output)
-                                    #t)))))
-      (let ((read-back
-            (call-with-binary-input-file "test"
-              (lambda (input)
-                (call-with-output-string
-                 (lambda (output)
-                   (blowfish-encrypt-port input output "secret"
-                                          (read-blowfish-file-header input)
-                                          #f)))))))
-       (if (not (string=? sample read-back))
-           (error "sample did not decrypt correctly")))))
\ No newline at end of file
+(let ((sample "Some text to encrypt and decrypt."))
+  (call-with-binary-output-file "test"
+    (lambda (output)
+      (call-with-input-string sample
+       (lambda (input)
+         (blowfish-encrypt-port input output "secret"
+                                (write-blowfish-file-header output)
+                                #t)))))
+  (let ((read-back
+        (call-with-binary-input-file "test"
+          (lambda (input)
+            (call-with-output-string
+             (lambda (output)
+               (blowfish-encrypt-port input output "secret"
+                                      (read-blowfish-file-header input)
+                                      #f)))))))
+    (if (not (string=? sample read-back))
+       (error "sample did not decrypt correctly"))))
\ No newline at end of file
index 34685216b2644c1170c337ccbe1c9dd1215effc7..e31f55421ad9277a6013bfdefce409b4272fbe0f 100644 (file)
@@ -32,7 +32,6 @@ USA.
   ;; You'll have to import these from (global-definitions blowfish/).
   ;; They are currently bound in () by exports from (runtime blowfish).
   (export (blowfish global)
-         blowfish-available?
          blowfish-cbc
          blowfish-cfb64
          blowfish-ecb
index 9107cc400a37717908971294e7225991c610d12a..8be160da4fe4417f83886c47a8da58b0a4dc58fb 100644 (file)
@@ -171,9 +171,6 @@ USA.
                                "a blowfish init-vector index"
                                operator)))
 
-(define (blowfish-available?)
-  (plugin-available? "blowfish"))
-
 (define (blowfish-encrypt-port input output key init-vector encrypt?)
   ;; Assumes that INPUT is in blocking mode.
   (let ((key (blowfish-set-key key))
index e35559b8868f205a6b7dea2539c44f345a628b2a..c3e0ea9f8d03ea08e5c9424d24aecada0a220498 100644 (file)
@@ -26,74 +26,72 @@ USA.
 
 ;;;; Test the GDBM option.
 
-(if (not (gdbm-available?))
-    (error "GDBM plugin not found")
-    (let ((filename.db "gdbm-check.db"))
-      (ignore-errors (lambda () (delete-file filename.db)))
-      (let ((dbf (gdbm-open filename.db 0 GDBM_WRCREAT #o660)))
-       ;; Must be set before first store.
-       (gdbm-setopt dbf GDBM_CACHESIZE 101)
-
-       (gdbm-store dbf "Silly String" "Testing 1 2 3." GDBM_REPLACE)
-        (if (not (condition?
-                 (ignore-errors
-                  (lambda () (gdbm-store dbf "NullString" "" GDBM_INSERT)))))
-           (error "storing null content did not signal"))
-       (if (not (condition?
-                 (ignore-errors
-                  (lambda () (gdbm-store dbf "" "NullString" GDBM_INSERT)))))
-           (error "storing null key did not signal"))
-       (if (not (eq? #t (gdbm-store dbf "Silly String" "Ahoy!" GDBM_REPLACE)))
-           (error "replace produced wrong indication"))
-       (if (not (eq? #f (gdbm-store dbf "Silly String" "Oy!" GDBM_INSERT)))
-           (error "double insert produced no indication"))
-
-       (gdbm-setopt dbf GDBM_SYNCMODE 1)
-
-       (let ((content (gdbm-fetch dbf "Silly String")))
-         (if (not (string=? "Ahoy!" content))
-             (error "fetched:" content)))
-       (let ((content (gdbm-fetch dbf "Missing String")))
-         (if (not (eq? #f content))
-             (error "missing fetched:" content)))
-
-       (if (gdbm-exists? dbf "Missing String")
-           (error "exists"))
-       (if (not (gdbm-exists? dbf "Silly String"))
-           (error "not exists"))
-
-       (gdbm-delete dbf "Silly String")
-       (if (gdbm-exists? dbf "Silly String")
-           (error "not deleted"))
-       (if (gdbm-delete dbf "Missing String")
-           (error "deleted"))
-
-       (let ((k (gdbm-firstkey dbf)))
-         (if k
-             (error "empty database returned a firstkey:" k)))
-       (gdbm-store dbf "AString" "Testing 1 2 3." GDBM_INSERT)
-       (gdbm-store dbf "ASecondString" "Testing 1 2 3." GDBM_REPLACE)
-       (gdbm-store dbf "AThirdString" "Testing 1 2 3." GDBM_INSERT)
-       #;(let ((keys (sort (gdbm-keys dbf) string<?)))
-         (if (not (equal? keys '("ASecondString" "AString" "AThirdString")))
-             (error "keys:" keys)))
-
-       (gdbm-reorganize dbf)
-       (gdbm-sync dbf)
-       (gdbm-setopt dbf 'SYNCMODE #f)
-       (gdbm-version)
-       (gdbm-close dbf))
-
-      (if (not (condition?
-               (ignore-errors
-                (lambda () (gdbm-open "notfound.db" 0 GDBM_READER 0)))))
-         (error "opened a nonexistent database file:" gdbf))
-      (let ((dbf2 (gdbm-open filename.db 0 GDBM_READER 0)))
-         (let ((keys (sort (gdbm-keys dbf2) string<?)))
-           (if (not (equal? keys '("ASecondString" "AString" "AThirdString")))
-               (error "bogus keys:" keys))
-           (map (lambda (key)
-                  (if (not (string=? "Testing 1 2 3." (gdbm-fetch dbf2 key)))
-                      (error "bogus content:" key)))
-                keys))
-         (gdbm-close dbf2))))
\ No newline at end of file
+(let ((filename.db "gdbm-check.db"))
+  (ignore-errors (lambda () (delete-file filename.db)))
+  (let ((dbf (gdbm-open filename.db 0 GDBM_WRCREAT #o660)))
+    ;; Must be set before first store.
+    (gdbm-setopt dbf GDBM_CACHESIZE 101)
+
+    (gdbm-store dbf "Silly String" "Testing 1 2 3." GDBM_REPLACE)
+    (if (not (condition?
+             (ignore-errors
+              (lambda () (gdbm-store dbf "NullString" "" GDBM_INSERT)))))
+       (error "storing null content did not signal"))
+    (if (not (condition?
+             (ignore-errors
+              (lambda () (gdbm-store dbf "" "NullString" GDBM_INSERT)))))
+       (error "storing null key did not signal"))
+    (if (not (eq? #t (gdbm-store dbf "Silly String" "Ahoy!" GDBM_REPLACE)))
+       (error "replace produced wrong indication"))
+    (if (not (eq? #f (gdbm-store dbf "Silly String" "Oy!" GDBM_INSERT)))
+       (error "double insert produced no indication"))
+
+    (gdbm-setopt dbf GDBM_SYNCMODE 1)
+
+    (let ((content (gdbm-fetch dbf "Silly String")))
+      (if (not (string=? "Ahoy!" content))
+         (error "fetched:" content)))
+    (let ((content (gdbm-fetch dbf "Missing String")))
+      (if (not (eq? #f content))
+         (error "missing fetched:" content)))
+
+    (if (gdbm-exists? dbf "Missing String")
+       (error "exists"))
+    (if (not (gdbm-exists? dbf "Silly String"))
+       (error "not exists"))
+
+    (gdbm-delete dbf "Silly String")
+    (if (gdbm-exists? dbf "Silly String")
+       (error "not deleted"))
+    (if (gdbm-delete dbf "Missing String")
+       (error "deleted"))
+
+    (let ((k (gdbm-firstkey dbf)))
+      (if k
+         (error "empty database returned a firstkey:" k)))
+    (gdbm-store dbf "AString" "Testing 1 2 3." GDBM_INSERT)
+    (gdbm-store dbf "ASecondString" "Testing 1 2 3." GDBM_REPLACE)
+    (gdbm-store dbf "AThirdString" "Testing 1 2 3." GDBM_INSERT)
+    #;(let ((keys (sort (gdbm-keys dbf) string<?)))
+      (if (not (equal? keys '("ASecondString" "AString" "AThirdString")))
+         (error "keys:" keys)))
+
+    (gdbm-reorganize dbf)
+    (gdbm-sync dbf)
+    (gdbm-setopt dbf 'SYNCMODE #f)
+    (gdbm-version)
+    (gdbm-close dbf))
+
+  (if (not (condition?
+           (ignore-errors
+            (lambda () (gdbm-open "notfound.db" 0 GDBM_READER 0)))))
+      (error "opened a nonexistent database file:" gdbf))
+  (let ((dbf2 (gdbm-open filename.db 0 GDBM_READER 0)))
+    (let ((keys (sort (gdbm-keys dbf2) string<?)))
+      (if (not (equal? keys '("ASecondString" "AString" "AThirdString")))
+         (error "bogus keys:" keys))
+      (map (lambda (key)
+            (if (not (string=? "Testing 1 2 3." (gdbm-fetch dbf2 key)))
+                (error "bogus content:" key)))
+          keys))
+    (gdbm-close dbf2)))
\ No newline at end of file
index 05823348a213f810112f51ac8cb4792538ea83bf..145b271b505b0da75df43b2a5e64d690a183afa0 100644 (file)
@@ -33,7 +33,6 @@ USA.
   ;; You'll have to import these from (global-definitions gdbm/).
   ;; They are currently bound in () by exports from (runtime gdbm).
   (export (gdbm global)
-         gdbm-available?
          gdbm-close
          gdbm-delete
          gdbm-exists?
index 7295f805d9fce18f2643acc8106d8135c7716e7b..9a6c5142f3b4b01c5092fb30b879497dfb135d5a 100644 (file)
@@ -31,9 +31,6 @@ USA.
 \f
 (C-include "gdbm")
 
-(define (gdbm-available?)
-  (plugin-available? "gdbm"))
-
 ;; Parameters to gdbm_open for READERS, WRITERS, and WRITERS who can
 ;; create the database.
 (define GDBM_READER (C-enum "GDBM_READER"))    ;A reader.
@@ -48,8 +45,6 @@ USA.
   (let ((args (make-alien '|gdbm_args|))
        (flagsnum (guarantee-gdbm-open-flags flags)))
     (let ((gdbf (make-gdbf args (make-thread-mutex) filename)))
-      (if (not (gdbm-available?))
-         (error "GDBM support is not installed."))
       (add-open-gdbf-cleanup gdbf)
       (with-gdbf-locked
        gdbf
index 628d020ccb694ecc4baeb0dd45bfcfb361378806..42cae87394783c131f88455a3efb402c88a425d1 100644 (file)
@@ -32,44 +32,41 @@ USA.
                                         (declare (ignore i))
                                         (ascii->char (random 256))))))
 
-(if (not (mcrypt-available?))
-    (error "MCRYPT plugin not found")
-    (begin
-      (if (not (member "tripledes" (mcrypt-algorithm-names)))
-         (error "No tripledes."))
+(if (not (member "tripledes" (mcrypt-algorithm-names)))
+    (error "No tripledes."))
 
-      (if (not (member "cfb" (mcrypt-mode-names)))
-         (error "No cipher-feedback mode."))
+(if (not (member "cfb" (mcrypt-mode-names)))
+    (error "No cipher-feedback mode."))
 
-      (let ((key (let ((sizes (mcrypt-supported-key-sizes "tripledes")))
-                  (if (not (vector? sizes))
-                      (error "Bogus key sizes for tripledes."))
-                  (random-string (vector-ref sizes
-                                             (-1+ (vector-length sizes))))))
-           (init-vector (let* ((context
-                                ;; Unfortunately the size is
-                                ;; available only from the MCRYPT(?)!
-                                (mcrypt-open-module "tripledes" "cfb"))
-                               (size (mcrypt-init-vector-size context)))
-                          (mcrypt-end context)
-                          (random-string size))))
+(let ((key (let ((sizes (mcrypt-supported-key-sizes "tripledes")))
+            (if (not (vector? sizes))
+                (error "Bogus key sizes for tripledes."))
+            (random-string (vector-ref sizes
+                                       (-1+ (vector-length sizes))))))
+      (init-vector (let* ((context
+                          ;; Unfortunately the size is
+                          ;; available only from the MCRYPT(?)!
+                          (mcrypt-open-module "tripledes" "cfb"))
+                         (size (mcrypt-init-vector-size context)))
+                    (mcrypt-end context)
+                    (random-string size))))
 
-       (call-with-input-file "mcrypt.scm"
-         (lambda (input)
-           (call-with-output-file "encrypted"
-             (lambda (output)
-               (let ((copy (string-copy init-vector)))
-                 (mcrypt-encrypt-port "tripledes" "cfb"
-                                      input output key init-vector #t)
-                 (if (not (string=? copy init-vector))
-                     (error "Init vector modified.")))))))
+  (call-with-input-file "mcrypt.scm"
+    (lambda (input)
+      (call-with-output-file "encrypted"
+       (lambda (output)
+         (let ((copy (string-copy init-vector)))
+           (mcrypt-encrypt-port "tripledes" "cfb"
+                                input output key init-vector #t)
+           (if (not (string=? copy init-vector))
+               (error "Init vector modified.")))))))
 
-       (call-with-input-file "encrypted"
-         (lambda (input)
-           (call-with-output-file "decrypted"
-             (lambda (output)
-               (mcrypt-encrypt-port "tripledes" "cfb"
-                                    input output key init-vector #f))))))
+  (call-with-input-file "encrypted"
+    (lambda (input)
+      (call-with-output-file "decrypted"
+       (lambda (output)
+         (mcrypt-encrypt-port "tripledes" "cfb"
+                              input output key init-vector #f))))))
 
-      (if (not (= 0 (run-shell-command "cmp mcrypt.scm decrypted")))
-         (error "En/Decryption failed."))))
\ No newline at end of file
+(if (not (= 0 (run-shell-command "cmp mcrypt.scm decrypted")))
+    (error "En/Decryption failed."))
\ No newline at end of file
index 5bff033160d1908163e07b53439b5672933f9628..f536f003c62a6f3dd885bef6a2f0a7929388e8a1 100644 (file)
@@ -36,7 +36,6 @@ USA.
   (export (mcrypt global)
          mcrypt-algorithm-name
          mcrypt-algorithm-names
-         mcrypt-available?
          mcrypt-block-algorithm-mode?
          mcrypt-block-algorithm?
          mcrypt-block-mode?
index 841dbcb16a3eaf5d08677c1e9bc2a3435ca624c8..357696fe8e74fd511194022a8b854f109413574c 100644 (file)
@@ -91,9 +91,6 @@ USA.
 (define mcrypt-algorithm-names-vector)
 (define mcrypt-mode-names-vector)
 
-(define (mcrypt-available?)
-  (plugin-available? "mcrypt"))
-
 (define (init!)
   (if (not mcrypt-initialized?)
       (begin
index fb86f209be6f2624d01ef02acbf2394c8eb00d2e..dde27fca196263b0aebb041ab59d99a0bc62e706 100644 (file)
@@ -26,14 +26,12 @@ USA.
 
 ;;;; Test the MD5 option.
 
-(if (not (md5-available?))
-    (error "MD5 plugin not found")
-    (let ((sample "Some text to hash."))
-      (let ((hash (md5-sum->hexadecimal (md5-string sample))))
-       (if (not (string=? hash "c8e89c4cbf3abf9aa758d691cbe4b784"))
-           (error "Bad hash for sample text:" hash)))
-      (call-with-output-file "sample"
-       (lambda (port) (write-string sample port) (newline port)))
-      (let ((hash (md5-sum->hexadecimal (md5-file "sample"))))
-       (if (not (string=? hash "43eb9eccb88c329721925efc04843af1"))
-           (error "Bad hash for sample file:" hash)))))
\ No newline at end of file
+(let ((sample "Some text to hash."))
+  (let ((hash (md5-sum->hexadecimal (md5-string sample))))
+    (if (not (string=? hash "c8e89c4cbf3abf9aa758d691cbe4b784"))
+       (error "Bad hash for sample text:" hash)))
+  (call-with-output-file "sample"
+    (lambda (port) (write-string sample port) (newline port)))
+  (let ((hash (md5-sum->hexadecimal (md5-file "sample"))))
+    (if (not (string=? hash "43eb9eccb88c329721925efc04843af1"))
+       (error "Bad hash for sample file:" hash))))
\ No newline at end of file
index a6229937cbd7b5e5c280ee43c6fe0ff16e8cc2e1..a9a5e4e2d115cfb26dc94997c73e19b183314671 100644 (file)
@@ -32,7 +32,6 @@ USA.
   ;; You'll have to import these from (global-definitions md5/).  They
   ;; are currently bound in () by exports from (runtime crypto).
   (export (md5 global)
-         md5-available?
          md5-file
          md5-string
          md5-substring
index a8052fa66a5580787789bed5cd8af64b4b6643e4..70408537fcb95531b9d21ff2d87f112b4f7c3904 100644 (file)
@@ -31,9 +31,6 @@ USA.
 \f
 (C-include "md5")
 
-(define (mhash-available?)
-  (plugin-available? "mhash"))
-
 (define (%md5-init)
   ;; Create and return an MD5 digest context.
   (let ((context (make-string (C-sizeof "MD5_CTX"))))
@@ -70,22 +67,7 @@ USA.
     (C-call "do_MD5" string length result)
     result))
 
-(define (md5-available?)
-  (or (mhash-available?)
-      (%md5-available?)))
-
-(define (%md5-available?)
-  (plugin-available? "md5"))
-
 (define (md5-file filename)
-  (cond ((mhash-available?)
-        (mhash-file 'MD5 filename))
-       ((%md5-available?)
-        (%md5-file filename))
-       (else
-        (error "This Scheme system was built without MD5 support."))))
-
-(define (%md5-file filename)
   (call-with-binary-input-file filename
     (lambda (port)
       (let ((buffer (make-string 4096))
@@ -107,14 +89,6 @@ USA.
   (md5-substring string 0 (string-length string)))
 
 (define (md5-substring string start end)
-  (cond ((mhash-available?)
-        (mhash-substring 'MD5 string start end))
-       ((%md5-available?)
-        (%md5-substring string start end))
-       (else
-        (error "This Scheme system was built without MD5 support."))))
-
-(define (%md5-substring string start end)
   (let ((context (%md5-init)))
     (%md5-update context string start end)
     (%md5-final context)))
index 7c58c7928298b4a91dc691b512ad972cc057e3dd..ff527f98f216daa6ef57bb2b54163111e10cba91 100644 (file)
@@ -26,14 +26,12 @@ USA.
 
 ;;;; Test the MHASH option.
 
-(if (not (mhash-available?))
-    (error "MHASH plugin not found")
-    (let ((sample "Some text to hash."))
-      (let ((hash (mhash-sum->hexadecimal (mhash-string 'MD5 sample))))
-       (if (not (string=? hash "c8e89c4cbf3abf9aa758d691cbe4b784"))
-           (error "Bad hash for sample text:" hash)))
-      (call-with-output-file "sample"
-       (lambda (port) (write-string sample port) (newline port)))
-      (let ((hash (mhash-sum->hexadecimal (mhash-file 'MD5 "sample"))))
-       (if (not (string=? hash "43eb9eccb88c329721925efc04843af1"))
-           (error "Bad hash for sample file:" hash)))))
\ No newline at end of file
+(let ((sample "Some text to hash."))
+  (let ((hash (mhash-sum->hexadecimal (mhash-string 'MD5 sample))))
+    (if (not (string=? hash "c8e89c4cbf3abf9aa758d691cbe4b784"))
+       (error "Bad hash for sample text:" hash)))
+  (call-with-output-file "sample"
+    (lambda (port) (write-string sample port) (newline port)))
+  (let ((hash (mhash-sum->hexadecimal (mhash-file 'MD5 "sample"))))
+    (if (not (string=? hash "43eb9eccb88c329721925efc04843af1"))
+       (error "Bad hash for sample file:" hash))))
\ No newline at end of file
index b0223d92c5be2785d4ba20a5c3629ef7e1b6b217..183f3162fc033ac8a3efa0f20e883b7fddb11d29 100644 (file)
@@ -34,7 +34,6 @@ USA.
   ;; They are currently bound in () by exports from (runtime crypto).
   (export (mhash global)
          make-mhash-keygen-type
-         mhash-available?
          mhash-context?
          mhash-end
          mhash-file
index 1cf152b6db04323e3fda3a98b0b7b22512147586..a7d43ac1ac87799fe7a7529daaa53dbc0c88136b 100644 (file)
@@ -31,7 +31,6 @@ USA.
 \f
 (C-include "mhash")
 
-(define mhash-initialized? #f)
 (define mhash-algorithm-names)
 (define mhash-contexts '())
 (define mhash-hmac-contexts '())
@@ -359,47 +358,38 @@ USA.
                        (mhash-name->id (car names) 'MAKE-MHASH-KEYGEN-TYPE)))
         v)))))
 \f
-(define (mhash-available?)
-  (and (plugin-available? "mhash")
-       (begin
-        (initialize-mhash-variables!)
-        #t)))
-
 (define (initialize-mhash-variables!)
-  (if (not mhash-initialized?)
-      (begin
-       (set! mhash-algorithm-names
-             (make-names-vector
-              (lambda () (C-call "mhash_count"))
-              (lambda (hashid)
-                (let* ((alien (make-alien-to-free
-                               '(* char)
-                               (lambda (alien)
-                                 (C-call "mhash_get_hash_name"
-                                         alien hashid))))
-                       (str (c-peek-cstring alien)))
-                  (free alien)
-                  str))))
-       (set! mhash-keygen-names
-             (make-names-vector
-              (lambda () (C-call "mhash_keygen_count"))
-              (lambda (keygenid)
-                (let* ((alien (make-alien-to-free
-                               '(* char)
-                               (lambda (alien)
-                                 (C-call "mhash_get_keygen_name"
-                                         alien keygenid))))
-                       (str (c-peek-cstring alien)))
-                  (free alien)
-                  str))))
-       (set! mhash-initialized? #t))))
+  (set! mhash-algorithm-names
+       (make-names-vector
+        (lambda () (C-call "mhash_count"))
+        (lambda (hashid)
+          (let* ((alien (make-alien-to-free
+                         '(* char)
+                         (lambda (alien)
+                           (C-call "mhash_get_hash_name"
+                                   alien hashid))))
+                 (str (c-peek-cstring alien)))
+            (free alien)
+            str))))
+  (set! mhash-keygen-names
+       (make-names-vector
+        (lambda () (C-call "mhash_keygen_count"))
+        (lambda (keygenid)
+          (let* ((alien (make-alien-to-free
+                         '(* char)
+                         (lambda (alien)
+                           (C-call "mhash_get_keygen_name"
+                                   alien keygenid))))
+                 (str (c-peek-cstring alien)))
+            (free alien)
+            str)))))
 
 (define (reset-mhash-variables!)
-  (set! mhash-initialized? #f)
   (for-each (lambda (weak) (alien-null! (weak-cdr weak))) mhash-contexts)
   (set! mhash-contexts '())
   (for-each (lambda (weak) (alien-null! (weak-cdr weak))) mhash-hmac-contexts)
   (set! mhash-hmac-contexts '())
+  (initialize-mhash-variables!)
   unspecific)
 
 (define (mhash-file hash-type filename)