From ec68bafa9c7114785dc9e02781eeaa33cfcbec4f Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Mon, 13 Oct 2008 16:21:18 +0000 Subject: [PATCH] add eqv hash tables; add hash-update svn: r12018 --- collects/mzlib/pretty.ss | 8 +- collects/mzscheme/mzscheme.scrbl | 54 +- collects/scheme/dict.ss | 16 + collects/scheme/mzscheme.ss | 3 +- collects/scheme/private/more-scheme.ss | 31 +- collects/scheme/private/old-procs.ss | 33 +- collects/scribblings/reference/dicts.scrbl | 37 ++ collects/scribblings/reference/hashes.scrbl | 80 ++- collects/scribblings/reference/reader.scrbl | 6 +- collects/tests/mzscheme/basic.ss | 85 ++- collects/tests/mzscheme/read.ss | 5 + doc/release-notes/mzscheme/HISTORY.txt | 4 + src/mzscheme/include/mzscheme.exp | 5 + src/mzscheme/include/mzscheme3m.exp | 5 + src/mzscheme/include/mzwin.def | 5 + src/mzscheme/include/mzwin3m.def | 5 + src/mzscheme/src/cstartup.inc | 576 ++++++++++---------- src/mzscheme/src/hash.c | 91 +++- src/mzscheme/src/list.c | 159 +++++- src/mzscheme/src/print.c | 23 +- src/mzscheme/src/read.c | 50 +- src/mzscheme/src/schemef.h | 7 +- src/mzscheme/src/schemex.h | 7 +- src/mzscheme/src/schemex.inc | 5 + src/mzscheme/src/schemexm.h | 5 + src/mzscheme/src/schminc.h | 2 +- src/mzscheme/src/schpriv.h | 2 +- src/mzscheme/src/schvers.h | 4 +- 28 files changed, 913 insertions(+), 400 deletions(-) diff --git a/collects/mzlib/pretty.ss b/collects/mzlib/pretty.ss index 6849cb1cd3..c860882047 100644 --- a/collects/mzlib/pretty.ss +++ b/collects/mzlib/pretty.ss @@ -736,7 +736,9 @@ (lambda () (out (if (hash-table? obj 'equal) "#hash" - "#hasheq")) + (if (hash-table? obj 'eqv) + "#hasheqv" + "#hasheq"))) (wr-lst (hash-table-map obj (lambda (k v) (cons k (make-hide v)))) #f depth @@ -855,7 +857,9 @@ [(hash-table? obj) (out (if (hash-table? obj 'equal) "#hash" - "#hasheq")) + (if (hash-table? obj 'eqv) + "#hasheqv" + "#hasheq"))) (pp-list (hash-table-map obj cons) extra pp-expr #f depth pair? car cdr pair-open pair-close)] [(and (box? obj) print-box?) diff --git a/collects/mzscheme/mzscheme.scrbl b/collects/mzscheme/mzscheme.scrbl index 4bbcadc5a0..7ea66a6a79 100644 --- a/collects/mzscheme/mzscheme.scrbl +++ b/collects/mzscheme/mzscheme.scrbl @@ -316,42 +316,62 @@ Equivalent to @scheme[(namespace-require `(for-syntax ,req))].} Raises @scheme[exn:fail], because the operations are not supported.} -@defproc[(hash-table? [v any/c] [flag (one-of/c 'weak 'equal)] ...) - hash-table?]{ +@defproc*[([(hash-table? [v any/c]) + hash-table?] + [(hash-table? [v any/c] [flag (one-of/c 'weak 'equal 'eqv)]) + hash-table?] + [(hash-table? [v any/c] + [flag (one-of/c 'weak 'equal 'eqv)] + [flag (one-of/c 'weak 'equal 'eqv)]) + hash-table?])]{ Returns @scheme[#t] if @scheme[v] like a hash table created by @scheme[make-hash-table] or @scheme[make-immutable-hash-table] with the given @scheme[flag]s (or more), @scheme[#f] otherwise. Each -provided @scheme[flag] must be distinct; if the second @scheme[flag] -is redundant, the @scheme[exn:fail:contract] exception is raised.} +provided @scheme[flag] must be distinct and @scheme['equal] cannot be +used with @scheme['eqv], otherwise the @scheme[exn:fail:contract] +exception is raised.} -@defproc[(make-hash-table [flag (one-of/c 'weak 'equal)] ...) - hash-table?]{ +@defproc*[([(make-hash-table) + hash-table?] + [(make-hash-table [flag (one-of/c 'weak 'equal 'eqv)]) + hash-table?] + [(make-hash-table [flag (one-of/c 'weak 'equal 'eqv)] + [flag (one-of/c 'weak 'equal 'eqv)]) + hash-table?])]{ Creates and returns a new hash table. If provided, each @scheme[flag] must one of the following: @itemize{ - @item{@indexed-scheme['weak] --- creates a hash table with weakly-held - keys via @scheme[make-weak-hash] or @scheme[make-weak-hasheq]} + @item{@indexed-scheme['weak] --- creates a hash table with + weakly-held keys via @scheme[make-weak-hash], + @scheme[make-weak-hasheq], or @scheme[make-weak-hasheqv].} @item{@indexed-scheme['equal] --- creates a hash table that compares keys using @scheme[equal?] instead of @scheme[eq?] using @scheme[make-hash] or @scheme[make-weak-hash].} + @item{@indexed-scheme['eqv] --- creates a hash table that compares + keys using @scheme[eqv?] instead of @scheme[eq?] using + @scheme[make-hasheqv] or @scheme[make-weak-hasheqv].} + } -By default, key comparisons use @scheme[eq?]. If the second -@scheme[flag] is redundant, the @scheme[exn:fail:contract] exception -is raised.} +By default, key comparisons use @scheme[eq?] (i.e., the hash table is +created with @scheme[make-hasheq]). If the second @scheme[flag] is +redundant or @scheme['equal] is provided with @scheme['eqv], the +@scheme[exn:fail:contract] exception is raised.} -@defproc[(make-immutable-hash-table [assocs (listof pair?)] - [flag (one-of/c 'equal)] - ...) - (and/c hash-table? immutable?)]{ +@defproc*[([(make-immutable-hash-table [assocs (listof pair?)]) + (and/c hash-table? immutable?)] + [(make-immutable-hash-table [assocs (listof pair?)] + [flag (one-of/c 'equal 'eqv)]) + (and/c hash-table? immutable?)])]{ -Like @scheme[make-immutable-hash] or @scheme[make-immutable-hasheq], -depending on whether an @scheme['equal] @scheme[flag] is provided.} +Like @scheme[make-immutable-hash], @scheme[make-immutable-hasheq], or +@scheme[make-immutable-hasheqv], depending on whether an +@scheme['equal] or @scheme['eqv] @scheme[flag] is provided.} diff --git a/collects/scheme/dict.ss b/collects/scheme/dict.ss index 2d0f2525b9..6648afbe29 100644 --- a/collects/scheme/dict.ss +++ b/collects/scheme/dict.ss @@ -12,6 +12,8 @@ dict-ref dict-set! dict-set + dict-update! + dict-update dict-remove! dict-remove dict-count @@ -206,6 +208,20 @@ [else (raise-type-error 'dict-set "dict" 0 d key val)])) +(define dict-update! + (case-lambda + [(d key xform) + (dict-set! d key (xform (dict-ref d key)))] + [(d key xform default) + (dict-set! d key (xform (dict-ref d key default)))])) + +(define dict-update + (case-lambda + [(d key xform) + (dict-set d key (xform (dict-ref d key)))] + [(d key xform default) + (dict-set d key (xform (dict-ref d key default)))])) + (define (dict-remove! d key) (cond [(hash? d) (hash-remove! d key)] diff --git a/collects/scheme/mzscheme.ss b/collects/scheme/mzscheme.ss index fb3102fd41..9fd0cc869d 100644 --- a/collects/scheme/mzscheme.ss +++ b/collects/scheme/mzscheme.ss @@ -23,7 +23,8 @@ (#%provide require require-for-syntax require-for-template require-for-label provide provide-for-syntax provide-for-label (all-from-except "private/more-scheme.ss" case old-case - log-fatal log-error log-warning log-info log-debug) + log-fatal log-error log-warning log-info log-debug + hash-update hash-update!) (rename old-case case) (all-from "private/misc.ss") (all-from-except "private/stxcase-scheme.ss" _) diff --git a/collects/scheme/private/more-scheme.ss b/collects/scheme/private/more-scheme.ss index f07dfc5ae8..e6d89a7324 100644 --- a/collects/scheme/private/more-scheme.ss +++ b/collects/scheme/private/more-scheme.ss @@ -349,10 +349,39 @@ (define-log log-info info) (define-log log-debug debug) + (define-values (hash-update hash-update!) + (let* ([not-there (gensym)] + [up (lambda (who mut? ref set ht key xform default) + (unless (and (hash? ht) + (or (not mut?) + (not (immutable? ht)))) + (raise-type-error who (if mut? "mutable hash" "hash") ht)) + (unless (and (procedure? xform) + (procedure-arity-includes? xform 1)) + (raise-type-error who "procedure (arity 1)" xform)) + (let ([v (ref ht key default)]) + (if (eq? v not-there) + (raise-mismatch-error who "no value found for key: " key) + (set ht key (xform v)))))]) + (let ([hash-update + (case-lambda + [(ht key xform default) + (up 'hash-update #f hash-ref hash-set ht key xform default)] + [(ht key xform) + (hash-update ht key xform not-there)])] + [hash-update! + (case-lambda + [(ht key xform default) + (up 'hash-update! #t hash-ref hash-set! ht key xform default)] + [(ht key xform) + (hash-update! ht key xform not-there)])]) + (values hash-update hash-update!)))) + (#%provide case old-case do parameterize parameterize* current-parameterization call-with-parameterization parameterize-break current-break-parameterization call-with-break-parameterization with-handlers with-handlers* call-with-exception-handler set!-values let/cc fluid-let time - log-fatal log-error log-warning log-info log-debug)) + log-fatal log-error log-warning log-info log-debug + hash-update hash-update!)) diff --git a/collects/scheme/private/old-procs.ss b/collects/scheme/private/old-procs.ss index 061fc5b879..7a074fd377 100644 --- a/collects/scheme/private/old-procs.ss +++ b/collects/scheme/private/old-procs.ss @@ -54,12 +54,18 @@ (make-hash) (if (eq? a 'weak) (make-weak-hasheq) - (raise-mismatch-error 'make-hash-table "bad argument: " a)))] - [(a b) (if (or (and (eq? a 'equal) + (if (eq? a 'eqv) + (make-hasheqv) + (raise-mismatch-error 'make-hash-table "bad argument: " a))))] + [(a b) (if (or (and (or (eq? a 'equal) + (eq? a 'eqv)) (eq? b 'weak)) (and (eq? a 'weak) - (eq? b 'equal))) - (make-weak-hash) + (or (eq? b 'equal) + (eq? b 'eqv)))) + (if (or (eq? a 'eqv) (eq? b 'eqv)) + (make-weak-hasheqv) + (make-weak-hash)) (raise-mismatch-error 'make-hash-table "bad arguments: " (list a b)))])) (define make-immutable-hash-table @@ -67,23 +73,30 @@ [(l) (make-immutable-hasheq l)] [(l a) (if (eq? a 'equal) (make-immutable-hash l) - (raise-mismatch-error 'make-immutable-hash-table "bad argument: " a))])) + (if (eq? a 'eqv) + (make-immutable-hasheqv l) + (raise-mismatch-error 'make-immutable-hash-table "bad argument: " a)))])) (define hash-table? (case-lambda [(v) (hash? v)] [(v a) (if (eq? a 'equal) (and (hash? v) - (not (hash-eq? v))) + (not (hash-eq? v)) + (not (hash-eqv? v))) (if (eq? a 'weak) (and (hash? v) (hash-weak? v)) - (raise-mismatch-error 'hash-table? "bad argument: " a)))] - [(v a b) (if (or (and (eq? a 'equal) + (if (eq? a 'eqv) + (hash-eqv? v) + (raise-mismatch-error 'hash-table? "bad argument: " a))))] + [(v a b) (if (or (and (or (eq? a 'equal) (eq? a 'eqv)) (eq? b 'weak)) (and (eq? a 'weak) - (eq? b 'equal))) + (or (eq? b 'equal) (eq? b 'eqv)))) (and (hash? v) - (not (hash-eq? v)) + (if (or (eq? a 'eqv) (eq? b 'eqv)) + (hash-eqv? v) + (not (or (hash-eq? v) (hash-eqv? v)))) (hash-weak? v)) (raise-mismatch-error 'hash-table? "bad arguments: " (list a b)))]))) diff --git a/collects/scribblings/reference/dicts.scrbl b/collects/scribblings/reference/dicts.scrbl index 2994010ad8..645aaf3d62 100644 --- a/collects/scribblings/reference/dicts.scrbl +++ b/collects/scribblings/reference/dicts.scrbl @@ -163,6 +163,43 @@ result: +@defproc[(dict-update! [dict (and/c dict? (not/c immutable?))] + [key any/c] + [updater (any/c . -> . any/c)] + [failure-result any/c (lambda () (raise (make-exn:fail ....)))]) void?]{ + +Composes @scheme[dict-ref] and @scheme[dict-set!] to update an +existing mapping in @scheme[dict]. + +@examples[ +#:eval dict-eval +(define h (make-hash)) +(dict-update! h 'a add1) +(dict-update! h 'a add1 0) +h +(define v (vector #f #f #f)) +(dict-update! v 0 not) +v +]} + + +@defproc[(dict-update [dict dict?] + [key any/c] + [updater (any/c . -> . any/c)] + [failure-result any/c (lambda () (raise (make-exn:fail ....)))]) + (and/c dict? immutable?)]{ + +Composes @scheme[dict-ref] and @scheme[dict-set] to functionally +update an existing mapping in @scheme[dict]. + +@examples[ +#:eval dict-eval +(dict-update #hash() 'a add1) +(dict-update #hash() 'a add1 0) +(dict-update #hash((a . "apple") (b . "beer")) 'b string-length) +]} + + @defproc[(dict-remove! [dict (and/c dict? (not/c immutable?))] [key any/c]) void?]{ diff --git a/collects/scribblings/reference/hashes.scrbl b/collects/scribblings/reference/hashes.scrbl index 12264c6acd..eb631b61ba 100644 --- a/collects/scribblings/reference/hashes.scrbl +++ b/collects/scribblings/reference/hashes.scrbl @@ -7,10 +7,10 @@ A @deftech{hash table} (or simply @deftech{hash}) maps each of its keys to a single value. For a given hash table, keys are equivalent -via @scheme[equal?] or @scheme[eq?], and keys are retained either -strongly or weakly (see @secref["weakbox"]). A hash table is also -either mutable or immutable; immutable tables support constant-time -functional update. +via @scheme[equal?], @scheme[eqv?], or @scheme[eq?], and keys are +retained either strongly or weakly (see @secref["weakbox"]). A hash +table is also either mutable or immutable; immutable tables support +constant-time functional update. A hash table can be used as a two-valued @tech{sequence} (see @secref["sequences"]). The keys and values of the hash table serve as @@ -22,13 +22,14 @@ keys and values. See also @scheme[in-hash], @scheme[in-hash-keys], @scheme[in-hash-values], and @scheme[in-hash-pairs]. Two hash tables cannot be @scheme[equal?] unless they use the same -key-comparison procedure (@scheme[equal?] or @scheme[eq?]), both hold keys -strongly or weakly, and have the same mutability. +key-comparison procedure (@scheme[equal?], @scheme[eqv?], or +@scheme[eq?]), both hold keys strongly or weakly, and have the same +mutability. @bold{Caveats concerning concurrent modification:} A mutable hash table can be manipulated with @scheme[hash-ref], @scheme[hash-set!], and @scheme[hash-remove!] concurrently by multiple threads, and the -operations are protected by a table-specific semaphore as needed. Two +operations are protected by a table-specific semaphore as needed. Three caveats apply, however: @itemize{ @@ -50,6 +51,11 @@ caveats apply, however: otherwise the traversal skips a deleted key or uses the remapped key's new value).} + @item{The @scheme[hash-update!] function uses a table's semaphore + independently for the @scheme[hash-ref] and @scheme[hash-set!] parts + of its functionality, which means that the update as a whole is not + ``atomic.''} + } @bold{Caveat concerning mutable keys:} If a key into an @@ -63,10 +69,15 @@ for insertion and lookup operations becomes unpredictable. Returns @scheme[#t] if @scheme[v] is a @tech{hash table}, @scheme[#f] otherwise.} +@defproc[(hash-eqv? [hash hash?]) boolean?]{ + +Returns @scheme[#t] if @scheme[hash] compares keys with @scheme[eqv?], +@scheme[#f] if it compares with @scheme[equal?] or @scheme[eq?].} + @defproc[(hash-eq? [hash hash?]) boolean?]{ Returns @scheme[#t] if @scheme[hash] compares keys with @scheme[eq?], -@scheme[#f] if it compares with @scheme[equal?].} +@scheme[#f] if it compares with @scheme[equal?] or @scheme[eqv?].} @defproc[(hash-weak? [hash hash?]) boolean?]{ @@ -82,6 +93,12 @@ uses @scheme[equal?] to compare keys. See also @scheme[make-custom-hash].} +@defproc[(make-hasheqv) (and/c hash? hash-eqv?)]{ + +Creates an empty mutable hash table that holds keys strongly and that +uses @scheme[eqv?] to compare keys.} + + @defproc[(make-hasheq) (and/c hash? hash-eq?)]{ Creates an empty mutable hash table that holds keys strongly and that @@ -95,6 +112,12 @@ uses @scheme[equal?] to compare keys. See also @scheme[make-weak-custom-hash].} +@defproc[(make-weak-hasheqv) (and/c hash? hash-eqv? hash-weak?)]{ + +Creates an empty mutable hash table that holds keys weakly and that +uses @scheme[eqv?] to compare keys.} + + @defproc[(make-weak-hasheq) (and/c hash? hash-eq? hash-weak?)]{ Creates an empty mutable hash table that holds keys weakly and that @@ -111,6 +134,12 @@ value. The mappings are added to the table in the order that they appear in @scheme[assocs], so later mappings can hide earlier mappings.} +@defproc[(make-immutable-hasheqv [assocs (listof pair?)]) + (and/c hash? hash-eqv? immutable?)]{ + +Like @scheme[make-immutable-hash], but the resulting hash table +compares keys with @scheme[eqv?].} + @defproc[(make-immutable-hasheq [assocs (listof pair?)]) (and/c hash? hash-eq? immutable?)]{ @@ -156,6 +185,33 @@ result: }} +@defproc[(hash-update! [hash (and/c hash? (not/c immutable?))] + [key any/c] + [updater (any/c . -> . any/c)] + [failure-result any/c (lambda () + (raise (make-exn:fail:contract ....)))]) + void?]{ + +Composes @scheme[hash-ref] and @scheme[hash-set!] to update an +existing mapping in @scheme[hash], where the optional +@scheme[failure-result] argument is used as in @scheme[hash-ref] when +no mapping exists for @scheme[key] already. See the caveat above about +concurrent updates.} + + +@defproc[(hash-update [hash (and/c hash? immutable?)] + [key any/c] + [updater (any/c . -> . any/c)] + [failure-result any/c (lambda () + (raise (make-exn:fail:contract ....)))]) + (and/c hash? immutable?)]{ + +Composes @scheme[hash-ref] and @scheme[hash-set] to functionally +update an existing mapping in @scheme[hash], where the optional +@scheme[failure-result] argument is used as in @scheme[hash-ref] when +no mapping exists for @scheme[key] already.} + + @defproc[(hash-remove! [hash (and/c hash? (not/c immutable?))] [key any/c]) void?]{ @@ -259,6 +315,14 @@ returned integer is the same. Furthermore, for the result integer implies @scheme[(eq? k j)].} +@defproc[(eqv-hash-code [v any/c]) exact-integer?]{ + +Returns an exact integer; for any two @scheme[eqv?] values, the +returned integer is the same. Furthermore, for the result integer +@scheme[k] and any other exact integer @scheme[j], @scheme[(= k j)] +implies @scheme[(eq? k j)].} + + @defproc[(equal-hash-code [v any/c]) exact-integer?]{ Returns an exact integer; for any two @scheme[equal?] values, the diff --git a/collects/scribblings/reference/reader.scrbl b/collects/scribblings/reference/reader.scrbl index 997efbe288..2dddc9a9de 100644 --- a/collects/scribblings/reference/reader.scrbl +++ b/collects/scribblings/reference/reader.scrbl @@ -616,7 +616,11 @@ A @as-index{@litchar{#hasheq}} starts a hash table like @litchar{#hash}, except that it constructs a hash table based on @scheme[eq?] instead of @scheme[equal?]. -In either case, the table is constructed by adding each mapping to the +A @as-index{@litchar{#hasheqv}} starts a hash table like +@litchar{#hash}, except that it constructs a hash table based on +@scheme[eqv?] instead of @scheme[equal?]. + +In all cases, the table is constructed by adding each mapping to the hash table from left to right, so later mappings can hide earlier mappings if the keys are equivalent. diff --git a/collects/tests/mzscheme/basic.ss b/collects/tests/mzscheme/basic.ss index fdcfa46793..f492b0e285 100644 --- a/collects/tests/mzscheme/basic.ss +++ b/collects/tests/mzscheme/basic.ss @@ -313,6 +313,7 @@ (test #t immutable? (make-immutable-hasheq '((a . b)))) (test #t immutable? (make-immutable-hash '((a . b)))) (test #f immutable? (make-hasheq)) +(test #f immutable? (make-hasheqv)) (test #f immutable? (make-hash)) (test #f immutable? (make-weak-hasheq)) (test #f immutable? (make-weak-hash)) @@ -1904,12 +1905,15 @@ (arity-test make-hash 0 0) (arity-test make-hasheq 0 0) +(arity-test make-hasheqv 0 0) (arity-test make-weak-hash 0 0) (arity-test make-weak-hasheq 0 0) +(arity-test make-weak-hasheqv 0 0) -(define (hash-tests make-hash make-hasheq - make-weak-hash make-weak-hasheq - hash-ref hash-set! hash-remove! hash-count +(define (hash-tests make-hash make-hasheq make-hasheqv + make-weak-hash make-weak-hasheq make-weak-hasheqv + hash-ref hash-set! hash-update! + hash-remove! hash-count hash-map hash-for-each hash-iterate-first hash-iterate-next hash-iterate-value hash-iterate-key @@ -1932,15 +1936,36 @@ (make-hasheq))] [l (list 1 2 3)]) (test #t eq? (eq-hash-code l) (eq-hash-code l)) + (test #t eq? (eqv-hash-code l) (eqv-hash-code l)) (test #t eq? (equal-hash-code l) (equal-hash-code l)) (test #t eq? (equal-hash-code l) (equal-hash-code (list 1 2 3))) (hash-set! h1 l 'ok) (test 'ok hash-ref h1 l) + (hash-update! h1 l (curry cons 'more)) + (test '(more . ok) hash-ref h1 l) + (hash-update! h1 l cdr) (test 'nope hash-ref h1 (list 1 2 3) (lambda () 'nope)) (test '(((1 2 3) . ok)) hash-map h1 (lambda (k v) (cons k v))) (hash-remove! h1 l) - (test 'nope hash-ref h1 l (lambda () 'nope))) + (test 'nope hash-ref h1 l (lambda () 'nope)) + (err/rt-test (hash-update! h1 l add1)) + (hash-update! h1 l add1 0) + (test 1 hash-ref h1 l) + (hash-remove! h1 l)) + (let ([h1 (if weak? + (make-weak-hasheqv) + (make-hasheqv))] + [n (expt 2 500)] + [q (/ 1 2)] + [s (make-string 2 #\q)]) + (hash-set! h1 n 'power) + (hash-set! h1 q 'half) + (hash-set! h1 s 'string) + (test 'power hash-ref h1 (expt (read (open-input-string "2")) 500)) + (test 'half hash-ref h1 (/ 1 (read (open-input-string "2")))) + (test #f hash-ref h1 (make-string (read (open-input-string "2")) #\q) #f)) + (let ([h1 (if weak? (make-weak-hash) (make-hash))] @@ -2066,9 +2091,10 @@ (save)))) ; prevents gcing of the ht-registered values -(hash-tests make-hash make-hasheq - make-weak-hash make-weak-hasheq - hash-ref hash-set! hash-remove! hash-count +(hash-tests make-hash make-hasheq make-hasheqv + make-weak-hash make-weak-hasheq make-weak-hasheqv + hash-ref hash-set! hash-update! + hash-remove! hash-count hash-map hash-for-each hash-iterate-first hash-iterate-next hash-iterate-value hash-iterate-key @@ -2078,9 +2104,13 @@ (apply proc (unbox ht) args)))]) (hash-tests (lambda () (box #hash())) (lambda () (box #hasheq())) - #f #f + (lambda () (box #hasheqv())) + #f #f #f (ub-wrap hash-ref) (lambda (ht k v) (set-box! ht (hash-set (unbox ht) k v))) + (case-lambda + [(ht k u) (set-box! ht (hash-update (unbox ht) k u))] + [(ht k u def) (set-box! ht (hash-update (unbox ht) k u def))]) (lambda (ht k) (set-box! ht (hash-remove (unbox ht) k))) (ub-wrap hash-count) (ub-wrap hash-map) @@ -2093,18 +2123,35 @@ (test #f hash? 5) (test #t hash? (make-hasheq)) +(test #t hash? (make-hasheqv)) (test #t hash-eq? (make-hasheq)) (test #f hash-eq? (make-hash)) +(test #f hash-eq? (make-hasheqv)) (test #t hash-eq? (make-weak-hasheq)) (test #f hash-eq? (make-weak-hash)) +(test #f hash-eq? (make-weak-hasheqv)) +(test #f hash-eqv? (make-hasheq)) +(test #f hash-eqv? (make-hash)) +(test #t hash-eqv? (make-hasheqv)) +(test #f hash-eqv? (make-weak-hasheq)) +(test #f hash-eqv? (make-weak-hash)) +(test #t hash-eqv? (make-weak-hasheqv)) (test #f hash-weak? (make-hasheq)) (test #f hash-weak? (make-hash)) +(test #f hash-weak? (make-hasheqv)) (test #t hash-weak? (make-weak-hasheq)) (test #t hash-weak? (make-weak-hash)) +(test #t hash-weak? (make-weak-hasheqv)) (err/rt-test (hash-eq? 5)) +(err/rt-test (hash-eqv? 5)) (err/rt-test (hash-weak? 5)) +(let ([a (expt 2 500)] + [b (expt (read (open-input-string "2")) 500)]) + (test #t equal? (eqv-hash-code a) (eqv-hash-code b)) + (test #t equal? (equal-hash-code a) (equal-hash-code b))) + ;; Check for proper clearing of weak hash tables ;; (internally, value should get cleared along with key): (let ([ht (make-weak-hasheq)]) @@ -2139,6 +2186,28 @@ (err/rt-test (hash-remove! 1 2)) (err/rt-test (hash-ref (make-hasheq) 2) exn:application:mismatch?) +(let ([mk (lambda (mk) + (let ([ht (mk)]) + (hash-set! ht make-hash 2) + ht))]) + (test #t equal? (mk make-hash) (mk make-hash)) + (test #t equal? (mk make-hasheq) (mk make-hasheq)) + (test #t equal? (mk make-hasheqv) (mk make-hasheqv)) + (test #f equal? (mk make-hash) (mk make-hasheq)) + (test #f equal? (mk make-hash) (mk make-hasheqv)) + (test #f equal? (mk make-hasheq) (mk make-hasheqv)) + (test #f equal? (mk make-hash) (mk make-weak-hash)) + (test #f equal? (mk make-hasheq) (mk make-weak-hasheq)) + (test #f equal? (mk make-hasheqv) (mk make-weak-hasheqv))) +(let ([mk (lambda (mk) + (mk `((1 . 2))))]) + (test #t equal? (mk make-immutable-hash) (mk make-immutable-hash)) + (test #t equal? (mk make-immutable-hasheq) (mk make-immutable-hasheq)) + (test #t equal? (mk make-immutable-hasheqv) (mk make-immutable-hasheqv)) + (test #f equal? (mk make-immutable-hash) (mk make-immutable-hasheq)) + (test #f equal? (mk make-immutable-hash) (mk make-immutable-hasheqv)) + (test #f equal? (mk make-immutable-hasheq) (mk make-immutable-hasheqv))) + (define im-t (make-immutable-hasheq null)) (test #t hash? im-t) (test #t hash-eq? im-t) diff --git a/collects/tests/mzscheme/read.ss b/collects/tests/mzscheme/read.ss index 7e1bb0a8ef..c53e74d28b 100644 --- a/collects/tests/mzscheme/read.ss +++ b/collects/tests/mzscheme/read.ss @@ -295,6 +295,7 @@ (err/rt-test (readstr "#hash") exn:fail:read:eof?) (err/rt-test (readstr "#hashe") exn:fail:read:eof?) (err/rt-test (readstr "#hasheq") exn:fail:read:eof?) +(err/rt-test (readstr "#hasheqv") exn:fail:read:eof?) (err/rt-test (readstr "#hash(") exn:fail:read:eof?) (err/rt-test (readstr "#hash((1") exn:fail:read:eof?) (err/rt-test (readstr "#hash((1 .") exn:fail:read:eof?) @@ -331,12 +332,16 @@ (test-ht (readstr "#hash{(1 . 2)}") 1 #f 1 2) (test-ht (readstr "#hash{[1 . 2]}") 1 #f 1 2) (test-ht (readstr "#hasheq((1 . 2))") 1 #t 1 2) +(test-ht (readstr "#hasheqv((1 . 2))") 1 #f 1 2) (test-ht (readstr "#hash((\"apple\" . 1))") 1 #f "apple" 1) (test-ht (readstr "#hasheq((\"apple\" . 1))") 1 #t "apple" #f) +(test-ht (readstr "#hasheqv((\"apple\" . 1))") 1 #f "apple" #f) (test-ht (readstr "#hash((\"apple\" . 1) (\"apple\" . 10))") 1 #f "apple" 10) (test-ht (readstr "#hasheq((\"apple\" . 1) (\"apple\" . 10))") 2 #t "apple" #f) +(test-ht (readstr "#hasheqv((\"apple\" . 1) (\"apple\" . 10))") 2 #f "apple" #f) (test-ht (readstr "#hash((apple . 1) (apple . 10))") 1 #f 'apple 10) (test-ht (readstr "#hasheq((apple . 1) (apple . 10))") 1 #t 'apple 10) +(test-ht (readstr "#hasheqv((apple . 1) (apple . 10))") 1 #f 'apple 10) (test-ht (readstr "#hasheq((#0=\"apple\" . 1) (#0# . 10))") 1 #t "apple" #f) (test-ht (readstr "#hash((#0=\"apple\" . 1) (\"banana\" . #0#))") 2 #f "banana" "apple") (test-ht (readstr "#hash((a . 1) (b . 2) (c . 3) (e . 4) (f . 5) (g . 6) (h . 7) (i . 8))") 8 #f 'f 5) diff --git a/doc/release-notes/mzscheme/HISTORY.txt b/doc/release-notes/mzscheme/HISTORY.txt index 27b9ceff2c..124e6ca997 100644 --- a/doc/release-notes/mzscheme/HISTORY.txt +++ b/doc/release-notes/mzscheme/HISTORY.txt @@ -1,3 +1,7 @@ +Version 4.1.1.2 +Added eqv-based hash tables +Added hash-update and hash-update! + Version 4.1.1.1 Changed -X and -S to complete directory relative to pwd, and changed -S to add after main collects diff --git a/src/mzscheme/include/mzscheme.exp b/src/mzscheme/include/mzscheme.exp index e4c360354d..de53e76a8d 100644 --- a/src/mzscheme/include/mzscheme.exp +++ b/src/mzscheme/include/mzscheme.exp @@ -205,6 +205,7 @@ scheme_bucket_table_equal scheme_clone_bucket_table scheme_make_hash_table scheme_make_hash_table_equal +scheme_make_hash_table_eqv scheme_hash_set scheme_hash_get scheme_eq_hash_get @@ -212,6 +213,7 @@ scheme_hash_set_atomic scheme_hash_get_atomic scheme_hash_table_equal scheme_is_hash_table_equal +scheme_is_hash_table_eqv scheme_clone_hash_table scheme_make_hash_tree scheme_hash_tree_set @@ -220,6 +222,7 @@ scheme_hash_tree_next scheme_hash_tree_index scheme_hash_tree_equal scheme_is_hash_tree_equal +scheme_is_hash_tree_eqv scheme_make_prim scheme_make_noneternal_prim scheme_make_prim_w_arity @@ -519,6 +522,8 @@ scheme_equal_hash_key scheme_equal_hash_key2 scheme_recur_equal_hash_key scheme_recur_equal_hash_key2 +scheme_eqv_hash_key +scheme_eqv_hash_key2 scheme_set_type_equality scheme_recur_equal scheme_build_list diff --git a/src/mzscheme/include/mzscheme3m.exp b/src/mzscheme/include/mzscheme3m.exp index 8445281418..0aff5c145f 100644 --- a/src/mzscheme/include/mzscheme3m.exp +++ b/src/mzscheme/include/mzscheme3m.exp @@ -216,6 +216,7 @@ scheme_bucket_table_equal scheme_clone_bucket_table scheme_make_hash_table scheme_make_hash_table_equal +scheme_make_hash_table_eqv scheme_hash_set scheme_hash_get scheme_eq_hash_get @@ -223,6 +224,7 @@ scheme_hash_set_atomic scheme_hash_get_atomic scheme_hash_table_equal scheme_is_hash_table_equal +scheme_is_hash_table_eqv scheme_clone_hash_table scheme_make_hash_tree scheme_hash_tree_set @@ -231,6 +233,7 @@ scheme_hash_tree_next scheme_hash_tree_index scheme_hash_tree_equal scheme_is_hash_tree_equal +scheme_is_hash_tree_eqv scheme_make_prim scheme_make_noneternal_prim scheme_make_prim_w_arity @@ -531,6 +534,8 @@ scheme_equal_hash_key scheme_equal_hash_key2 scheme_recur_equal_hash_key scheme_recur_equal_hash_key2 +scheme_eqv_hash_key +scheme_eqv_hash_key2 scheme_set_type_equality scheme_recur_equal scheme_build_list diff --git a/src/mzscheme/include/mzwin.def b/src/mzscheme/include/mzwin.def index af098b5166..95b7b291da 100644 --- a/src/mzscheme/include/mzwin.def +++ b/src/mzscheme/include/mzwin.def @@ -193,6 +193,7 @@ EXPORTS scheme_clone_bucket_table scheme_make_hash_table scheme_make_hash_table_equal + scheme_make_hash_table_eqv scheme_hash_set scheme_hash_get scheme_eq_hash_get @@ -200,6 +201,7 @@ EXPORTS scheme_hash_get_atomic scheme_hash_table_equal scheme_is_hash_table_equal + scheme_is_hash_table_eqv scheme_clone_hash_table scheme_make_hash_tree scheme_hash_tree_set @@ -208,6 +210,7 @@ EXPORTS scheme_hash_tree_index scheme_hash_tree_equal scheme_is_hash_tree_equal + scheme_is_hash_tree_eqv scheme_make_prim scheme_make_noneternal_prim scheme_make_prim_w_arity @@ -507,6 +510,8 @@ EXPORTS scheme_equal_hash_key2 scheme_recur_equal_hash_key scheme_recur_equal_hash_key2 + scheme_eqv_hash_key + scheme_eqv_hash_key2 scheme_set_type_equality scheme_recur_equal scheme_build_list diff --git a/src/mzscheme/include/mzwin3m.def b/src/mzscheme/include/mzwin3m.def index 96bd5ea097..3b5fc05555 100644 --- a/src/mzscheme/include/mzwin3m.def +++ b/src/mzscheme/include/mzwin3m.def @@ -208,6 +208,7 @@ EXPORTS scheme_clone_bucket_table scheme_make_hash_table scheme_make_hash_table_equal + scheme_make_hash_table_eqv scheme_hash_set scheme_hash_get scheme_eq_hash_get @@ -215,6 +216,7 @@ EXPORTS scheme_hash_get_atomic scheme_hash_table_equal scheme_is_hash_table_equal + scheme_is_hash_table_eqv scheme_clone_hash_table scheme_make_hash_tree scheme_hash_tree_set @@ -223,6 +225,7 @@ EXPORTS scheme_hash_tree_index scheme_hash_tree_equal scheme_is_hash_tree_equal + scheme_is_hash_tree_eqv scheme_make_prim scheme_make_noneternal_prim scheme_make_prim_w_arity @@ -523,6 +526,8 @@ EXPORTS scheme_equal_hash_key2 scheme_recur_equal_hash_key scheme_recur_equal_hash_key2 + scheme_eqv_hash_key + scheme_eqv_hash_key2 scheme_set_type_equality scheme_recur_equal scheme_build_list diff --git a/src/mzscheme/src/cstartup.inc b/src/mzscheme/src/cstartup.inc index 044326d689..75dde36202 100644 --- a/src/mzscheme/src/cstartup.inc +++ b/src/mzscheme/src/cstartup.inc @@ -1,75 +1,75 @@ { - static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,52,46,49,46,49,46,49,50,0,0,0,1,0,0,6,0,9,0, -13,0,20,0,23,0,36,0,41,0,48,0,53,0,58,0,65,0,69,0,78, + static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,52,46,49,46,49,46,50,50,0,0,0,1,0,0,6,0,9,0, +13,0,26,0,29,0,34,0,41,0,46,0,51,0,58,0,65,0,69,0,78, 0,84,0,98,0,112,0,115,0,119,0,121,0,132,0,134,0,148,0,155,0, 177,0,179,0,193,0,253,0,23,1,32,1,41,1,51,1,68,1,107,1,146, 1,215,1,4,2,92,2,137,2,142,2,162,2,53,3,73,3,124,3,190,3, 75,4,233,4,20,5,31,5,110,5,0,0,119,7,0,0,65,98,101,103,105, -110,29,11,11,63,108,101,116,66,100,101,102,105,110,101,62,111,114,72,112,97, -114,97,109,101,116,101,114,105,122,101,64,108,101,116,42,66,117,110,108,101,115, -115,64,99,111,110,100,64,119,104,101,110,66,108,101,116,114,101,99,63,97,110, +110,29,11,11,63,108,101,116,72,112,97,114,97,109,101,116,101,114,105,122,101, +62,111,114,64,108,101,116,42,66,117,110,108,101,115,115,64,99,111,110,100,64, +119,104,101,110,66,108,101,116,114,101,99,66,100,101,102,105,110,101,63,97,110, 100,68,104,101,114,101,45,115,116,120,65,113,117,111,116,101,29,94,2,14,68, 35,37,107,101,114,110,101,108,11,29,94,2,14,68,35,37,112,97,114,97,109, 122,11,62,105,102,63,115,116,120,61,115,70,108,101,116,45,118,97,108,117,101, 115,61,120,73,108,101,116,114,101,99,45,118,97,108,117,101,115,66,108,97,109, 98,100,97,1,20,112,97,114,97,109,101,116,101,114,105,122,97,116,105,111,110, 45,107,101,121,61,118,73,100,101,102,105,110,101,45,118,97,108,117,101,115,98, -10,35,11,8,174,227,94,159,2,16,35,35,159,2,15,35,35,16,20,2,3, -2,2,2,4,2,2,2,11,2,2,2,5,2,2,2,6,2,2,2,7,2, -2,2,8,2,2,2,9,2,2,2,10,2,2,2,12,2,2,97,36,11,8, -174,227,93,159,2,15,35,36,16,2,2,13,161,2,2,36,2,13,2,2,2, -13,97,10,11,11,8,174,227,16,0,97,10,37,11,8,174,227,16,0,13,16, +10,35,11,8,186,227,94,159,2,16,35,35,159,2,15,35,35,16,20,2,3, +2,2,2,4,2,2,2,10,2,2,2,5,2,2,2,6,2,2,2,7,2, +2,2,8,2,2,2,9,2,2,2,11,2,2,2,12,2,2,97,36,11,8, +186,227,93,159,2,15,35,36,16,2,2,13,161,2,2,36,2,13,2,2,2, +13,97,10,11,11,8,186,227,16,0,97,10,37,11,8,186,227,16,0,13,16, 4,35,29,11,11,2,2,11,18,98,64,104,101,114,101,8,31,8,30,8,29, -8,28,8,27,27,248,22,190,3,23,196,1,249,22,183,3,80,158,38,35,251, +8,28,8,27,27,248,22,132,4,23,196,1,249,22,189,3,80,158,38,35,251, 22,73,2,17,248,22,88,23,200,2,12,249,22,63,2,1,248,22,90,23,202, -1,27,248,22,190,3,23,196,1,249,22,183,3,80,158,38,35,251,22,73,2, +1,27,248,22,132,4,23,196,1,249,22,189,3,80,158,38,35,251,22,73,2, 17,248,22,88,23,200,2,249,22,63,2,1,248,22,90,23,202,1,12,27,248, -22,65,248,22,190,3,23,197,1,28,248,22,71,23,194,2,20,15,159,36,35, -36,28,248,22,71,248,22,65,23,195,2,248,22,64,193,249,22,183,3,80,158, +22,65,248,22,132,4,23,197,1,28,248,22,71,23,194,2,20,15,159,36,35, +36,28,248,22,71,248,22,65,23,195,2,248,22,64,193,249,22,189,3,80,158, 38,35,251,22,73,2,17,248,22,64,23,200,2,249,22,63,2,12,248,22,65, 23,202,1,11,18,100,10,8,31,8,30,8,29,8,28,8,27,16,4,11,11, -2,18,3,1,7,101,110,118,57,57,52,52,16,4,11,11,2,19,3,1,7, -101,110,118,57,57,52,53,27,248,22,65,248,22,190,3,23,197,1,28,248,22, +2,18,3,1,7,101,110,118,57,57,53,54,16,4,11,11,2,19,3,1,7, +101,110,118,57,57,53,55,27,248,22,65,248,22,132,4,23,197,1,28,248,22, 71,23,194,2,20,15,159,36,35,36,28,248,22,71,248,22,65,23,195,2,248, -22,64,193,249,22,183,3,80,158,38,35,250,22,73,2,20,248,22,73,249,22, +22,64,193,249,22,189,3,80,158,38,35,250,22,73,2,20,248,22,73,249,22, 73,248,22,73,2,21,248,22,64,23,202,2,251,22,73,2,17,2,21,2,21, 249,22,63,2,5,248,22,65,23,205,1,18,100,11,8,31,8,30,8,29,8, -28,8,27,16,4,11,11,2,18,3,1,7,101,110,118,57,57,52,55,16,4, -11,11,2,19,3,1,7,101,110,118,57,57,52,56,248,22,190,3,193,27,248, -22,190,3,194,249,22,63,248,22,73,248,22,64,196,248,22,65,195,27,248,22, -65,248,22,190,3,23,197,1,249,22,183,3,80,158,38,35,28,248,22,51,248, -22,184,3,248,22,64,23,198,2,27,249,22,2,32,0,89,162,8,44,36,42, -9,222,33,39,248,22,190,3,248,22,88,23,200,2,250,22,73,2,22,248,22, +28,8,27,16,4,11,11,2,18,3,1,7,101,110,118,57,57,53,57,16,4, +11,11,2,19,3,1,7,101,110,118,57,57,54,48,248,22,132,4,193,27,248, +22,132,4,194,249,22,63,248,22,73,248,22,64,196,248,22,65,195,27,248,22, +65,248,22,132,4,23,197,1,249,22,189,3,80,158,38,35,28,248,22,51,248, +22,190,3,248,22,64,23,198,2,27,249,22,2,32,0,89,162,8,44,36,42, +9,222,33,39,248,22,132,4,248,22,88,23,200,2,250,22,73,2,22,248,22, 73,249,22,73,248,22,73,248,22,64,23,204,2,250,22,74,2,23,249,22,2, 22,64,23,204,2,248,22,90,23,206,2,249,22,63,248,22,64,23,202,1,249, 22,2,22,88,23,200,1,250,22,74,2,20,249,22,2,32,0,89,162,8,44, -36,46,9,222,33,40,248,22,190,3,248,22,64,201,248,22,65,198,27,248,22, -190,3,194,249,22,63,248,22,73,248,22,64,196,248,22,65,195,27,248,22,65, -248,22,190,3,23,197,1,249,22,183,3,80,158,38,35,250,22,74,2,22,249, -22,2,32,0,89,162,8,44,36,46,9,222,33,42,248,22,190,3,248,22,64, -201,248,22,65,198,27,248,22,65,248,22,190,3,196,27,248,22,190,3,248,22, -64,195,249,22,183,3,80,158,39,35,28,248,22,71,195,250,22,74,2,20,9, -248,22,65,199,250,22,73,2,3,248,22,73,248,22,64,199,250,22,74,2,7, -248,22,65,201,248,22,65,202,27,248,22,65,248,22,190,3,23,197,1,27,249, -22,1,22,77,249,22,2,22,190,3,248,22,190,3,248,22,64,199,249,22,183, +36,46,9,222,33,40,248,22,132,4,248,22,64,201,248,22,65,198,27,248,22, +132,4,194,249,22,63,248,22,73,248,22,64,196,248,22,65,195,27,248,22,65, +248,22,132,4,23,197,1,249,22,189,3,80,158,38,35,250,22,74,2,22,249, +22,2,32,0,89,162,8,44,36,46,9,222,33,42,248,22,132,4,248,22,64, +201,248,22,65,198,27,248,22,65,248,22,132,4,196,27,248,22,132,4,248,22, +64,195,249,22,189,3,80,158,39,35,28,248,22,71,195,250,22,74,2,20,9, +248,22,65,199,250,22,73,2,3,248,22,73,248,22,64,199,250,22,74,2,6, +248,22,65,201,248,22,65,202,27,248,22,65,248,22,132,4,23,197,1,27,249, +22,1,22,77,249,22,2,22,132,4,248,22,132,4,248,22,64,199,249,22,189, 3,80,158,39,35,251,22,73,1,22,119,105,116,104,45,99,111,110,116,105,110, 117,97,116,105,111,110,45,109,97,114,107,2,24,250,22,74,1,23,101,120,116, 101,110,100,45,112,97,114,97,109,101,116,101,114,105,122,97,116,105,111,110,21, 95,1,27,99,111,110,116,105,110,117,97,116,105,111,110,45,109,97,114,107,45, 115,101,116,45,102,105,114,115,116,11,2,24,201,250,22,74,2,20,9,248,22, -65,203,27,248,22,65,248,22,190,3,23,197,1,28,248,22,71,23,194,2,20, -15,159,36,35,36,249,22,183,3,80,158,38,35,27,248,22,190,3,248,22,64, -23,198,2,28,249,22,154,8,62,61,62,248,22,184,3,248,22,88,23,197,2, +65,203,27,248,22,65,248,22,132,4,23,197,1,28,248,22,71,23,194,2,20, +15,159,36,35,36,249,22,189,3,80,158,38,35,27,248,22,132,4,248,22,64, +23,198,2,28,249,22,160,8,62,61,62,248,22,190,3,248,22,88,23,197,2, 250,22,73,2,20,248,22,73,249,22,73,21,93,2,25,248,22,64,199,250,22, -74,2,9,249,22,73,2,25,249,22,73,248,22,97,203,2,25,248,22,65,202, -251,22,73,2,17,28,249,22,154,8,248,22,184,3,248,22,64,23,201,2,64, +74,2,8,249,22,73,2,25,249,22,73,248,22,97,203,2,25,248,22,65,202, +251,22,73,2,17,28,249,22,160,8,248,22,190,3,248,22,64,23,201,2,64, 101,108,115,101,10,248,22,64,23,198,2,250,22,74,2,20,9,248,22,65,23, -201,1,249,22,63,2,9,248,22,65,23,203,1,99,8,31,8,30,8,29,8, -28,8,27,16,4,11,11,2,18,3,1,7,101,110,118,57,57,55,48,16,4, -11,11,2,19,3,1,7,101,110,118,57,57,55,49,18,158,94,10,64,118,111, -105,100,8,47,27,248,22,65,248,22,190,3,196,249,22,183,3,80,158,38,35, -28,248,22,51,248,22,184,3,248,22,64,197,250,22,73,2,26,248,22,73,248, -22,64,199,248,22,88,198,27,248,22,184,3,248,22,64,197,250,22,73,2,26, +201,1,249,22,63,2,8,248,22,65,23,203,1,99,8,31,8,30,8,29,8, +28,8,27,16,4,11,11,2,18,3,1,7,101,110,118,57,57,56,50,16,4, +11,11,2,19,3,1,7,101,110,118,57,57,56,51,18,158,94,10,64,118,111, +105,100,8,47,27,248,22,65,248,22,132,4,196,249,22,189,3,80,158,38,35, +28,248,22,51,248,22,190,3,248,22,64,197,250,22,73,2,26,248,22,73,248, +22,64,199,248,22,88,198,27,248,22,190,3,248,22,64,197,250,22,73,2,26, 248,22,73,248,22,64,197,250,22,74,2,23,248,22,65,199,248,22,65,202,159, 35,20,103,159,35,16,1,2,1,16,0,83,158,41,20,100,138,69,35,37,109, 105,110,45,115,116,120,2,2,11,10,11,10,35,80,158,35,35,20,103,159,35, @@ -78,28 +78,28 @@ 11,11,11,11,11,11,16,10,2,3,2,4,2,5,2,6,2,7,2,8,2, 9,2,10,2,11,2,12,35,45,36,11,11,16,0,16,0,16,0,35,35,11, 11,11,16,0,16,0,16,0,35,35,16,11,16,5,93,2,13,20,15,159,35, -35,35,35,20,103,159,35,16,0,16,1,33,32,10,16,5,93,2,8,89,162, +35,35,35,20,103,159,35,16,0,16,1,33,32,10,16,5,93,2,7,89,162, 8,44,36,52,9,223,0,33,33,35,20,103,159,35,16,1,20,25,159,36,2, -2,2,13,16,0,11,16,5,93,2,10,89,162,8,44,36,52,9,223,0,33, +2,2,13,16,0,11,16,5,93,2,9,89,162,8,44,36,52,9,223,0,33, 34,35,20,103,159,35,16,1,20,25,159,36,2,2,2,13,16,0,11,16,5, 93,2,12,89,162,8,44,36,52,9,223,0,33,35,35,20,103,159,35,16,1, 20,25,159,36,2,2,2,13,16,1,33,36,11,16,5,93,2,5,89,162,8, 44,36,55,9,223,0,33,37,35,20,103,159,35,16,1,20,25,159,36,2,2, 2,13,16,1,33,38,11,16,5,93,2,3,89,162,8,44,36,57,9,223,0, 33,41,35,20,103,159,35,16,1,20,25,159,36,2,2,2,13,16,0,11,16, -5,93,2,11,89,162,8,44,36,52,9,223,0,33,43,35,20,103,159,35,16, -1,20,25,159,36,2,2,2,13,16,0,11,16,5,93,2,7,89,162,8,44, +5,93,2,10,89,162,8,44,36,52,9,223,0,33,43,35,20,103,159,35,16, +1,20,25,159,36,2,2,2,13,16,0,11,16,5,93,2,6,89,162,8,44, 36,53,9,223,0,33,44,35,20,103,159,35,16,1,20,25,159,36,2,2,2, -13,16,0,11,16,5,93,2,6,89,162,8,44,36,54,9,223,0,33,45,35, +13,16,0,11,16,5,93,2,4,89,162,8,44,36,54,9,223,0,33,45,35, 20,103,159,35,16,1,20,25,159,36,2,2,2,13,16,0,11,16,5,93,2, -9,89,162,8,44,36,57,9,223,0,33,46,35,20,103,159,35,16,1,20,25, -159,36,2,2,2,13,16,1,33,48,11,16,5,93,2,4,89,162,8,44,36, +8,89,162,8,44,36,57,9,223,0,33,46,35,20,103,159,35,16,1,20,25, +159,36,2,2,2,13,16,1,33,48,11,16,5,93,2,11,89,162,8,44,36, 53,9,223,0,33,49,35,20,103,159,35,16,1,20,25,159,36,2,2,2,13, 16,0,11,16,0,94,2,15,2,16,93,2,15,9,9,35,0}; EVAL_ONE_SIZED_STR((char *)expr, 2032); } { - static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,52,46,49,46,49,46,49,60,0,0,0,1,0,0,3,0,16,0, + static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,52,46,49,46,49,46,50,60,0,0,0,1,0,0,3,0,16,0, 21,0,38,0,53,0,71,0,87,0,97,0,115,0,135,0,151,0,169,0,200, 0,229,0,251,0,9,1,15,1,29,1,34,1,44,1,52,1,80,1,112,1, 157,1,202,1,226,1,9,2,11,2,68,2,158,3,199,3,33,5,137,5,241, @@ -131,177 +131,177 @@ 111,114,32,98,121,116,101,32,115,116,114,105,110,103,6,36,36,99,97,110,110, 111,116,32,97,100,100,32,97,32,115,117,102,102,105,120,32,116,111,32,97,32, 114,111,111,116,32,112,97,116,104,58,32,5,0,27,20,14,159,80,158,36,50, -250,80,158,39,51,249,22,27,11,80,158,41,50,22,170,12,10,248,22,147,5, -23,196,2,28,248,22,144,6,23,194,2,12,87,94,248,22,157,8,23,194,1, +250,80,158,39,51,249,22,27,11,80,158,41,50,22,176,12,10,248,22,153,5, +23,196,2,28,248,22,150,6,23,194,2,12,87,94,248,22,163,8,23,194,1, 248,80,159,37,53,36,195,28,248,22,71,23,195,2,9,27,248,22,64,23,196, -2,27,28,248,22,151,13,23,195,2,23,194,1,28,248,22,150,13,23,195,2, -249,22,152,13,23,196,1,250,80,158,42,48,248,22,166,13,2,20,11,10,250, -80,158,40,48,248,22,166,13,2,20,23,197,1,10,28,23,193,2,249,22,63, -248,22,154,13,249,22,152,13,23,198,1,247,22,167,13,27,248,22,65,23,200, -1,28,248,22,71,23,194,2,9,27,248,22,64,23,195,2,27,28,248,22,151, -13,23,195,2,23,194,1,28,248,22,150,13,23,195,2,249,22,152,13,23,196, -1,250,80,158,47,48,248,22,166,13,2,20,11,10,250,80,158,45,48,248,22, -166,13,2,20,23,197,1,10,28,23,193,2,249,22,63,248,22,154,13,249,22, -152,13,23,198,1,247,22,167,13,248,80,159,45,52,36,248,22,65,23,199,1, +2,27,28,248,22,157,13,23,195,2,23,194,1,28,248,22,156,13,23,195,2, +249,22,158,13,23,196,1,250,80,158,42,48,248,22,172,13,2,20,11,10,250, +80,158,40,48,248,22,172,13,2,20,23,197,1,10,28,23,193,2,249,22,63, +248,22,160,13,249,22,158,13,23,198,1,247,22,173,13,27,248,22,65,23,200, +1,28,248,22,71,23,194,2,9,27,248,22,64,23,195,2,27,28,248,22,157, +13,23,195,2,23,194,1,28,248,22,156,13,23,195,2,249,22,158,13,23,196, +1,250,80,158,47,48,248,22,172,13,2,20,11,10,250,80,158,45,48,248,22, +172,13,2,20,23,197,1,10,28,23,193,2,249,22,63,248,22,160,13,249,22, +158,13,23,198,1,247,22,173,13,248,80,159,45,52,36,248,22,65,23,199,1, 87,94,23,193,1,248,80,159,43,52,36,248,22,65,23,197,1,87,94,23,193, 1,27,248,22,65,23,198,1,28,248,22,71,23,194,2,9,27,248,22,64,23, -195,2,27,28,248,22,151,13,23,195,2,23,194,1,28,248,22,150,13,23,195, -2,249,22,152,13,23,196,1,250,80,158,45,48,248,22,166,13,2,20,11,10, -250,80,158,43,48,248,22,166,13,2,20,23,197,1,10,28,23,193,2,249,22, -63,248,22,154,13,249,22,152,13,23,198,1,247,22,167,13,248,80,159,43,52, -36,248,22,65,23,199,1,248,80,159,41,52,36,248,22,65,196,27,248,22,191, -12,23,195,2,28,23,193,2,192,87,94,23,193,1,28,248,22,149,6,23,195, -2,27,248,22,149,13,195,28,192,192,248,22,150,13,195,11,87,94,28,28,248, -22,128,13,23,195,2,10,27,248,22,191,12,23,196,2,28,23,193,2,192,87, -94,23,193,1,28,248,22,149,6,23,196,2,27,248,22,149,13,23,197,2,28, -23,193,2,192,87,94,23,193,1,248,22,150,13,23,197,2,11,12,250,22,184, +195,2,27,28,248,22,157,13,23,195,2,23,194,1,28,248,22,156,13,23,195, +2,249,22,158,13,23,196,1,250,80,158,45,48,248,22,172,13,2,20,11,10, +250,80,158,43,48,248,22,172,13,2,20,23,197,1,10,28,23,193,2,249,22, +63,248,22,160,13,249,22,158,13,23,198,1,247,22,173,13,248,80,159,43,52, +36,248,22,65,23,199,1,248,80,159,41,52,36,248,22,65,196,27,248,22,133, +13,23,195,2,28,23,193,2,192,87,94,23,193,1,28,248,22,155,6,23,195, +2,27,248,22,155,13,195,28,192,192,248,22,156,13,195,11,87,94,28,28,248, +22,134,13,23,195,2,10,27,248,22,133,13,23,196,2,28,23,193,2,192,87, +94,23,193,1,28,248,22,155,6,23,196,2,27,248,22,155,13,23,197,2,28, +23,193,2,192,87,94,23,193,1,248,22,156,13,23,197,2,11,12,250,22,190, 8,76,110,111,114,109,97,108,45,112,97,116,104,45,99,97,115,101,6,42,42, 112,97,116,104,32,40,102,111,114,32,97,110,121,32,115,121,115,116,101,109,41, 32,111,114,32,118,97,108,105,100,45,112,97,116,104,32,115,116,114,105,110,103, -23,197,2,28,28,248,22,128,13,23,195,2,249,22,154,8,248,22,129,13,23, -197,2,2,21,249,22,154,8,247,22,168,7,2,21,27,28,248,22,149,6,23, -196,2,23,195,2,248,22,158,7,248,22,132,13,23,197,2,28,249,22,179,13, +23,197,2,28,28,248,22,134,13,23,195,2,249,22,160,8,248,22,135,13,23, +197,2,2,21,249,22,160,8,247,22,174,7,2,21,27,28,248,22,155,6,23, +196,2,23,195,2,248,22,164,7,248,22,138,13,23,197,2,28,249,22,185,13, 0,21,35,114,120,34,94,91,92,92,93,91,92,92,93,91,63,93,91,92,92, -93,34,23,195,2,28,248,22,149,6,195,248,22,135,13,195,194,27,248,22,188, -6,23,195,1,249,22,136,13,248,22,161,7,250,22,185,13,0,6,35,114,120, -34,47,34,28,249,22,179,13,0,22,35,114,120,34,91,47,92,92,93,91,46, -32,93,43,91,47,92,92,93,42,36,34,23,201,2,23,199,1,250,22,185,13, +93,34,23,195,2,28,248,22,155,6,195,248,22,141,13,195,194,27,248,22,130, +7,23,195,1,249,22,142,13,248,22,167,7,250,22,191,13,0,6,35,114,120, +34,47,34,28,249,22,185,13,0,22,35,114,120,34,91,47,92,92,93,91,46, +32,93,43,91,47,92,92,93,42,36,34,23,201,2,23,199,1,250,22,191,13, 0,19,35,114,120,34,91,32,46,93,43,40,91,47,92,92,93,42,41,36,34, -23,202,1,6,2,2,92,49,80,158,43,36,2,21,28,248,22,149,6,194,248, -22,135,13,194,193,87,94,28,27,248,22,191,12,23,196,2,28,23,193,2,192, -87,94,23,193,1,28,248,22,149,6,23,196,2,27,248,22,149,13,23,197,2, -28,23,193,2,192,87,94,23,193,1,248,22,150,13,23,197,2,11,12,250,22, -184,8,23,196,2,2,22,23,197,2,28,248,22,149,13,23,195,2,12,248,22, -146,11,249,22,155,10,248,22,178,6,250,22,133,7,2,23,23,200,1,23,201, -1,247,22,23,87,94,28,27,248,22,191,12,23,196,2,28,23,193,2,192,87, -94,23,193,1,28,248,22,149,6,23,196,2,27,248,22,149,13,23,197,2,28, -23,193,2,192,87,94,23,193,1,248,22,150,13,23,197,2,11,12,250,22,184, -8,23,196,2,2,22,23,197,2,28,248,22,149,13,23,195,2,12,248,22,146, -11,249,22,155,10,248,22,178,6,250,22,133,7,2,23,23,200,1,23,201,1, -247,22,23,87,94,87,94,28,27,248,22,191,12,23,196,2,28,23,193,2,192, -87,94,23,193,1,28,248,22,149,6,23,196,2,27,248,22,149,13,23,197,2, -28,23,193,2,192,87,94,23,193,1,248,22,150,13,23,197,2,11,12,250,22, -184,8,195,2,22,23,197,2,28,248,22,149,13,23,195,2,12,248,22,146,11, -249,22,155,10,248,22,178,6,250,22,133,7,2,23,199,23,201,1,247,22,23, -249,22,3,89,162,8,44,36,49,9,223,2,33,34,196,248,22,146,11,249,22, -185,10,23,196,1,247,22,23,87,94,250,80,159,38,39,36,2,7,196,197,251, +23,202,1,6,2,2,92,49,80,158,43,36,2,21,28,248,22,155,6,194,248, +22,141,13,194,193,87,94,28,27,248,22,133,13,23,196,2,28,23,193,2,192, +87,94,23,193,1,28,248,22,155,6,23,196,2,27,248,22,155,13,23,197,2, +28,23,193,2,192,87,94,23,193,1,248,22,156,13,23,197,2,11,12,250,22, +190,8,23,196,2,2,22,23,197,2,28,248,22,155,13,23,195,2,12,248,22, +152,11,249,22,161,10,248,22,184,6,250,22,139,7,2,23,23,200,1,23,201, +1,247,22,23,87,94,28,27,248,22,133,13,23,196,2,28,23,193,2,192,87, +94,23,193,1,28,248,22,155,6,23,196,2,27,248,22,155,13,23,197,2,28, +23,193,2,192,87,94,23,193,1,248,22,156,13,23,197,2,11,12,250,22,190, +8,23,196,2,2,22,23,197,2,28,248,22,155,13,23,195,2,12,248,22,152, +11,249,22,161,10,248,22,184,6,250,22,139,7,2,23,23,200,1,23,201,1, +247,22,23,87,94,87,94,28,27,248,22,133,13,23,196,2,28,23,193,2,192, +87,94,23,193,1,28,248,22,155,6,23,196,2,27,248,22,155,13,23,197,2, +28,23,193,2,192,87,94,23,193,1,248,22,156,13,23,197,2,11,12,250,22, +190,8,195,2,22,23,197,2,28,248,22,155,13,23,195,2,12,248,22,152,11, +249,22,161,10,248,22,184,6,250,22,139,7,2,23,199,23,201,1,247,22,23, +249,22,3,89,162,8,44,36,49,9,223,2,33,34,196,248,22,152,11,249,22, +191,10,23,196,1,247,22,23,87,94,250,80,159,38,39,36,2,7,196,197,251, 80,159,39,41,36,2,7,32,0,89,162,8,44,36,44,9,222,33,36,197,198, 32,38,89,162,43,41,58,65,99,108,111,111,112,222,33,39,28,248,22,71,23, -199,2,87,94,23,198,1,248,23,196,1,251,22,133,7,2,24,23,199,1,28, -248,22,71,23,203,2,87,94,23,202,1,23,201,1,250,22,1,22,145,13,23, -204,1,23,205,1,23,198,1,27,249,22,145,13,248,22,64,23,202,2,23,199, -2,28,248,22,140,13,23,194,2,27,250,22,1,22,145,13,23,197,1,23,202, -2,28,248,22,140,13,23,194,2,192,87,94,23,193,1,27,248,22,65,23,202, -1,28,248,22,71,23,194,2,87,94,23,193,1,248,23,199,1,251,22,133,7, +199,2,87,94,23,198,1,248,23,196,1,251,22,139,7,2,24,23,199,1,28, +248,22,71,23,203,2,87,94,23,202,1,23,201,1,250,22,1,22,151,13,23, +204,1,23,205,1,23,198,1,27,249,22,151,13,248,22,64,23,202,2,23,199, +2,28,248,22,146,13,23,194,2,27,250,22,1,22,151,13,23,197,1,23,202, +2,28,248,22,146,13,23,194,2,192,87,94,23,193,1,27,248,22,65,23,202, +1,28,248,22,71,23,194,2,87,94,23,193,1,248,23,199,1,251,22,139,7, 2,24,23,202,1,28,248,22,71,23,206,2,87,94,23,205,1,23,204,1,250, -22,1,22,145,13,23,207,1,23,208,1,23,201,1,27,249,22,145,13,248,22, -64,23,197,2,23,202,2,28,248,22,140,13,23,194,2,27,250,22,1,22,145, -13,23,197,1,204,28,248,22,140,13,193,192,253,2,38,203,204,205,206,23,15, +22,1,22,151,13,23,207,1,23,208,1,23,201,1,27,249,22,151,13,248,22, +64,23,197,2,23,202,2,28,248,22,146,13,23,194,2,27,250,22,1,22,151, +13,23,197,1,204,28,248,22,146,13,193,192,253,2,38,203,204,205,206,23,15, 248,22,65,201,253,2,38,202,203,204,205,206,248,22,65,200,87,94,23,193,1, 27,248,22,65,23,201,1,28,248,22,71,23,194,2,87,94,23,193,1,248,23, -198,1,251,22,133,7,2,24,23,201,1,28,248,22,71,23,205,2,87,94,23, -204,1,23,203,1,250,22,1,22,145,13,23,206,1,23,207,1,23,200,1,27, -249,22,145,13,248,22,64,23,197,2,23,201,2,28,248,22,140,13,23,194,2, -27,250,22,1,22,145,13,23,197,1,203,28,248,22,140,13,193,192,253,2,38, +198,1,251,22,139,7,2,24,23,201,1,28,248,22,71,23,205,2,87,94,23, +204,1,23,203,1,250,22,1,22,151,13,23,206,1,23,207,1,23,200,1,27, +249,22,151,13,248,22,64,23,197,2,23,201,2,28,248,22,146,13,23,194,2, +27,250,22,1,22,151,13,23,197,1,203,28,248,22,146,13,193,192,253,2,38, 202,203,204,205,206,248,22,65,201,253,2,38,201,202,203,204,205,248,22,65,200, -27,247,22,168,13,253,2,38,198,199,200,201,202,198,87,95,28,28,248,22,128, -13,23,194,2,10,27,248,22,191,12,23,195,2,28,23,193,2,192,87,94,23, -193,1,28,248,22,149,6,23,195,2,27,248,22,149,13,23,196,2,28,23,193, -2,192,87,94,23,193,1,248,22,150,13,23,196,2,11,12,252,22,184,8,23, -200,2,2,25,35,23,198,2,23,199,2,28,28,248,22,149,6,23,195,2,10, -248,22,137,7,23,195,2,87,94,23,194,1,12,252,22,184,8,23,200,2,2, -26,36,23,198,2,23,199,1,91,159,38,11,90,161,38,35,11,248,22,148,13, -23,197,2,87,94,23,195,1,87,94,28,192,12,250,22,185,8,23,201,1,2, +27,247,22,174,13,253,2,38,198,199,200,201,202,198,87,95,28,28,248,22,134, +13,23,194,2,10,27,248,22,133,13,23,195,2,28,23,193,2,192,87,94,23, +193,1,28,248,22,155,6,23,195,2,27,248,22,155,13,23,196,2,28,23,193, +2,192,87,94,23,193,1,248,22,156,13,23,196,2,11,12,252,22,190,8,23, +200,2,2,25,35,23,198,2,23,199,2,28,28,248,22,155,6,23,195,2,10, +248,22,143,7,23,195,2,87,94,23,194,1,12,252,22,190,8,23,200,2,2, +26,36,23,198,2,23,199,1,91,159,38,11,90,161,38,35,11,248,22,154,13, +23,197,2,87,94,23,195,1,87,94,28,192,12,250,22,191,8,23,201,1,2, 27,23,199,1,249,22,7,194,195,91,159,37,11,90,161,37,35,11,87,95,28, -28,248,22,128,13,23,196,2,10,27,248,22,191,12,23,197,2,28,23,193,2, -192,87,94,23,193,1,28,248,22,149,6,23,197,2,27,248,22,149,13,23,198, -2,28,23,193,2,192,87,94,23,193,1,248,22,150,13,23,198,2,11,12,252, -22,184,8,2,10,2,25,35,23,200,2,23,201,2,28,28,248,22,149,6,23, -197,2,10,248,22,137,7,23,197,2,12,252,22,184,8,2,10,2,26,36,23, -200,2,23,201,2,91,159,38,11,90,161,38,35,11,248,22,148,13,23,199,2, -87,94,23,195,1,87,94,28,23,193,2,12,250,22,185,8,2,10,2,27,23, -201,2,249,22,7,23,195,1,23,196,1,27,249,22,137,13,250,22,184,13,0, +28,248,22,134,13,23,196,2,10,27,248,22,133,13,23,197,2,28,23,193,2, +192,87,94,23,193,1,28,248,22,155,6,23,197,2,27,248,22,155,13,23,198, +2,28,23,193,2,192,87,94,23,193,1,248,22,156,13,23,198,2,11,12,252, +22,190,8,2,10,2,25,35,23,200,2,23,201,2,28,28,248,22,155,6,23, +197,2,10,248,22,143,7,23,197,2,12,252,22,190,8,2,10,2,26,36,23, +200,2,23,201,2,91,159,38,11,90,161,38,35,11,248,22,154,13,23,199,2, +87,94,23,195,1,87,94,28,23,193,2,12,250,22,191,8,2,10,2,27,23, +201,2,249,22,7,23,195,1,23,196,1,27,249,22,143,13,250,22,190,13,0, 18,35,114,120,35,34,40,91,46,93,91,94,46,93,42,124,41,36,34,248,22, -133,13,23,201,1,28,248,22,149,6,23,203,2,249,22,161,7,23,204,1,8, -63,23,202,1,28,248,22,128,13,23,199,2,248,22,129,13,23,199,1,87,94, -23,198,1,247,22,130,13,28,248,22,191,12,194,249,22,145,13,195,194,192,91, -159,37,11,90,161,37,35,11,87,95,28,28,248,22,128,13,23,196,2,10,27, -248,22,191,12,23,197,2,28,23,193,2,192,87,94,23,193,1,28,248,22,149, -6,23,197,2,27,248,22,149,13,23,198,2,28,23,193,2,192,87,94,23,193, -1,248,22,150,13,23,198,2,11,12,252,22,184,8,2,11,2,25,35,23,200, -2,23,201,2,28,28,248,22,149,6,23,197,2,10,248,22,137,7,23,197,2, -12,252,22,184,8,2,11,2,26,36,23,200,2,23,201,2,91,159,38,11,90, -161,38,35,11,248,22,148,13,23,199,2,87,94,23,195,1,87,94,28,23,193, -2,12,250,22,185,8,2,11,2,27,23,201,2,249,22,7,23,195,1,23,196, -1,27,249,22,137,13,249,22,147,7,250,22,185,13,0,9,35,114,120,35,34, -91,46,93,34,248,22,133,13,23,203,1,6,1,1,95,28,248,22,149,6,23, -202,2,249,22,161,7,23,203,1,8,63,23,201,1,28,248,22,128,13,23,199, -2,248,22,129,13,23,199,1,87,94,23,198,1,247,22,130,13,28,248,22,191, -12,194,249,22,145,13,195,194,192,249,247,22,180,4,194,11,249,80,158,37,46, -9,9,249,80,158,37,46,195,9,27,247,22,170,13,249,80,158,38,47,28,23, -195,2,27,248,22,166,7,6,11,11,80,76,84,67,79,76,76,69,67,84,83, -28,192,192,6,0,0,6,0,0,27,28,23,196,1,250,22,145,13,248,22,166, -13,69,97,100,100,111,110,45,100,105,114,247,22,164,7,6,8,8,99,111,108, +139,13,23,201,1,28,248,22,155,6,23,203,2,249,22,167,7,23,204,1,8, +63,23,202,1,28,248,22,134,13,23,199,2,248,22,135,13,23,199,1,87,94, +23,198,1,247,22,136,13,28,248,22,133,13,194,249,22,151,13,195,194,192,91, +159,37,11,90,161,37,35,11,87,95,28,28,248,22,134,13,23,196,2,10,27, +248,22,133,13,23,197,2,28,23,193,2,192,87,94,23,193,1,28,248,22,155, +6,23,197,2,27,248,22,155,13,23,198,2,28,23,193,2,192,87,94,23,193, +1,248,22,156,13,23,198,2,11,12,252,22,190,8,2,11,2,25,35,23,200, +2,23,201,2,28,28,248,22,155,6,23,197,2,10,248,22,143,7,23,197,2, +12,252,22,190,8,2,11,2,26,36,23,200,2,23,201,2,91,159,38,11,90, +161,38,35,11,248,22,154,13,23,199,2,87,94,23,195,1,87,94,28,23,193, +2,12,250,22,191,8,2,11,2,27,23,201,2,249,22,7,23,195,1,23,196, +1,27,249,22,143,13,249,22,153,7,250,22,191,13,0,9,35,114,120,35,34, +91,46,93,34,248,22,139,13,23,203,1,6,1,1,95,28,248,22,155,6,23, +202,2,249,22,167,7,23,203,1,8,63,23,201,1,28,248,22,134,13,23,199, +2,248,22,135,13,23,199,1,87,94,23,198,1,247,22,136,13,28,248,22,133, +13,194,249,22,151,13,195,194,192,249,247,22,186,4,194,11,249,80,158,37,46, +9,9,249,80,158,37,46,195,9,27,247,22,176,13,249,80,158,38,47,28,23, +195,2,27,248,22,172,7,6,11,11,80,76,84,67,79,76,76,69,67,84,83, +28,192,192,6,0,0,6,0,0,27,28,23,196,1,250,22,151,13,248,22,172, +13,69,97,100,100,111,110,45,100,105,114,247,22,170,7,6,8,8,99,111,108, 108,101,99,116,115,11,27,248,80,159,41,52,36,250,22,77,23,203,1,248,22, -73,248,22,166,13,72,99,111,108,108,101,99,116,115,45,100,105,114,23,204,1, +73,248,22,172,13,72,99,111,108,108,101,99,116,115,45,100,105,114,23,204,1, 28,23,194,2,249,22,63,23,196,1,23,195,1,192,32,48,89,162,8,44,38, -54,2,19,222,33,49,27,249,22,177,13,23,197,2,23,198,2,28,23,193,2, +54,2,19,222,33,49,27,249,22,183,13,23,197,2,23,198,2,28,23,193,2, 87,94,23,196,1,27,248,22,88,23,195,2,27,27,248,22,97,23,197,1,27, -249,22,177,13,23,201,2,23,196,2,28,23,193,2,87,94,23,194,1,27,248, +249,22,183,13,23,201,2,23,196,2,28,23,193,2,87,94,23,194,1,27,248, 22,88,23,195,2,27,250,2,48,23,203,2,23,204,1,248,22,97,23,199,1, -28,249,22,143,7,23,196,2,2,28,249,22,77,23,202,2,194,249,22,63,248, -22,136,13,23,197,1,23,195,1,87,95,23,199,1,23,193,1,28,249,22,143, -7,23,196,2,2,28,249,22,77,23,200,2,9,249,22,63,248,22,136,13,23, -197,1,9,28,249,22,143,7,23,196,2,2,28,249,22,77,197,194,87,94,23, -196,1,249,22,63,248,22,136,13,23,197,1,194,87,94,23,193,1,28,249,22, -143,7,23,198,2,2,28,249,22,77,195,9,87,94,23,194,1,249,22,63,248, -22,136,13,23,199,1,9,87,95,28,28,248,22,137,7,194,10,248,22,149,6, -194,12,250,22,184,8,2,14,6,21,21,98,121,116,101,32,115,116,114,105,110, +28,249,22,149,7,23,196,2,2,28,249,22,77,23,202,2,194,249,22,63,248, +22,142,13,23,197,1,23,195,1,87,95,23,199,1,23,193,1,28,249,22,149, +7,23,196,2,2,28,249,22,77,23,200,2,9,249,22,63,248,22,142,13,23, +197,1,9,28,249,22,149,7,23,196,2,2,28,249,22,77,197,194,87,94,23, +196,1,249,22,63,248,22,142,13,23,197,1,194,87,94,23,193,1,28,249,22, +149,7,23,198,2,2,28,249,22,77,195,9,87,94,23,194,1,249,22,63,248, +22,142,13,23,199,1,9,87,95,28,28,248,22,143,7,194,10,248,22,155,6, +194,12,250,22,190,8,2,14,6,21,21,98,121,116,101,32,115,116,114,105,110, 103,32,111,114,32,115,116,114,105,110,103,196,28,28,248,22,72,195,249,22,4, -22,191,12,196,11,12,250,22,184,8,2,14,6,13,13,108,105,115,116,32,111, -102,32,112,97,116,104,115,197,250,2,48,197,195,28,248,22,149,6,197,248,22, -160,7,197,196,32,51,89,162,8,44,39,57,2,19,222,33,54,32,52,89,162, +22,133,13,196,11,12,250,22,190,8,2,14,6,13,13,108,105,115,116,32,111, +102,32,112,97,116,104,115,197,250,2,48,197,195,28,248,22,155,6,197,248,22, +166,7,197,196,32,51,89,162,8,44,39,57,2,19,222,33,54,32,52,89,162, 8,44,38,54,70,102,111,117,110,100,45,101,120,101,99,222,33,53,28,23,193, -2,91,159,38,11,90,161,38,35,11,248,22,148,13,23,199,2,87,95,23,195, -1,23,194,1,27,28,23,198,2,27,248,22,153,13,23,201,2,28,249,22,156, -8,23,195,2,23,202,2,11,28,248,22,149,13,23,194,2,250,2,52,23,201, -2,23,202,2,249,22,145,13,23,200,2,23,198,1,250,2,52,23,201,2,23, -202,2,23,196,1,11,28,23,193,2,192,87,94,23,193,1,27,28,248,22,191, -12,23,196,2,27,249,22,145,13,23,198,2,23,201,2,28,28,248,22,140,13, -193,10,248,22,139,13,193,192,11,11,28,23,193,2,192,87,94,23,193,1,28, -23,199,2,11,27,248,22,153,13,23,202,2,28,249,22,156,8,23,195,2,23, -203,1,11,28,248,22,149,13,23,194,2,250,2,52,23,202,1,23,203,1,249, -22,145,13,23,201,1,23,198,1,250,2,52,201,202,195,194,28,248,22,71,23, -197,2,11,27,248,22,152,13,248,22,64,23,199,2,27,249,22,145,13,23,196, -1,23,197,2,28,248,22,139,13,23,194,2,250,2,52,198,199,195,87,94,23, -193,1,27,248,22,65,23,200,1,28,248,22,71,23,194,2,11,27,248,22,152, -13,248,22,64,23,196,2,27,249,22,145,13,23,196,1,23,200,2,28,248,22, -139,13,23,194,2,250,2,52,201,202,195,87,94,23,193,1,27,248,22,65,23, -197,1,28,248,22,71,23,194,2,11,27,248,22,152,13,248,22,64,195,27,249, -22,145,13,23,196,1,202,28,248,22,139,13,193,250,2,52,204,205,195,251,2, -51,204,205,206,248,22,65,199,87,95,28,27,248,22,191,12,23,196,2,28,23, -193,2,192,87,94,23,193,1,28,248,22,149,6,23,196,2,27,248,22,149,13, -23,197,2,28,23,193,2,192,87,94,23,193,1,248,22,150,13,23,197,2,11, -12,250,22,184,8,2,15,6,25,25,112,97,116,104,32,111,114,32,115,116,114, +2,91,159,38,11,90,161,38,35,11,248,22,154,13,23,199,2,87,95,23,195, +1,23,194,1,27,28,23,198,2,27,248,22,159,13,23,201,2,28,249,22,162, +8,23,195,2,23,202,2,11,28,248,22,155,13,23,194,2,250,2,52,23,201, +2,23,202,2,249,22,151,13,23,200,2,23,198,1,250,2,52,23,201,2,23, +202,2,23,196,1,11,28,23,193,2,192,87,94,23,193,1,27,28,248,22,133, +13,23,196,2,27,249,22,151,13,23,198,2,23,201,2,28,28,248,22,146,13, +193,10,248,22,145,13,193,192,11,11,28,23,193,2,192,87,94,23,193,1,28, +23,199,2,11,27,248,22,159,13,23,202,2,28,249,22,162,8,23,195,2,23, +203,1,11,28,248,22,155,13,23,194,2,250,2,52,23,202,1,23,203,1,249, +22,151,13,23,201,1,23,198,1,250,2,52,201,202,195,194,28,248,22,71,23, +197,2,11,27,248,22,158,13,248,22,64,23,199,2,27,249,22,151,13,23,196, +1,23,197,2,28,248,22,145,13,23,194,2,250,2,52,198,199,195,87,94,23, +193,1,27,248,22,65,23,200,1,28,248,22,71,23,194,2,11,27,248,22,158, +13,248,22,64,23,196,2,27,249,22,151,13,23,196,1,23,200,2,28,248,22, +145,13,23,194,2,250,2,52,201,202,195,87,94,23,193,1,27,248,22,65,23, +197,1,28,248,22,71,23,194,2,11,27,248,22,158,13,248,22,64,195,27,249, +22,151,13,23,196,1,202,28,248,22,145,13,193,250,2,52,204,205,195,251,2, +51,204,205,206,248,22,65,199,87,95,28,27,248,22,133,13,23,196,2,28,23, +193,2,192,87,94,23,193,1,28,248,22,155,6,23,196,2,27,248,22,155,13, +23,197,2,28,23,193,2,192,87,94,23,193,1,248,22,156,13,23,197,2,11, +12,250,22,190,8,2,15,6,25,25,112,97,116,104,32,111,114,32,115,116,114, 105,110,103,32,40,115,97,110,115,32,110,117,108,41,23,197,2,28,28,23,195, -2,28,27,248,22,191,12,23,197,2,28,23,193,2,192,87,94,23,193,1,28, -248,22,149,6,23,197,2,27,248,22,149,13,23,198,2,28,23,193,2,192,87, -94,23,193,1,248,22,150,13,23,198,2,11,248,22,149,13,23,196,2,11,10, -12,250,22,184,8,2,15,6,29,29,35,102,32,111,114,32,114,101,108,97,116, +2,28,27,248,22,133,13,23,197,2,28,23,193,2,192,87,94,23,193,1,28, +248,22,155,6,23,197,2,27,248,22,155,13,23,198,2,28,23,193,2,192,87, +94,23,193,1,248,22,156,13,23,198,2,11,248,22,155,13,23,196,2,11,10, +12,250,22,190,8,2,15,6,29,29,35,102,32,111,114,32,114,101,108,97,116, 105,118,101,32,112,97,116,104,32,111,114,32,115,116,114,105,110,103,23,198,2, -28,28,248,22,149,13,23,195,2,91,159,38,11,90,161,38,35,11,248,22,148, -13,23,198,2,249,22,154,8,194,68,114,101,108,97,116,105,118,101,11,27,248, -22,166,7,6,4,4,80,65,84,72,251,2,51,23,199,1,23,200,1,23,201, -1,28,23,197,2,27,249,80,158,43,47,23,200,1,9,28,249,22,154,8,247, -22,168,7,2,21,249,22,63,248,22,136,13,5,1,46,23,195,1,192,9,27, -248,22,152,13,23,196,1,28,248,22,139,13,193,250,2,52,198,199,195,11,250, -80,158,38,48,196,197,11,250,80,158,38,48,196,11,11,87,94,249,22,140,6, -247,22,176,4,195,248,22,166,5,249,22,163,3,35,249,22,147,3,197,198,27, +28,28,248,22,155,13,23,195,2,91,159,38,11,90,161,38,35,11,248,22,154, +13,23,198,2,249,22,160,8,194,68,114,101,108,97,116,105,118,101,11,27,248, +22,172,7,6,4,4,80,65,84,72,251,2,51,23,199,1,23,200,1,23,201, +1,28,23,197,2,27,249,80,158,43,47,23,200,1,9,28,249,22,160,8,247, +22,174,7,2,21,249,22,63,248,22,142,13,5,1,46,23,195,1,192,9,27, +248,22,158,13,23,196,1,28,248,22,145,13,193,250,2,52,198,199,195,11,250, +80,158,38,48,196,197,11,250,80,158,38,48,196,11,11,87,94,249,22,146,6, +247,22,182,4,195,248,22,172,5,249,22,169,3,35,249,22,153,3,197,198,27, 28,23,197,2,87,95,23,196,1,23,195,1,23,197,1,87,94,23,197,1,27, -248,22,166,13,2,20,27,249,80,158,40,48,23,196,1,11,27,27,248,22,166, -3,23,200,1,28,192,192,35,27,27,248,22,166,3,23,202,1,28,192,192,35, -249,22,143,5,23,197,1,83,158,39,20,97,95,89,162,8,44,35,47,9,224, -3,2,33,58,23,195,1,23,196,1,27,248,22,128,5,23,195,1,248,80,159, +248,22,172,13,2,20,27,249,80,158,40,48,23,196,1,11,27,27,248,22,172, +3,23,200,1,28,192,192,35,27,27,248,22,172,3,23,202,1,28,192,192,35, +249,22,149,5,23,197,1,83,158,39,20,97,95,89,162,8,44,35,47,9,224, +3,2,33,58,23,195,1,23,196,1,27,248,22,134,5,23,195,1,248,80,159, 38,53,36,193,159,35,20,103,159,35,16,1,65,98,101,103,105,110,16,0,83, 158,41,20,100,138,67,35,37,117,116,105,108,115,2,1,11,11,10,10,42,80, 158,35,35,20,103,159,37,16,17,30,2,1,2,2,193,30,2,1,2,3,193, @@ -319,7 +319,7 @@ 0,16,0,16,0,35,35,16,0,16,17,83,158,35,16,2,89,162,43,36,48, 2,19,223,0,33,29,80,159,35,53,36,83,158,35,16,2,89,162,8,44,36, 55,2,19,223,0,33,30,80,159,35,52,36,83,158,35,16,2,32,0,89,162, -43,36,44,2,2,222,33,31,80,159,35,35,36,83,158,35,16,2,249,22,151, +43,36,44,2,2,222,33,31,80,159,35,35,36,83,158,35,16,2,249,22,157, 6,7,92,7,92,80,159,35,36,36,83,158,35,16,2,89,162,43,36,53,2, 4,223,0,33,32,80,159,35,37,36,83,158,35,16,2,32,0,89,162,8,44, 37,49,2,5,222,33,33,80,159,35,38,36,83,158,35,16,2,32,0,89,162, @@ -332,8 +332,8 @@ 35,16,2,32,0,89,162,43,36,43,2,12,222,33,44,80,159,35,45,36,83, 158,35,16,2,83,158,38,20,96,96,2,13,89,162,43,35,43,9,223,0,33, 45,89,162,43,36,44,9,223,0,33,46,89,162,43,37,54,9,223,0,33,47, -80,159,35,46,36,83,158,35,16,2,27,248,22,173,13,248,22,160,7,27,28, -249,22,154,8,247,22,168,7,2,21,6,1,1,59,6,1,1,58,250,22,133, +80,159,35,46,36,83,158,35,16,2,27,248,22,179,13,248,22,166,7,27,28, +249,22,160,8,247,22,174,7,2,21,6,1,1,59,6,1,1,58,250,22,139, 7,6,14,14,40,91,94,126,97,93,42,41,126,97,40,46,42,41,23,196,2, 23,196,1,89,162,8,44,37,47,2,14,223,0,33,50,80,159,35,47,36,83, 158,35,16,2,83,158,38,20,96,96,2,15,89,162,8,44,38,53,9,223,0, @@ -344,12 +344,12 @@ EVAL_ONE_SIZED_STR((char *)expr, 5080); } { - static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,52,46,49,46,49,46,49,8,0,0,0,1,0,0,6,0,19,0, + static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,52,46,49,46,49,46,50,8,0,0,0,1,0,0,6,0,19,0, 34,0,48,0,62,0,76,0,111,0,0,0,255,0,0,0,65,113,117,111,116, 101,29,94,2,1,67,35,37,117,116,105,108,115,11,29,94,2,1,69,35,37, 110,101,116,119,111,114,107,11,29,94,2,1,68,35,37,112,97,114,97,109,122, 11,29,94,2,1,68,35,37,101,120,112,111,98,115,11,29,94,2,1,68,35, -37,107,101,114,110,101,108,11,98,10,35,11,8,176,229,97,159,2,2,35,35, +37,107,101,114,110,101,108,11,98,10,35,11,8,188,229,97,159,2,2,35,35, 159,2,3,35,35,159,2,4,35,35,159,2,5,35,35,159,2,6,35,35,16, 0,159,35,20,103,159,35,16,1,65,98,101,103,105,110,16,0,83,158,41,20, 100,138,69,35,37,98,117,105,108,116,105,110,29,11,11,11,10,10,18,96,11, @@ -361,7 +361,7 @@ EVAL_ONE_SIZED_STR((char *)expr, 292); } { - static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,52,46,49,46,49,46,49,52,0,0,0,1,0,0,3,0,14,0, + static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,52,46,49,46,49,46,50,52,0,0,0,1,0,0,3,0,14,0, 41,0,47,0,60,0,74,0,96,0,122,0,134,0,152,0,172,0,184,0,200, 0,223,0,3,1,8,1,13,1,18,1,23,1,54,1,58,1,66,1,74,1, 82,1,185,1,230,1,250,1,29,2,64,2,98,2,108,2,155,2,165,2,172, @@ -383,48 +383,48 @@ 64,108,111,111,112,1,29,115,116,97,110,100,97,114,100,45,109,111,100,117,108, 101,45,110,97,109,101,45,114,101,115,111,108,118,101,114,63,108,105,98,67,105, 103,110,111,114,101,100,249,22,14,195,80,158,37,45,249,80,159,37,48,36,195, -10,27,28,23,195,2,28,249,22,154,8,23,197,2,80,158,38,46,87,94,23, -195,1,80,158,36,47,27,248,22,163,4,23,197,2,28,248,22,191,12,23,194, -2,91,159,38,11,90,161,38,35,11,248,22,148,13,23,197,1,87,95,83,160, +10,27,28,23,195,2,28,249,22,160,8,23,197,2,80,158,38,46,87,94,23, +195,1,80,158,36,47,27,248,22,169,4,23,197,2,28,248,22,133,13,23,194, +2,91,159,38,11,90,161,38,35,11,248,22,154,13,23,197,1,87,95,83,160, 37,11,80,158,40,46,198,83,160,37,11,80,158,40,47,192,192,11,11,28,23, -193,2,192,87,94,23,193,1,27,247,22,181,4,28,192,192,247,22,167,13,20, -14,159,80,158,35,39,250,80,158,38,40,249,22,27,11,80,158,40,39,22,181, -4,28,248,22,191,12,23,198,2,23,197,1,87,94,23,197,1,247,22,167,13, -247,194,250,22,145,13,23,197,1,23,199,1,249,80,158,42,38,23,198,1,2, -18,252,22,145,13,23,199,1,23,201,1,6,6,6,110,97,116,105,118,101,247, -22,169,7,249,80,158,44,38,23,200,1,80,158,44,35,87,94,23,194,1,27, -23,194,1,27,250,22,162,13,196,11,32,0,89,162,8,44,35,40,9,222,11, -28,192,249,22,63,195,194,11,27,248,23,195,1,23,196,1,27,250,22,162,13, +193,2,192,87,94,23,193,1,27,247,22,187,4,28,192,192,247,22,173,13,20, +14,159,80,158,35,39,250,80,158,38,40,249,22,27,11,80,158,40,39,22,187, +4,28,248,22,133,13,23,198,2,23,197,1,87,94,23,197,1,247,22,173,13, +247,194,250,22,151,13,23,197,1,23,199,1,249,80,158,42,38,23,198,1,2, +18,252,22,151,13,23,199,1,23,201,1,6,6,6,110,97,116,105,118,101,247, +22,175,7,249,80,158,44,38,23,200,1,80,158,44,35,87,94,23,194,1,27, +23,194,1,27,250,22,168,13,196,11,32,0,89,162,8,44,35,40,9,222,11, +28,192,249,22,63,195,194,11,27,248,23,195,1,23,196,1,27,250,22,168,13, 196,11,32,0,89,162,8,44,35,40,9,222,11,28,192,249,22,63,195,194,11, -249,247,22,172,13,248,22,64,195,195,27,250,22,145,13,23,198,1,23,200,1, -249,80,158,43,38,23,199,1,2,18,27,250,22,162,13,196,11,32,0,89,162, -8,44,35,40,9,222,11,28,192,249,22,63,195,194,11,249,247,22,179,4,248, -22,64,195,195,249,247,22,179,4,194,195,87,94,28,248,80,158,36,37,23,195, -2,12,250,22,184,8,77,108,111,97,100,47,117,115,101,45,99,111,109,112,105, +249,247,22,178,13,248,22,64,195,195,27,250,22,151,13,23,198,1,23,200,1, +249,80,158,43,38,23,199,1,2,18,27,250,22,168,13,196,11,32,0,89,162, +8,44,35,40,9,222,11,28,192,249,22,63,195,194,11,249,247,22,185,4,248, +22,64,195,195,249,247,22,185,4,194,195,87,94,28,248,80,158,36,37,23,195, +2,12,250,22,190,8,77,108,111,97,100,47,117,115,101,45,99,111,109,112,105, 108,101,100,6,25,25,112,97,116,104,32,111,114,32,118,97,108,105,100,45,112, 97,116,104,32,115,116,114,105,110,103,23,197,2,91,159,41,11,90,161,36,35, -11,28,248,22,151,13,23,201,2,23,200,1,27,247,22,181,4,28,23,193,2, -249,22,152,13,23,203,1,23,195,1,200,90,161,38,36,11,248,22,148,13,23, -194,2,87,94,23,196,1,90,161,36,39,11,28,249,22,154,8,23,196,2,68, +11,28,248,22,157,13,23,201,2,23,200,1,27,247,22,187,4,28,23,193,2, +249,22,158,13,23,203,1,23,195,1,200,90,161,38,36,11,248,22,154,13,23, +194,2,87,94,23,196,1,90,161,36,39,11,28,249,22,160,8,23,196,2,68, 114,101,108,97,116,105,118,101,87,94,23,194,1,2,17,23,194,1,90,161,36, -40,11,247,22,169,13,27,89,162,43,36,49,62,122,111,225,7,5,3,33,27, +40,11,247,22,175,13,27,89,162,43,36,49,62,122,111,225,7,5,3,33,27, 27,89,162,43,36,51,9,225,8,6,4,33,28,27,249,22,5,89,162,8,44, 36,47,9,223,5,33,29,23,203,2,27,28,23,195,2,27,249,22,5,83,158, 39,20,97,94,89,162,8,44,36,47,9,223,5,33,30,23,198,1,23,205,2, -27,28,23,196,2,11,193,28,192,192,28,193,28,23,196,2,28,249,22,159,3, +27,28,23,196,2,11,193,28,192,192,28,193,28,23,196,2,28,249,22,165,3, 248,22,65,196,248,22,65,23,199,2,193,11,11,11,87,94,23,195,1,11,28, 23,193,2,249,80,159,47,54,36,202,89,162,43,35,45,9,224,14,2,33,31, 87,94,23,193,1,27,28,23,197,1,27,249,22,5,83,158,39,20,97,94,89, 162,8,44,36,50,9,225,14,12,10,33,32,23,203,1,23,206,1,27,28,196, -11,193,28,192,192,28,193,28,196,28,249,22,159,3,248,22,65,196,248,22,65, +11,193,28,192,192,28,193,28,196,28,249,22,165,3,248,22,65,196,248,22,65, 199,193,11,11,11,11,28,192,249,80,159,48,54,36,203,89,162,43,35,45,9, 224,15,2,33,33,249,80,159,48,54,36,203,89,162,43,35,44,9,224,15,7, 33,34,32,36,89,162,8,44,36,54,2,19,222,33,38,0,17,35,114,120,34, -94,40,46,42,63,41,47,40,46,42,41,36,34,27,249,22,177,13,2,37,23, +94,40,46,42,63,41,47,40,46,42,41,36,34,27,249,22,183,13,2,37,23, 196,2,28,23,193,2,87,94,23,194,1,249,22,63,248,22,88,23,196,2,27, -248,22,97,23,197,1,27,249,22,177,13,2,37,23,196,2,28,23,193,2,87, +248,22,97,23,197,1,27,249,22,183,13,2,37,23,196,2,28,23,193,2,87, 94,23,194,1,249,22,63,248,22,88,23,196,2,27,248,22,97,23,197,1,27, -249,22,177,13,2,37,23,196,2,28,23,193,2,87,94,23,194,1,249,22,63, +249,22,183,13,2,37,23,196,2,28,23,193,2,87,94,23,194,1,249,22,63, 248,22,88,23,196,2,248,2,36,248,22,97,23,197,1,248,22,73,194,248,22, 73,194,248,22,73,194,32,39,89,162,43,36,54,2,19,222,33,40,28,248,22, 71,248,22,65,23,195,2,249,22,7,9,248,22,64,195,91,159,37,11,90,161, @@ -435,96 +435,96 @@ 249,22,7,249,22,63,248,22,64,23,200,1,23,197,1,23,196,1,249,22,7, 249,22,63,248,22,64,23,200,1,23,197,1,23,196,1,249,22,7,249,22,63, 248,22,64,23,200,1,23,197,1,195,27,248,2,36,23,195,1,28,194,192,248, -2,39,193,87,95,28,248,22,161,4,195,12,250,22,184,8,2,20,6,20,20, +2,39,193,87,95,28,248,22,167,4,195,12,250,22,190,8,2,20,6,20,20, 114,101,115,111,108,118,101,100,45,109,111,100,117,108,101,45,112,97,116,104,197, -28,24,193,2,248,24,194,1,195,87,94,23,193,1,12,27,27,250,22,133,2, -80,158,41,42,248,22,133,14,247,22,174,11,11,28,23,193,2,192,87,94,23, -193,1,27,247,22,121,87,94,250,22,131,2,80,158,42,42,248,22,133,14,247, -22,174,11,195,192,250,22,131,2,195,198,66,97,116,116,97,99,104,251,211,197, -198,199,10,28,192,250,22,183,8,11,196,195,248,22,181,8,194,28,249,22,155, -6,194,6,1,1,46,2,17,28,249,22,155,6,194,6,2,2,46,46,62,117, -112,192,28,249,22,156,8,248,22,65,23,200,2,23,197,1,28,249,22,154,8, -248,22,64,23,200,2,23,196,1,251,22,181,8,2,20,6,26,26,99,121,99, +28,24,193,2,248,24,194,1,195,87,94,23,193,1,12,27,27,250,22,137,2, +80,158,41,42,248,22,139,14,247,22,180,11,11,28,23,193,2,192,87,94,23, +193,1,27,247,22,121,87,94,250,22,135,2,80,158,42,42,248,22,139,14,247, +22,180,11,195,192,250,22,135,2,195,198,66,97,116,116,97,99,104,251,211,197, +198,199,10,28,192,250,22,189,8,11,196,195,248,22,187,8,194,28,249,22,161, +6,194,6,1,1,46,2,17,28,249,22,161,6,194,6,2,2,46,46,62,117, +112,192,28,249,22,162,8,248,22,65,23,200,2,23,197,1,28,249,22,160,8, +248,22,64,23,200,2,23,196,1,251,22,187,8,2,20,6,26,26,99,121,99, 108,101,32,105,110,32,108,111,97,100,105,110,103,32,97,116,32,126,101,58,32, 126,101,23,200,1,249,22,2,22,65,248,22,78,249,22,63,23,206,1,23,202, -1,12,12,247,192,20,14,159,80,158,39,44,249,22,63,247,22,174,11,23,197, +1,12,12,247,192,20,14,159,80,158,39,44,249,22,63,247,22,180,11,23,197, 1,20,14,159,80,158,39,39,250,80,158,42,40,249,22,27,11,80,158,44,39, -22,143,4,23,196,1,249,247,22,180,4,23,198,1,248,22,52,248,22,131,13, -23,198,1,87,94,28,28,248,22,191,12,23,197,2,10,248,22,167,4,23,197, -2,12,28,23,198,2,250,22,183,8,11,6,15,15,98,97,100,32,109,111,100, -117,108,101,32,112,97,116,104,23,201,2,250,22,184,8,2,20,6,19,19,109, +22,149,4,23,196,1,249,247,22,186,4,23,198,1,248,22,52,248,22,137,13, +23,198,1,87,94,28,28,248,22,133,13,23,197,2,10,248,22,173,4,23,197, +2,12,28,23,198,2,250,22,189,8,11,6,15,15,98,97,100,32,109,111,100, +117,108,101,32,112,97,116,104,23,201,2,250,22,190,8,2,20,6,19,19,109, 111,100,117,108,101,45,112,97,116,104,32,111,114,32,112,97,116,104,23,199,2, -28,28,248,22,61,23,197,2,249,22,154,8,248,22,64,23,199,2,2,4,11, -248,22,162,4,248,22,88,197,28,28,248,22,61,23,197,2,249,22,154,8,248, +28,28,248,22,61,23,197,2,249,22,160,8,248,22,64,23,199,2,2,4,11, +248,22,168,4,248,22,88,197,28,28,248,22,61,23,197,2,249,22,160,8,248, 22,64,23,199,2,66,112,108,97,110,101,116,11,87,94,28,207,12,20,14,159, -80,158,37,39,250,80,158,40,40,249,22,27,11,80,158,42,39,22,174,11,23, -197,1,90,161,36,35,10,249,22,144,4,21,94,2,21,6,18,18,112,108,97, +80,158,37,39,250,80,158,40,40,249,22,27,11,80,158,42,39,22,180,11,23, +197,1,90,161,36,35,10,249,22,150,4,21,94,2,21,6,18,18,112,108,97, 110,101,116,47,114,101,115,111,108,118,101,114,46,115,115,1,27,112,108,97,110, 101,116,45,109,111,100,117,108,101,45,110,97,109,101,45,114,101,115,111,108,118, 101,114,12,251,211,199,200,201,202,87,94,23,193,1,27,89,162,8,44,36,45, 79,115,104,111,119,45,99,111,108,108,101,99,116,105,111,110,45,101,114,114,223, -6,33,44,27,28,248,22,51,23,199,2,27,250,22,133,2,80,158,43,43,249, -22,63,23,204,2,247,22,168,13,11,28,23,193,2,192,87,94,23,193,1,91, +6,33,44,27,28,248,22,51,23,199,2,27,250,22,137,2,80,158,43,43,249, +22,63,23,204,2,247,22,174,13,11,28,23,193,2,192,87,94,23,193,1,91, 159,37,11,90,161,37,35,11,249,80,159,44,48,36,248,22,54,23,204,2,11, 27,251,80,158,47,50,2,20,23,202,1,28,248,22,71,23,199,2,23,199,2, 248,22,64,23,199,2,28,248,22,71,23,199,2,9,248,22,65,23,199,2,249, -22,145,13,23,195,1,28,248,22,71,23,197,1,87,94,23,197,1,6,7,7, -109,97,105,110,46,115,115,249,22,172,6,23,199,1,6,3,3,46,115,115,28, -248,22,149,6,23,199,2,87,94,23,194,1,27,248,80,159,41,55,36,23,201, -2,27,250,22,133,2,80,158,44,43,249,22,63,23,205,2,23,199,2,11,28, +22,151,13,23,195,1,28,248,22,71,23,197,1,87,94,23,197,1,6,7,7, +109,97,105,110,46,115,115,249,22,178,6,23,199,1,6,3,3,46,115,115,28, +248,22,155,6,23,199,2,87,94,23,194,1,27,248,80,159,41,55,36,23,201, +2,27,250,22,137,2,80,158,44,43,249,22,63,23,205,2,23,199,2,11,28, 23,193,2,192,87,94,23,193,1,91,159,37,11,90,161,37,35,11,249,80,159, -45,48,36,23,204,2,11,250,22,1,22,145,13,23,199,1,249,22,77,249,22, +45,48,36,23,204,2,11,250,22,1,22,151,13,23,199,1,249,22,77,249,22, 2,32,0,89,162,8,44,36,43,9,222,33,45,23,200,1,248,22,73,23,200, -1,28,248,22,191,12,23,199,2,87,94,23,194,1,28,248,22,150,13,23,199, +1,28,248,22,133,13,23,199,2,87,94,23,194,1,28,248,22,156,13,23,199, 2,23,198,2,248,22,73,6,26,26,32,40,97,32,112,97,116,104,32,109,117, -115,116,32,98,101,32,97,98,115,111,108,117,116,101,41,28,249,22,154,8,248, -22,64,23,201,2,2,21,27,250,22,133,2,80,158,43,43,249,22,63,23,204, -2,247,22,168,13,11,28,23,193,2,192,87,94,23,193,1,91,159,38,11,90, +115,116,32,98,101,32,97,98,115,111,108,117,116,101,41,28,249,22,160,8,248, +22,64,23,201,2,2,21,27,250,22,137,2,80,158,43,43,249,22,63,23,204, +2,247,22,174,13,11,28,23,193,2,192,87,94,23,193,1,91,159,38,11,90, 161,37,35,11,249,80,159,45,48,36,248,22,88,23,205,2,11,90,161,36,37, -11,28,248,22,71,248,22,90,23,204,2,28,248,22,71,23,194,2,249,22,179, +11,28,248,22,71,248,22,90,23,204,2,28,248,22,71,23,194,2,249,22,185, 13,0,8,35,114,120,34,91,46,93,34,23,196,2,11,10,27,27,28,23,197, 2,249,22,77,28,248,22,71,248,22,90,23,208,2,21,93,6,5,5,109,122, 108,105,98,249,22,1,22,77,249,22,2,80,159,51,56,36,248,22,90,23,211, 2,23,197,2,28,248,22,71,23,196,2,248,22,73,23,197,2,23,195,2,251, 80,158,49,50,2,20,23,204,1,248,22,64,23,198,2,248,22,65,23,198,1, -249,22,145,13,23,195,1,28,23,198,1,87,94,23,196,1,23,197,1,28,248, +249,22,151,13,23,195,1,28,23,198,1,87,94,23,196,1,23,197,1,28,248, 22,71,23,197,1,87,94,23,197,1,6,7,7,109,97,105,110,46,115,115,28, -249,22,179,13,0,8,35,114,120,34,91,46,93,34,23,199,2,23,197,1,249, -22,172,6,23,199,1,6,3,3,46,115,115,28,249,22,154,8,248,22,64,23, -201,2,64,102,105,108,101,249,22,152,13,248,22,156,13,248,22,88,23,202,2, -248,80,159,42,55,36,23,202,2,12,87,94,28,28,248,22,191,12,23,194,2, -10,248,22,171,7,23,194,2,87,94,23,200,1,12,28,23,200,2,250,22,183, -8,67,114,101,113,117,105,114,101,249,22,133,7,6,17,17,98,97,100,32,109, +249,22,185,13,0,8,35,114,120,34,91,46,93,34,23,199,2,23,197,1,249, +22,178,6,23,199,1,6,3,3,46,115,115,28,249,22,160,8,248,22,64,23, +201,2,64,102,105,108,101,249,22,158,13,248,22,162,13,248,22,88,23,202,2, +248,80,159,42,55,36,23,202,2,12,87,94,28,28,248,22,133,13,23,194,2, +10,248,22,177,7,23,194,2,87,94,23,200,1,12,28,23,200,2,250,22,189, +8,67,114,101,113,117,105,114,101,249,22,139,7,6,17,17,98,97,100,32,109, 111,100,117,108,101,32,112,97,116,104,126,97,28,23,198,2,248,22,64,23,199, -2,6,0,0,23,203,1,87,94,23,200,1,250,22,184,8,2,20,249,22,133, +2,6,0,0,23,203,1,87,94,23,200,1,250,22,190,8,2,20,249,22,139, 7,6,13,13,109,111,100,117,108,101,32,112,97,116,104,126,97,28,23,198,2, -248,22,64,23,199,2,6,0,0,23,201,2,27,28,248,22,171,7,23,195,2, -249,22,176,7,23,196,2,35,249,22,154,13,248,22,155,13,23,197,2,11,27, -28,248,22,171,7,23,196,2,249,22,176,7,23,197,2,36,248,80,158,42,51, -23,195,2,91,159,38,11,90,161,38,35,11,28,248,22,171,7,23,199,2,250, -22,7,2,22,249,22,176,7,23,203,2,37,2,22,248,22,148,13,23,198,2, -87,95,23,195,1,23,193,1,27,28,248,22,171,7,23,200,2,249,22,176,7, -23,201,2,38,249,80,158,47,52,23,197,2,5,0,27,28,248,22,171,7,23, -201,2,249,22,176,7,23,202,2,39,248,22,162,4,23,200,2,27,27,250,22, -133,2,80,158,51,42,248,22,133,14,247,22,174,11,11,28,23,193,2,192,87, -94,23,193,1,27,247,22,121,87,94,250,22,131,2,80,158,52,42,248,22,133, -14,247,22,174,11,195,192,87,95,28,23,209,1,27,250,22,133,2,23,197,2, +248,22,64,23,199,2,6,0,0,23,201,2,27,28,248,22,177,7,23,195,2, +249,22,182,7,23,196,2,35,249,22,160,13,248,22,161,13,23,197,2,11,27, +28,248,22,177,7,23,196,2,249,22,182,7,23,197,2,36,248,80,158,42,51, +23,195,2,91,159,38,11,90,161,38,35,11,28,248,22,177,7,23,199,2,250, +22,7,2,22,249,22,182,7,23,203,2,37,2,22,248,22,154,13,23,198,2, +87,95,23,195,1,23,193,1,27,28,248,22,177,7,23,200,2,249,22,182,7, +23,201,2,38,249,80,158,47,52,23,197,2,5,0,27,28,248,22,177,7,23, +201,2,249,22,182,7,23,202,2,39,248,22,168,4,23,200,2,27,27,250,22, +137,2,80,158,51,42,248,22,139,14,247,22,180,11,11,28,23,193,2,192,87, +94,23,193,1,27,247,22,121,87,94,250,22,135,2,80,158,52,42,248,22,139, +14,247,22,180,11,195,192,87,95,28,23,209,1,27,250,22,137,2,23,197,2, 197,11,28,23,193,1,12,87,95,27,27,28,248,22,17,80,158,51,45,80,158, 50,45,247,22,19,250,22,25,248,22,23,23,197,2,80,158,53,44,23,196,1, -27,247,22,174,11,249,22,3,83,158,39,20,97,94,89,162,8,44,36,54,9, +27,247,22,180,11,249,22,3,83,158,39,20,97,94,89,162,8,44,36,54,9, 226,12,11,2,3,33,46,23,195,1,23,196,1,248,28,248,22,17,80,158,50, 45,32,0,89,162,43,36,41,9,222,33,47,80,159,49,57,36,89,162,43,35, -50,9,227,14,9,8,4,3,33,48,250,22,131,2,23,197,1,197,10,12,28, -28,248,22,171,7,23,202,1,11,27,248,22,149,6,23,208,2,28,192,192,28, -248,22,61,23,208,2,249,22,154,8,248,22,64,23,210,2,2,21,11,250,22, -131,2,80,158,50,43,28,248,22,149,6,23,210,2,249,22,63,23,211,1,248, +50,9,227,14,9,8,4,3,33,48,250,22,135,2,23,197,1,197,10,12,28, +28,248,22,177,7,23,202,1,11,27,248,22,155,6,23,208,2,28,192,192,28, +248,22,61,23,208,2,249,22,160,8,248,22,64,23,210,2,2,21,11,250,22, +135,2,80,158,50,43,28,248,22,155,6,23,210,2,249,22,63,23,211,1,248, 80,159,53,55,36,23,213,1,87,94,23,210,1,249,22,63,23,211,1,247,22, -168,13,252,22,173,7,23,208,1,23,207,1,23,205,1,23,203,1,201,12,193, +174,13,252,22,179,7,23,208,1,23,207,1,23,205,1,23,203,1,201,12,193, 91,159,37,10,90,161,36,35,10,11,90,161,36,36,10,83,158,38,20,96,96, 2,20,89,162,8,44,36,50,9,224,2,0,33,42,89,162,43,38,48,9,223, 1,33,43,89,162,43,39,8,30,9,225,2,3,0,33,49,208,87,95,248,22, -142,4,248,80,158,37,49,247,22,174,11,248,22,180,4,80,158,36,36,248,22, -165,12,80,159,36,41,36,159,35,20,103,159,35,16,1,65,98,101,103,105,110, +148,4,248,80,158,37,49,247,22,180,11,248,22,186,4,80,158,36,36,248,22, +171,12,80,159,36,41,36,159,35,20,103,159,35,16,1,65,98,101,103,105,110, 16,0,83,158,41,20,100,138,66,35,37,98,111,111,116,2,1,11,11,10,10, 36,80,158,35,35,20,103,159,39,16,19,30,2,1,2,2,193,30,2,1,2, 3,193,30,2,5,72,112,97,116,104,45,115,116,114,105,110,103,63,10,30,2, @@ -545,11 +545,11 @@ 44,9,223,0,33,24,80,159,35,56,36,83,158,35,16,2,89,162,43,36,48, 67,103,101,116,45,100,105,114,223,0,33,25,80,159,35,55,36,83,158,35,16, 2,89,162,43,37,48,68,119,105,116,104,45,100,105,114,223,0,33,26,80,159, -35,54,36,83,158,35,16,2,248,22,168,7,69,115,111,45,115,117,102,102,105, +35,54,36,83,158,35,16,2,248,22,174,7,69,115,111,45,115,117,102,102,105, 120,80,159,35,35,36,83,158,35,16,2,89,162,43,37,59,2,3,223,0,33, 35,80,159,35,36,36,83,158,35,16,2,32,0,89,162,8,44,36,41,2,7, -222,192,80,159,35,41,36,83,158,35,16,2,247,22,123,80,159,35,42,36,83, -158,35,16,2,247,22,122,80,159,35,43,36,83,158,35,16,2,247,22,59,80, +222,192,80,159,35,41,36,83,158,35,16,2,247,22,124,80,159,35,42,36,83, +158,35,16,2,247,22,123,80,159,35,43,36,83,158,35,16,2,247,22,59,80, 159,35,44,36,83,158,35,16,2,248,22,18,74,109,111,100,117,108,101,45,108, 111,97,100,105,110,103,80,159,35,45,36,83,158,35,16,2,11,80,158,35,46, 83,158,35,16,2,11,80,158,35,47,83,158,35,16,2,32,0,89,162,43,37, diff --git a/src/mzscheme/src/hash.c b/src/mzscheme/src/hash.c index 6bc883b48c..81438df3b7 100644 --- a/src/mzscheme/src/hash.c +++ b/src/mzscheme/src/hash.c @@ -1304,6 +1304,22 @@ long scheme_equal_hash_key2(Scheme_Object *o) return equal_hash_key2(o, &hi); } +long scheme_eqv_hash_key(Scheme_Object *o) +{ + if (!SCHEME_INTP(o) && SCHEME_NUMBERP(o)) + return scheme_equal_hash_key(o); + else + return (PTR_TO_LONG(o) >> 2); +} + +long scheme_eqv_hash_key2(Scheme_Object *o) +{ + if (!SCHEME_INTP(o) && SCHEME_NUMBERP(o)) + return scheme_equal_hash_key2(o); + else + return (PTR_TO_LONG(o) >> 3); +} + static Scheme_Object *hash2_recur(int argc, Scheme_Object **argv, Scheme_Object *prim) { long v; @@ -2116,7 +2132,7 @@ static RBNode *rb_remove(RBNode *s, unsigned long code) return remove_aux(s, code, &bh_dec); } -Scheme_Hash_Tree *scheme_make_hash_tree(int eql) +Scheme_Hash_Tree *scheme_make_hash_tree(int kind) { Scheme_Hash_Tree *tree; @@ -2125,8 +2141,7 @@ Scheme_Hash_Tree *scheme_make_hash_tree(int eql) tree->count = 0; tree->iso.so.type = scheme_hash_tree_type; - if (eql) - SCHEME_HASHTR_FLAGS(tree) |= 0x1; + SCHEME_HASHTR_FLAGS(tree) |= (kind & 0x3); return tree; } @@ -2138,8 +2153,12 @@ Scheme_Hash_Tree *scheme_hash_tree_set(Scheme_Hash_Tree *tree, Scheme_Object *ke RBNode *root, *added; int delta; - if (SCHEME_HASHTR_FLAGS(tree) & 0x1) { - h = (unsigned long)scheme_equal_hash_key(key); + if (SCHEME_HASHTR_FLAGS(tree) & 0x3) { + if (SCHEME_HASHTR_FLAGS(tree) & 0x1) { + h = (unsigned long)scheme_equal_hash_key(key); + } else { + h = (unsigned long)scheme_eqv_hash_key(key); + } } else { h = (unsigned long)PTR_TO_LONG((Scheme_Object *)key); } @@ -2150,10 +2169,12 @@ Scheme_Hash_Tree *scheme_hash_tree_set(Scheme_Hash_Tree *tree, Scheme_Object *ke if (!added) return tree; /* nothing to remove */ if (added->key) { - int eql = (SCHEME_HASHTR_FLAGS(tree) & 0x1); + int kind = (SCHEME_HASHTR_FLAGS(tree) & 0x3); - if ((eql && scheme_equal(added->key, key)) - || (!eql && SAME_OBJ(added->key, key))) { + if ((kind && ((kind == 1) + ? scheme_equal(added->key, key) + : scheme_eqv(added->key, key))) + || (!kind && SAME_OBJ(added->key, key))) { /* remove single item */ root = rb_remove(tree->root, h); @@ -2182,7 +2203,7 @@ Scheme_Hash_Tree *scheme_hash_tree_set(Scheme_Hash_Tree *tree, Scheme_Object *ke delta = 0; if (added->val) { - int eql = (SCHEME_HASHTR_FLAGS(tree) & 0x1); + int kind = (SCHEME_HASHTR_FLAGS(tree) & 0x3); if (!added->key) { /* Have a list of keys and vals. In this case, val can be NULL @@ -2191,9 +2212,14 @@ Scheme_Hash_Tree *scheme_hash_tree_set(Scheme_Hash_Tree *tree, Scheme_Object *ke int cnt = 0; while (prs) { a = SCHEME_CAR(prs); - if (eql) { - if (scheme_equal(SCHEME_CAR(a), key)) - break; + if (kind) { + if (kind == 1) { + if (scheme_equal(SCHEME_CAR(a), key)) + break; + } else { + if (scheme_eqv(SCHEME_CAR(a), key)) + break; + } } else { if (SAME_OBJ(SCHEME_CAR(a), key)) break; @@ -2231,8 +2257,11 @@ Scheme_Hash_Tree *scheme_hash_tree_set(Scheme_Hash_Tree *tree, Scheme_Object *ke } else { /* Currently have one value for this hash code */ int same; - if (eql) { - same = scheme_equal(key, added->key); + if (kind) { + if (kind == 1) + same = scheme_equal(key, added->key); + else + same = scheme_eqv(key, added->key); } else { same = SAME_OBJ(key, added->key); } @@ -2271,25 +2300,32 @@ Scheme_Object *scheme_hash_tree_get(Scheme_Hash_Tree *tree, Scheme_Object *key) { unsigned long h; RBNode *rb; + int kind = (SCHEME_HASHTR_FLAGS(tree) & 0x3); - if (SCHEME_HASHTR_FLAGS(tree) & 0x1) { - h = (unsigned long)scheme_equal_hash_key(key); + if (kind) { + if (kind == 1) + h = (unsigned long)scheme_equal_hash_key(key); + else + h = (unsigned long)scheme_eqv_hash_key(key); } else { h = (unsigned long)PTR_TO_LONG((Scheme_Object *)key); } rb = rb_find(h, tree->root); if (rb) { - int eql = (SCHEME_HASHTR_FLAGS(tree) & 0x1); - if (!rb->key) { /* Have list of keys & vals: */ Scheme_Object *prs = rb->val, *a; while (prs) { a = SCHEME_CAR(prs); - if (eql) { - if (scheme_equal(SCHEME_CAR(a), key)) - return SCHEME_CDR(a); + if (kind) { + if (kind == 1) { + if (scheme_equal(SCHEME_CAR(a), key)) + return SCHEME_CDR(a); + } else { + if (scheme_eqv(SCHEME_CAR(a), key)) + return SCHEME_CDR(a); + } } else { if (SAME_OBJ(SCHEME_CAR(a), key)) return SCHEME_CDR(a); @@ -2297,9 +2333,14 @@ Scheme_Object *scheme_hash_tree_get(Scheme_Hash_Tree *tree, Scheme_Object *key) prs = SCHEME_CDR(prs); } } else { - if (eql) { - if (scheme_equal(key, rb->key)) - return rb->val; + if (kind) { + if (kind == 1) { + if (scheme_equal(key, rb->key)) + return rb->val; + } else { + if (scheme_eqv(key, rb->key)) + return rb->val; + } } else if (SAME_OBJ(key, rb->key)) return rb->val; } @@ -2381,7 +2422,7 @@ int scheme_hash_tree_equal_rec(Scheme_Hash_Tree *t1, Scheme_Hash_Tree *t2, void int i; if ((t1->count != t2->count) - || ((SCHEME_HASHTR_FLAGS(t1) & 0x1) != (SCHEME_HASHTR_FLAGS(t2) & 0x1))) + || ((SCHEME_HASHTR_FLAGS(t1) & 0x3) != (SCHEME_HASHTR_FLAGS(t2) & 0x3))) return 0; for (i = t1->count; i--; ) { diff --git a/src/mzscheme/src/list.c b/src/mzscheme/src/list.c index 162cdf7532..9ef14a814c 100644 --- a/src/mzscheme/src/list.c +++ b/src/mzscheme/src/list.c @@ -83,14 +83,18 @@ static Scheme_Object *set_box (int argc, Scheme_Object *argv[]); static Scheme_Object *make_hash(int argc, Scheme_Object *argv[]); static Scheme_Object *make_hasheq(int argc, Scheme_Object *argv[]); +static Scheme_Object *make_hasheqv(int argc, Scheme_Object *argv[]); static Scheme_Object *make_weak_hash(int argc, Scheme_Object *argv[]); static Scheme_Object *make_weak_hasheq(int argc, Scheme_Object *argv[]); +static Scheme_Object *make_weak_hasheqv(int argc, Scheme_Object *argv[]); static Scheme_Object *make_immutable_hash(int argc, Scheme_Object *argv[]); static Scheme_Object *make_immutable_hasheq(int argc, Scheme_Object *argv[]); +static Scheme_Object *make_immutable_hasheqv(int argc, Scheme_Object *argv[]); static Scheme_Object *hash_table_count(int argc, Scheme_Object *argv[]); static Scheme_Object *hash_table_copy(int argc, Scheme_Object *argv[]); static Scheme_Object *hash_p(int argc, Scheme_Object *argv[]); static Scheme_Object *hash_eq_p(int argc, Scheme_Object *argv[]); +static Scheme_Object *hash_eqv_p(int argc, Scheme_Object *argv[]); static Scheme_Object *hash_weak_p(int argc, Scheme_Object *argv[]); static Scheme_Object *hash_table_put_bang(int argc, Scheme_Object *argv[]); static Scheme_Object *hash_table_put(int argc, Scheme_Object *argv[]); @@ -106,6 +110,7 @@ static Scheme_Object *hash_table_iterate_key(int argc, Scheme_Object *argv[]); static Scheme_Object *eq_hash_code(int argc, Scheme_Object *argv[]); static Scheme_Object *equal_hash_code(int argc, Scheme_Object *argv[]); static Scheme_Object *equal_hash2_code(int argc, Scheme_Object *argv[]); +static Scheme_Object *eqv_hash_code(int argc, Scheme_Object *argv[]); static Scheme_Object *make_weak_box(int argc, Scheme_Object *argv[]); static Scheme_Object *weak_box_value(int argc, Scheme_Object *argv[]); @@ -122,6 +127,7 @@ static Scheme_Object *placeholder_get(int argc, Scheme_Object *argv[]); static Scheme_Object *placeholder_p(int argc, Scheme_Object *argv[]); static Scheme_Object *make_hash_placeholder(int argc, Scheme_Object *argv[]); static Scheme_Object *make_hasheq_placeholder(int argc, Scheme_Object *argv[]); +static Scheme_Object *make_hasheqv_placeholder(int argc, Scheme_Object *argv[]); static Scheme_Object *table_placeholder_p(int argc, Scheme_Object *argv[]); #define BOX "box" @@ -433,6 +439,11 @@ scheme_init_list (Scheme_Env *env) "make-hasheq", 0, 0), env); + scheme_add_global_constant("make-hasheqv", + scheme_make_immed_prim(make_hasheqv, + "make-hasheqv", + 0, 0), + env); scheme_add_global_constant("make-weak-hash", scheme_make_immed_prim(make_weak_hash, "make-weak-hash", @@ -443,6 +454,11 @@ scheme_init_list (Scheme_Env *env) "make-weak-hasheq", 0, 0), env); + scheme_add_global_constant("make-weak-hasheqv", + scheme_make_immed_prim(make_weak_hasheqv, + "make-weak-hasheqv", + 0, 0), + env); scheme_add_global_constant("make-immutable-hash", scheme_make_immed_prim(make_immutable_hash, "make-immutable-hash", @@ -453,6 +469,11 @@ scheme_init_list (Scheme_Env *env) "make-immutable-hasheq", 1, 1), env); + scheme_add_global_constant("make-immutable-hasheqv", + scheme_make_immed_prim(make_immutable_hasheqv, + "make-immutable-hasheqv", + 1, 1), + env); scheme_add_global_constant("hash?", scheme_make_folding_prim(hash_p, "hash?", @@ -463,6 +484,11 @@ scheme_init_list (Scheme_Env *env) "hash-eq?", 1, 1, 1), env); + scheme_add_global_constant("hash-eqv?", + scheme_make_folding_prim(hash_eqv_p, + "hash-eqv?", + 1, 1, 1), + env); scheme_add_global_constant("hash-weak?", scheme_make_folding_prim(hash_weak_p, "hash-weak?", @@ -540,6 +566,11 @@ scheme_init_list (Scheme_Env *env) "eq-hash-code", 1, 1), env); + scheme_add_global_constant("eqv-hash-code", + scheme_make_immed_prim(eqv_hash_code, + "eqv-hash-code", + 1, 1), + env); scheme_add_global_constant("equal-hash-code", scheme_make_noncm_prim(equal_hash_code, "equal-hash-code", @@ -618,6 +649,11 @@ scheme_init_list (Scheme_Env *env) "make-hasheq-placeholder", 1, 1), env); + scheme_add_global_constant("make-hasheqv-placeholder", + scheme_make_prim_w_arity(make_hasheqv_placeholder, + "make-hasheqv-placeholder", + 1, 1), + env); scheme_add_global_constant("hash-placeholder?", scheme_make_folding_prim(table_placeholder_p, "hash-placeholder?", @@ -1417,6 +1453,19 @@ static void make_hash_indices_for_equal(void *v, long *_stk_h1, long *_stk_h2) *_stk_h2 = scheme_equal_hash_key2((Scheme_Object *)v); } +static int compare_eqv(void *v1, void *v2) +{ + return !scheme_eqv((Scheme_Object *)v1, (Scheme_Object *)v2); +} + +static void make_hash_indices_for_eqv(void *v, long *_stk_h1, long *_stk_h2) +{ + if (_stk_h1) + *_stk_h1 = scheme_eqv_hash_key((Scheme_Object *)v); + if (_stk_h2) + *_stk_h2 = scheme_eqv_hash_key2((Scheme_Object *)v); +} + Scheme_Bucket_Table *scheme_make_weak_equal_table(void) { Scheme_Object *sema; @@ -1432,6 +1481,21 @@ Scheme_Bucket_Table *scheme_make_weak_equal_table(void) return t; } +Scheme_Bucket_Table *scheme_make_weak_eqv_table(void) +{ + Scheme_Object *sema; + Scheme_Bucket_Table *t; + + t = scheme_make_bucket_table(20, SCHEME_hash_weak_ptr); + + sema = scheme_make_sema(1); + t->mutex = sema; + t->compare = compare_eqv; + t->make_hash_indices = make_hash_indices_for_eqv; + + return t; +} + static Scheme_Object *make_hash(int argc, Scheme_Object *argv[]) { return (Scheme_Object *)scheme_make_hash_table_equal(); @@ -1442,6 +1506,11 @@ static Scheme_Object *make_hasheq(int argc, Scheme_Object *argv[]) return (Scheme_Object *)scheme_make_hash_table(SCHEME_hash_ptr); } +static Scheme_Object *make_hasheqv(int argc, Scheme_Object *argv[]) +{ + return (Scheme_Object *)scheme_make_hash_table_eqv(); +} + static Scheme_Object *make_weak_hash(int argc, Scheme_Object *argv[]) { return (Scheme_Object *)scheme_make_weak_equal_table(); @@ -1452,7 +1521,12 @@ static Scheme_Object *make_weak_hasheq(int argc, Scheme_Object *argv[]) return (Scheme_Object *)scheme_make_bucket_table(20, SCHEME_hash_weak_ptr); } -static Scheme_Object *make_immutable_table(const char *who, int eql, int argc, Scheme_Object *argv[]) +static Scheme_Object *make_weak_hasheqv(int argc, Scheme_Object *argv[]) +{ + return (Scheme_Object *)scheme_make_weak_eqv_table(); +} + +static Scheme_Object *make_immutable_table(const char *who, int kind, int argc, Scheme_Object *argv[]) { Scheme_Object *l = argv[0], *a; Scheme_Hash_Tree *ht; @@ -1468,7 +1542,7 @@ static Scheme_Object *make_immutable_table(const char *who, int eql, int argc, S if (!SCHEME_NULLP(l)) scheme_wrong_type("make-immutable-hash", "list of pairs", 0, argc, argv); - ht = scheme_make_hash_tree(eql); + ht = scheme_make_hash_tree(kind); for (l = argv[0]; SCHEME_PAIRP(l); l = SCHEME_CDR(l)) { a = SCHEME_CAR(l); @@ -1488,6 +1562,11 @@ static Scheme_Object *make_immutable_hasheq(int argc, Scheme_Object *argv[]) return make_immutable_table("make-immutable-hasheq", 0, argc, argv); } +static Scheme_Object *make_immutable_hasheqv(int argc, Scheme_Object *argv[]) +{ + return make_immutable_table("make-immutable-hasheqv", 2, argc, argv); +} + Scheme_Hash_Table *scheme_make_hash_table_equal() { Scheme_Hash_Table *t; @@ -1503,6 +1582,21 @@ Scheme_Hash_Table *scheme_make_hash_table_equal() return t; } +Scheme_Hash_Table *scheme_make_hash_table_eqv() +{ + Scheme_Hash_Table *t; + Scheme_Object *sema; + + t = scheme_make_hash_table(SCHEME_hash_ptr); + + sema = scheme_make_sema(1); + t->mutex = sema; + t->compare = compare_eqv; + t->make_hash_indices = make_hash_indices_for_eqv; + + return t; +} + static Scheme_Object *hash_table_count(int argc, Scheme_Object *argv[]) { if (SCHEME_HASHTP(argv[0])) { @@ -1595,13 +1689,15 @@ static Scheme_Object *hash_eq_p(int argc, Scheme_Object *argv[]) Scheme_Object *o = argv[0]; if (SCHEME_HASHTP(o)) { - if (((Scheme_Hash_Table *)o)->compare != compare_equal) + if ((((Scheme_Hash_Table *)o)->compare != compare_equal) + && (((Scheme_Hash_Table *)o)->compare != compare_eqv)) return scheme_true; } else if (SCHEME_HASHTRP(o)) { - if (!(SCHEME_HASHTR_FLAGS((Scheme_Hash_Tree *)o) & 0x1)) + if (!(SCHEME_HASHTR_FLAGS((Scheme_Hash_Tree *)o) & 0x3)) return scheme_true; } else if (SCHEME_BUCKTP(o)) { - if (((Scheme_Bucket_Table *)o)->compare != compare_equal) + if ((((Scheme_Bucket_Table *)o)->compare != compare_equal) + && (((Scheme_Bucket_Table *)o)->compare != compare_eqv)) return scheme_true; } else { scheme_wrong_type("hash-eq?", "hash", 0, argc, argv); @@ -1610,6 +1706,26 @@ static Scheme_Object *hash_eq_p(int argc, Scheme_Object *argv[]) return scheme_false; } +static Scheme_Object *hash_eqv_p(int argc, Scheme_Object *argv[]) +{ + Scheme_Object *o = argv[0]; + + if (SCHEME_HASHTP(o)) { + if (((Scheme_Hash_Table *)o)->compare == compare_eqv) + return scheme_true; + } else if (SCHEME_HASHTRP(o)) { + if (SCHEME_HASHTR_FLAGS((Scheme_Hash_Tree *)o) & 0x2) + return scheme_true; + } else if (SCHEME_BUCKTP(o)) { + if (((Scheme_Bucket_Table *)o)->compare == compare_eqv) + return scheme_true; + } else { + scheme_wrong_type("hash-eqv?", "hash", 0, argc, argv); + } + + return scheme_false; +} + static Scheme_Object *hash_weak_p(int argc, Scheme_Object *argv[]) { Scheme_Object *o = argv[0]; @@ -1629,11 +1745,21 @@ int scheme_is_hash_table_equal(Scheme_Object *o) return (((Scheme_Hash_Table *)o)->compare == compare_equal); } +int scheme_is_hash_table_eqv(Scheme_Object *o) +{ + return (((Scheme_Hash_Table *)o)->compare == compare_eqv); +} + int scheme_is_hash_tree_equal(Scheme_Object *o) { return SCHEME_HASHTR_FLAGS((Scheme_Hash_Tree *)o) & 0x1; } +int scheme_is_hash_tree_eqv(Scheme_Object *o) +{ + return SCHEME_HASHTR_FLAGS((Scheme_Hash_Tree *)o) & 0x2; +} + static Scheme_Object *hash_table_put_bang(int argc, Scheme_Object *argv[]) { Scheme_Object *v = argv[0]; @@ -2060,6 +2186,18 @@ static Scheme_Object *equal_hash2_code(int argc, Scheme_Object *argv[]) return scheme_make_integer(v); } +static Scheme_Object *eqv_hash_code(int argc, Scheme_Object *argv[]) +{ + long v; + + if (SCHEME_INTP(argv[0])) + return argv[0]; + + v = scheme_eqv_hash_key(argv[0]); + + return scheme_make_integer(v); +} + Scheme_Object *scheme_make_weak_box(Scheme_Object *v) { #ifdef MZ_PRECISE_GC @@ -2145,7 +2283,7 @@ static Scheme_Object *placeholder_p(int c, Scheme_Object *p[]) : scheme_false); } -static Scheme_Object *do_make_hash_placeholder(const char *who, int eq, int argc, Scheme_Object *argv[]) +static Scheme_Object *do_make_hash_placeholder(const char *who, int kind, int argc, Scheme_Object *argv[]) { Scheme_Object *l, *a, *ph; @@ -2162,14 +2300,14 @@ static Scheme_Object *do_make_hash_placeholder(const char *who, int eq, int argc ph = scheme_alloc_object(); ph->type = scheme_table_placeholder_type; SCHEME_IPTR_VAL(ph) = argv[0]; - SCHEME_PINT_VAL(ph) = eq; + SCHEME_PINT_VAL(ph) = kind; return ph; } static Scheme_Object *make_hash_placeholder(int argc, Scheme_Object *argv[]) { - return do_make_hash_placeholder("make-hash-placeholder", 0, argc, argv); + return do_make_hash_placeholder("make-hash-placeholder", 1, argc, argv); } static Scheme_Object *make_hasheq_placeholder(int argc, Scheme_Object *argv[]) @@ -2177,6 +2315,11 @@ static Scheme_Object *make_hasheq_placeholder(int argc, Scheme_Object *argv[]) return do_make_hash_placeholder("make-hash-placeholder", 0, argc, argv); } +static Scheme_Object *make_hasheqv_placeholder(int argc, Scheme_Object *argv[]) +{ + return do_make_hash_placeholder("make-hasheqv-placeholder", 2, argc, argv); +} + static Scheme_Object *table_placeholder_p(int c, Scheme_Object *p[]) { return (SAME_TYPE(SCHEME_TYPE(p[0]), scheme_table_placeholder_type) diff --git a/src/mzscheme/src/print.c b/src/mzscheme/src/print.c index f4277a4d49..0fbbc2fe6a 100644 --- a/src/mzscheme/src/print.c +++ b/src/mzscheme/src/print.c @@ -1842,18 +1842,29 @@ print(Scheme_Object *obj, int notdisplay, int compact, Scheme_Hash_Table *ht, print_compact(pp, CPT_HASH_TABLE); if ((SCHEME_HASHTP(obj) && scheme_is_hash_table_equal(obj)) || (SCHEME_HASHTRP(obj) && scheme_is_hash_tree_equal(obj))) - print_compact_number(pp, 0); - else print_compact_number(pp, 1); + else if ((SCHEME_HASHTP(obj) && scheme_is_hash_table_eqv(obj)) + || (SCHEME_HASHTRP(obj) && scheme_is_hash_tree_eqv(obj))) + print_compact_number(pp, 2); + else + print_compact_number(pp, 0); } else { always_scheme(pp, 1); print_utf8_string(pp, "#hash", 0, 5); if (SCHEME_HASHTP(obj)) { - if (!scheme_is_hash_table_equal(obj)) - print_utf8_string(pp, "eq", 0, 2); + if (!scheme_is_hash_table_equal(obj)) { + if (scheme_is_hash_table_eqv(obj)) + print_utf8_string(pp, "eqv", 0, 3); + else + print_utf8_string(pp, "eq", 0, 2); + } } else { - if (!scheme_is_hash_tree_equal(obj)) - print_utf8_string(pp, "eq", 0, 2); + if (!scheme_is_hash_tree_equal(obj)) { + if (scheme_is_hash_tree_eqv(obj)) + print_utf8_string(pp, "eqv", 0, 3); + else + print_utf8_string(pp, "eq", 0, 2); + } } print_utf8_string(pp, "(", 0, 1); } diff --git a/src/mzscheme/src/read.c b/src/mzscheme/src/read.c index 93b7718f61..8c8e13399a 100644 --- a/src/mzscheme/src/read.c +++ b/src/mzscheme/src/read.c @@ -243,7 +243,7 @@ static Scheme_Object *read_box(Scheme_Object *port, Scheme_Object *stxsrc, ReadParams *params); static Scheme_Object *read_hash(Scheme_Object *port, Scheme_Object *stxsrc, long line, long col, long pos, - int opener, char closer, int eq, + int opener, char closer, int kind, Scheme_Hash_Table **ht, Scheme_Object *indentation, ReadParams *params); @@ -1507,7 +1507,7 @@ read_inner_inner(Scheme_Object *port, Scheme_Object *stxsrc, Scheme_Hash_Table * return v; } else { - GC_CAN_IGNORE const mzchar str[] = { 's', 'h', 'e', 'q', 0 }; + GC_CAN_IGNORE const mzchar str[] = { 's', 'h', 'e', 'q', 'v', 0 }; int scanpos = 0, failed = 0; do { @@ -1515,7 +1515,7 @@ read_inner_inner(Scheme_Object *port, Scheme_Object *stxsrc, Scheme_Hash_Table * if ((mzchar)ch == str[scanpos]) { scanpos++; } else { - if (scanpos == 2) { + if ((scanpos == 2) || (scanpos == 4)) { int effective_ch; effective_ch = readtable_effective_char(table, ch); if (!(effective_ch == '(') @@ -1530,19 +1530,26 @@ read_inner_inner(Scheme_Object *port, Scheme_Object *stxsrc, Scheme_Hash_Table * if (!failed) { /* Found recognized tag. Look for open paren... */ - int effective_ch; + int effective_ch, kind; - if (scanpos > 2) + if (scanpos > 4) ch = scheme_getc_special_ok(port); effective_ch = readtable_effective_char(table, ch); + if (scanpos == 4) + kind = 0; + else if (scanpos == 2) + kind = 1; + else + kind = 2; + if (effective_ch == '(') - return read_hash(port, stxsrc, line, col, pos, ch, ')', (scanpos == 4), ht, indentation, params); + return read_hash(port, stxsrc, line, col, pos, ch, ')', kind, ht, indentation, params); if (effective_ch == '[' && params->square_brackets_are_parens) - return read_hash(port, stxsrc, line, col, pos, ch, ']', (scanpos == 4), ht, indentation, params); + return read_hash(port, stxsrc, line, col, pos, ch, ']', kind, ht, indentation, params); if (effective_ch == '{' && params->curly_braces_are_parens) - return read_hash(port, stxsrc, line, col, pos, ch, '}', (scanpos == 4), ht, indentation, params); + return read_hash(port, stxsrc, line, col, pos, ch, '}', kind, ht, indentation, params); } /* Report an error. So far, we read 'ha', then scanpos chars of str, then ch. */ @@ -2048,11 +2055,16 @@ static Scheme_Object *resolve_references(Scheme_Object *obj, || SCHEME_HASHTRP(obj)) { Scheme_Hash_Tree *t, *base; Scheme_Object *a, *key, *val, *lst; - int eq; + int kind; if (SCHEME_HASHTRP(obj)) { int i; - eq = !scheme_is_hash_tree_equal(obj); + if (scheme_is_hash_tree_equal(obj)) + kind = 1; + else if (scheme_is_hash_tree_equal(obj)) + kind = 2; + else + kind = 0; t = (Scheme_Hash_Tree *)obj; lst = scheme_null; for (i = t->count; i--; ) { @@ -2060,13 +2072,13 @@ static Scheme_Object *resolve_references(Scheme_Object *obj, lst = scheme_make_pair(scheme_make_pair(key, val), lst); } } else { - eq = SCHEME_PINT_VAL(obj); + kind = SCHEME_PINT_VAL(obj); lst = SCHEME_IPTR_VAL(obj); } /* Create `t' to be overwritten, and create `base' to extend. */ - t = scheme_make_hash_tree(!eq); - base = scheme_make_hash_tree(!eq); + t = scheme_make_hash_tree(kind); + base = scheme_make_hash_tree(kind); result = (Scheme_Object *)t; scheme_hash_set(dht, obj, result); @@ -3947,7 +3959,7 @@ static Scheme_Object *read_box(Scheme_Object *port, /* "(" has been read */ static Scheme_Object *read_hash(Scheme_Object *port, Scheme_Object *stxsrc, long line, long col, long pos, - int opener, char closer, int eq, + int opener, char closer, int kind, Scheme_Hash_Table **ht, Scheme_Object *indentation, ReadParams *params) { @@ -3960,7 +3972,7 @@ static Scheme_Object *read_hash(Scheme_Object *port, Scheme_Object *stxsrc, Scheme_Object *key, *val; Scheme_Hash_Tree *t; - t = scheme_make_hash_tree(!eq); + t = scheme_make_hash_tree(kind); l = scheme_syntax_to_datum(l, 0, NULL); @@ -3981,7 +3993,7 @@ static Scheme_Object *read_hash(Scheme_Object *port, Scheme_Object *stxsrc, ph = scheme_alloc_object(); ph->type = scheme_table_placeholder_type; SCHEME_IPTR_VAL(ph) = l; - SCHEME_PINT_VAL(ph) = eq; + SCHEME_PINT_VAL(ph) = kind; if (!*ht) { /* So that resolve_references is called to build the table: */ @@ -4565,9 +4577,9 @@ static Scheme_Object *read_compact(CPort *port, int use_stack) case CPT_HASH_TABLE: { Scheme_Object *l; - int eq, len; + int kind, len; - eq = read_compact_number(port); + kind = read_compact_number(port); len = read_compact_number(port); l = scheme_null; @@ -4590,7 +4602,7 @@ static Scheme_Object *read_compact(CPort *port, int use_stack) /* Let resolve_references complete the table construction: */ v = scheme_alloc_object(); v->type = scheme_table_placeholder_type; - SCHEME_PINT_VAL(v) = eq; + SCHEME_PINT_VAL(v) = kind; SCHEME_IPTR_VAL(v) = l; } break; diff --git a/src/mzscheme/src/schemef.h b/src/mzscheme/src/schemef.h index a54723db2e..b64f009d9b 100644 --- a/src/mzscheme/src/schemef.h +++ b/src/mzscheme/src/schemef.h @@ -423,6 +423,7 @@ MZ_EXTERN Scheme_Bucket_Table *scheme_clone_bucket_table(Scheme_Bucket_Table *bt MZ_EXTERN Scheme_Hash_Table *scheme_make_hash_table(int type); MZ_EXTERN Scheme_Hash_Table *scheme_make_hash_table_equal(); +MZ_EXTERN Scheme_Hash_Table *scheme_make_hash_table_eqv(); MZ_EXTERN void scheme_hash_set(Scheme_Hash_Table *table, Scheme_Object *key, Scheme_Object *val); MZ_EXTERN Scheme_Object *scheme_hash_get(Scheme_Hash_Table *table, Scheme_Object *key); XFORM_NONGCING MZ_EXTERN Scheme_Object *scheme_eq_hash_get(Scheme_Hash_Table *table, Scheme_Object *key); @@ -430,15 +431,17 @@ MZ_EXTERN void scheme_hash_set_atomic(Scheme_Hash_Table *table, Scheme_Object *k MZ_EXTERN Scheme_Object *scheme_hash_get_atomic(Scheme_Hash_Table *table, Scheme_Object *key); MZ_EXTERN int scheme_hash_table_equal(Scheme_Hash_Table *t1, Scheme_Hash_Table *t2); MZ_EXTERN int scheme_is_hash_table_equal(Scheme_Object *o); +MZ_EXTERN int scheme_is_hash_table_eqv(Scheme_Object *o); MZ_EXTERN Scheme_Hash_Table *scheme_clone_hash_table(Scheme_Hash_Table *bt); -MZ_EXTERN Scheme_Hash_Tree *scheme_make_hash_tree(int eql); +MZ_EXTERN Scheme_Hash_Tree *scheme_make_hash_tree(int kind); MZ_EXTERN Scheme_Hash_Tree *scheme_hash_tree_set(Scheme_Hash_Tree *tree, Scheme_Object *key, Scheme_Object *val); MZ_EXTERN Scheme_Object *scheme_hash_tree_get(Scheme_Hash_Tree *tree, Scheme_Object *key); MZ_EXTERN long scheme_hash_tree_next(Scheme_Hash_Tree *tree, long pos); MZ_EXTERN int scheme_hash_tree_index(Scheme_Hash_Tree *tree, long pos, Scheme_Object **_key, Scheme_Object **_val); MZ_EXTERN int scheme_hash_tree_equal(Scheme_Hash_Tree *t1, Scheme_Hash_Tree *t2); MZ_EXTERN int scheme_is_hash_tree_equal(Scheme_Object *o); +MZ_EXTERN int scheme_is_hash_tree_eqv(Scheme_Object *o); /*========================================================================*/ /* basic Scheme value constructors */ @@ -1011,6 +1014,8 @@ MZ_EXTERN long scheme_equal_hash_key(Scheme_Object *o); MZ_EXTERN long scheme_equal_hash_key2(Scheme_Object *o); MZ_EXTERN long scheme_recur_equal_hash_key(Scheme_Object *o, void *cycle_data); MZ_EXTERN long scheme_recur_equal_hash_key2(Scheme_Object *o, void *cycle_data); +MZ_EXTERN long scheme_eqv_hash_key(Scheme_Object *o); +MZ_EXTERN long scheme_eqv_hash_key2(Scheme_Object *o); MZ_EXTERN void scheme_set_type_equality(Scheme_Type type, Scheme_Equal_Proc f, diff --git a/src/mzscheme/src/schemex.h b/src/mzscheme/src/schemex.h index 07ba9a57e3..d5c16562d9 100644 --- a/src/mzscheme/src/schemex.h +++ b/src/mzscheme/src/schemex.h @@ -343,6 +343,7 @@ int (*scheme_bucket_table_equal)(Scheme_Bucket_Table *t1, Scheme_Bucket_Table *t Scheme_Bucket_Table *(*scheme_clone_bucket_table)(Scheme_Bucket_Table *bt); Scheme_Hash_Table *(*scheme_make_hash_table)(int type); Scheme_Hash_Table *(*scheme_make_hash_table_equal)(); +Scheme_Hash_Table *(*scheme_make_hash_table_eqv)(); void (*scheme_hash_set)(Scheme_Hash_Table *table, Scheme_Object *key, Scheme_Object *val); Scheme_Object *(*scheme_hash_get)(Scheme_Hash_Table *table, Scheme_Object *key); Scheme_Object *(*scheme_eq_hash_get)(Scheme_Hash_Table *table, Scheme_Object *key); @@ -350,14 +351,16 @@ void (*scheme_hash_set_atomic)(Scheme_Hash_Table *table, Scheme_Object *key, Sch Scheme_Object *(*scheme_hash_get_atomic)(Scheme_Hash_Table *table, Scheme_Object *key); int (*scheme_hash_table_equal)(Scheme_Hash_Table *t1, Scheme_Hash_Table *t2); int (*scheme_is_hash_table_equal)(Scheme_Object *o); +int (*scheme_is_hash_table_eqv)(Scheme_Object *o); Scheme_Hash_Table *(*scheme_clone_hash_table)(Scheme_Hash_Table *bt); -Scheme_Hash_Tree *(*scheme_make_hash_tree)(int eql); +Scheme_Hash_Tree *(*scheme_make_hash_tree)(int kind); Scheme_Hash_Tree *(*scheme_hash_tree_set)(Scheme_Hash_Tree *tree, Scheme_Object *key, Scheme_Object *val); Scheme_Object *(*scheme_hash_tree_get)(Scheme_Hash_Tree *tree, Scheme_Object *key); long (*scheme_hash_tree_next)(Scheme_Hash_Tree *tree, long pos); int (*scheme_hash_tree_index)(Scheme_Hash_Tree *tree, long pos, Scheme_Object **_key, Scheme_Object **_val); int (*scheme_hash_tree_equal)(Scheme_Hash_Tree *t1, Scheme_Hash_Tree *t2); int (*scheme_is_hash_tree_equal)(Scheme_Object *o); +int (*scheme_is_hash_tree_eqv)(Scheme_Object *o); /*========================================================================*/ /* basic Scheme value constructors */ /*========================================================================*/ @@ -839,6 +842,8 @@ long (*scheme_equal_hash_key)(Scheme_Object *o); long (*scheme_equal_hash_key2)(Scheme_Object *o); long (*scheme_recur_equal_hash_key)(Scheme_Object *o, void *cycle_data); long (*scheme_recur_equal_hash_key2)(Scheme_Object *o, void *cycle_data); +long (*scheme_eqv_hash_key)(Scheme_Object *o); +long (*scheme_eqv_hash_key2)(Scheme_Object *o); void (*scheme_set_type_equality)(Scheme_Type type, Scheme_Equal_Proc f, Scheme_Primary_Hash_Proc hash1, diff --git a/src/mzscheme/src/schemex.inc b/src/mzscheme/src/schemex.inc index 9ef2d1deb5..31445d5ca7 100644 --- a/src/mzscheme/src/schemex.inc +++ b/src/mzscheme/src/schemex.inc @@ -239,6 +239,7 @@ scheme_extension_table->scheme_clone_bucket_table = scheme_clone_bucket_table; scheme_extension_table->scheme_make_hash_table = scheme_make_hash_table; scheme_extension_table->scheme_make_hash_table_equal = scheme_make_hash_table_equal; + scheme_extension_table->scheme_make_hash_table_eqv = scheme_make_hash_table_eqv; scheme_extension_table->scheme_hash_set = scheme_hash_set; scheme_extension_table->scheme_hash_get = scheme_hash_get; scheme_extension_table->scheme_eq_hash_get = scheme_eq_hash_get; @@ -246,6 +247,7 @@ scheme_extension_table->scheme_hash_get_atomic = scheme_hash_get_atomic; scheme_extension_table->scheme_hash_table_equal = scheme_hash_table_equal; scheme_extension_table->scheme_is_hash_table_equal = scheme_is_hash_table_equal; + scheme_extension_table->scheme_is_hash_table_eqv = scheme_is_hash_table_eqv; scheme_extension_table->scheme_clone_hash_table = scheme_clone_hash_table; scheme_extension_table->scheme_make_hash_tree = scheme_make_hash_tree; scheme_extension_table->scheme_hash_tree_set = scheme_hash_tree_set; @@ -254,6 +256,7 @@ scheme_extension_table->scheme_hash_tree_index = scheme_hash_tree_index; scheme_extension_table->scheme_hash_tree_equal = scheme_hash_tree_equal; scheme_extension_table->scheme_is_hash_tree_equal = scheme_is_hash_tree_equal; + scheme_extension_table->scheme_is_hash_tree_eqv = scheme_is_hash_tree_eqv; scheme_extension_table->scheme_make_prim = scheme_make_prim; scheme_extension_table->scheme_make_noneternal_prim = scheme_make_noneternal_prim; scheme_extension_table->scheme_make_prim_w_arity = scheme_make_prim_w_arity; @@ -577,6 +580,8 @@ scheme_extension_table->scheme_equal_hash_key2 = scheme_equal_hash_key2; scheme_extension_table->scheme_recur_equal_hash_key = scheme_recur_equal_hash_key; scheme_extension_table->scheme_recur_equal_hash_key2 = scheme_recur_equal_hash_key2; + scheme_extension_table->scheme_eqv_hash_key = scheme_eqv_hash_key; + scheme_extension_table->scheme_eqv_hash_key2 = scheme_eqv_hash_key2; scheme_extension_table->scheme_set_type_equality = scheme_set_type_equality; scheme_extension_table->scheme_recur_equal = scheme_recur_equal; scheme_extension_table->scheme_build_list = scheme_build_list; diff --git a/src/mzscheme/src/schemexm.h b/src/mzscheme/src/schemexm.h index a841e0e8ed..709b979df5 100644 --- a/src/mzscheme/src/schemexm.h +++ b/src/mzscheme/src/schemexm.h @@ -239,6 +239,7 @@ #define scheme_clone_bucket_table (scheme_extension_table->scheme_clone_bucket_table) #define scheme_make_hash_table (scheme_extension_table->scheme_make_hash_table) #define scheme_make_hash_table_equal (scheme_extension_table->scheme_make_hash_table_equal) +#define scheme_make_hash_table_eqv (scheme_extension_table->scheme_make_hash_table_eqv) #define scheme_hash_set (scheme_extension_table->scheme_hash_set) #define scheme_hash_get (scheme_extension_table->scheme_hash_get) #define scheme_eq_hash_get (scheme_extension_table->scheme_eq_hash_get) @@ -246,6 +247,7 @@ #define scheme_hash_get_atomic (scheme_extension_table->scheme_hash_get_atomic) #define scheme_hash_table_equal (scheme_extension_table->scheme_hash_table_equal) #define scheme_is_hash_table_equal (scheme_extension_table->scheme_is_hash_table_equal) +#define scheme_is_hash_table_eqv (scheme_extension_table->scheme_is_hash_table_eqv) #define scheme_clone_hash_table (scheme_extension_table->scheme_clone_hash_table) #define scheme_make_hash_tree (scheme_extension_table->scheme_make_hash_tree) #define scheme_hash_tree_set (scheme_extension_table->scheme_hash_tree_set) @@ -254,6 +256,7 @@ #define scheme_hash_tree_index (scheme_extension_table->scheme_hash_tree_index) #define scheme_hash_tree_equal (scheme_extension_table->scheme_hash_tree_equal) #define scheme_is_hash_tree_equal (scheme_extension_table->scheme_is_hash_tree_equal) +#define scheme_is_hash_tree_eqv (scheme_extension_table->scheme_is_hash_tree_eqv) #define scheme_make_prim (scheme_extension_table->scheme_make_prim) #define scheme_make_noneternal_prim (scheme_extension_table->scheme_make_noneternal_prim) #define scheme_make_prim_w_arity (scheme_extension_table->scheme_make_prim_w_arity) @@ -577,6 +580,8 @@ #define scheme_equal_hash_key2 (scheme_extension_table->scheme_equal_hash_key2) #define scheme_recur_equal_hash_key (scheme_extension_table->scheme_recur_equal_hash_key) #define scheme_recur_equal_hash_key2 (scheme_extension_table->scheme_recur_equal_hash_key2) +#define scheme_eqv_hash_key (scheme_extension_table->scheme_eqv_hash_key) +#define scheme_eqv_hash_key2 (scheme_extension_table->scheme_eqv_hash_key2) #define scheme_set_type_equality (scheme_extension_table->scheme_set_type_equality) #define scheme_recur_equal (scheme_extension_table->scheme_recur_equal) #define scheme_build_list (scheme_extension_table->scheme_build_list) diff --git a/src/mzscheme/src/schminc.h b/src/mzscheme/src/schminc.h index 2e0f01e031..7bb57a99c7 100644 --- a/src/mzscheme/src/schminc.h +++ b/src/mzscheme/src/schminc.h @@ -13,7 +13,7 @@ #define USE_COMPILED_STARTUP 1 -#define EXPECTED_PRIM_COUNT 929 +#define EXPECTED_PRIM_COUNT 935 #ifdef MZSCHEME_SOMETHING_OMITTED # undef USE_COMPILED_STARTUP diff --git a/src/mzscheme/src/schpriv.h b/src/mzscheme/src/schpriv.h index 7a9944be0e..8a6b5b270e 100644 --- a/src/mzscheme/src/schpriv.h +++ b/src/mzscheme/src/schpriv.h @@ -530,7 +530,7 @@ Scheme_Bucket *scheme_bucket_or_null_from_table(Scheme_Bucket_Table *table, cons struct Scheme_Hash_Tree { - Scheme_Inclhash_Object iso; /* 0x1 flag => equal?-based hashing */ + Scheme_Inclhash_Object iso; /* 0x1 flag => equal?-based hashing; 0x2 flag => eqv?-based hashing */ int count; struct RBNode *root; Scheme_Object *elems_box; /* vector in a weak box */ diff --git a/src/mzscheme/src/schvers.h b/src/mzscheme/src/schvers.h index e071a13ecb..c653c961b8 100644 --- a/src/mzscheme/src/schvers.h +++ b/src/mzscheme/src/schvers.h @@ -13,12 +13,12 @@ consistently.) */ -#define MZSCHEME_VERSION "4.1.1.1" +#define MZSCHEME_VERSION "4.1.1.2" #define MZSCHEME_VERSION_X 4 #define MZSCHEME_VERSION_Y 1 #define MZSCHEME_VERSION_Z 1 -#define MZSCHEME_VERSION_W 1 +#define MZSCHEME_VERSION_W 2 #define MZSCHEME_VERSION_MAJOR ((MZSCHEME_VERSION_X * 100) + MZSCHEME_VERSION_Y) #define MZSCHEME_VERSION_MINOR ((MZSCHEME_VERSION_Z * 1000) + MZSCHEME_VERSION_W)