aboutsummaryrefslogtreecommitdiff
path: root/src/interp/hashcode.boot
diff options
context:
space:
mode:
authordos-reis <gdr@axiomatics.org>2007-10-15 07:32:38 +0000
committerdos-reis <gdr@axiomatics.org>2007-10-15 07:32:38 +0000
commit6c715d9b21d64a8d6e46563d238c5526cab811a3 (patch)
tree3f47b1e28138da174f98cfe7c7a028c98b96de5d /src/interp/hashcode.boot
parent438fc2b3dca328c5e9a10e75ccb6ec25d8cf782e (diff)
downloadopen-axiom-6c715d9b21d64a8d6e46563d238c5526cab811a3.tar.gz
remove more pamphlets from interp/
Diffstat (limited to 'src/interp/hashcode.boot')
-rw-r--r--src/interp/hashcode.boot111
1 files changed, 111 insertions, 0 deletions
diff --git a/src/interp/hashcode.boot b/src/interp/hashcode.boot
new file mode 100644
index 00000000..bcd1a554
--- /dev/null
+++ b/src/interp/hashcode.boot
@@ -0,0 +1,111 @@
+-- Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd.
+-- All rights reserved.
+-- Copyright (C) 2007, Gabriel Dos Reis.
+-- All rights reserved.
+--
+-- Redistribution and use in source and binary forms, with or without
+-- modification, are permitted provided that the following conditions are
+-- met:
+--
+-- - Redistributions of source code must retain the above copyright
+-- notice, this list of conditions and the following disclaimer.
+--
+-- - Redistributions in binary form must reproduce the above copyright
+-- notice, this list of conditions and the following disclaimer in
+-- the documentation and/or other materials provided with the
+-- distribution.
+--
+-- - Neither the name of The Numerical ALgorithms Group Ltd. nor the
+-- names of its contributors may be used to endorse or promote products
+-- derived from this software without specific prior written permission.
+--
+-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+-- IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+-- TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+-- PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+-- OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+-- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+-- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+-- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+-- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+-- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+-- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+)package "BOOT"
+
+-- Type hasher for old compiler style type names which produces a hash code
+-- compatible with the asharp compiler. Takes a hard error if the type
+-- is parameterized, but has no constructor modemap.
+getDomainHash dom == SPADCALL(CDR dom, (CAR dom).4)
+
+hashType(type, percentHash) ==
+ SYMBOLP type =>
+ type = '$ => percentHash
+ type = "%" => percentHash
+ hashString SYMBOL_-NAME type
+ STRINGP type => hashCombine(hashString type,
+ hashString('"Enumeration"))
+ type is ['QUOTE, val] => hashType(val, percentHash)
+ type is [dom] => hashString SYMBOL_-NAME dom
+ type is ['_:, ., type2] => hashType(type2, percentHash)
+ isDomain type => getDomainHash type
+ [op, :args] := type
+ hash := hashString SYMBOL_-NAME op
+ op = 'Mapping =>
+ hash := hashString '"->"
+ [retType, :mapArgs] := args
+ for arg in mapArgs repeat
+ hash := hashCombine(hashType(arg, percentHash), hash)
+ retCode := hashType(retType, percentHash)
+ EQL(retCode, $VoidHash) => hash
+ hashCombine(retCode, hash)
+ op = 'Enumeration =>
+ for arg in args repeat
+ hash := hashCombine(hashString(STRING arg), hash)
+ hash
+ op in $DomainsWithoutLisplibs =>
+ for arg in args repeat
+ hash := hashCombine(hashType(arg, percentHash), hash)
+ hash
+
+ cmm := CDDAR getConstructorModemap(op)
+ cosig := CDR GETDATABASE(op, 'COSIG)
+ for arg in args for c in cosig for ct in cmm repeat
+ if c then
+ hash := hashCombine(hashType(arg, percentHash), hash)
+ else
+ hash := hashCombine(7, hash)
+-- !!! If/when asharp hashes values using their type, use instead
+-- ctt := EQSUBSTLIST(args, $FormalMapVariableList, ct)
+-- hash := hashCombine(hashType(ctt, percentHash), hash)
+
+
+ hash
+
+--The following are in cfuns.lisp
+$hashModulus := 1073741789 -- largest 30-bit prime
+
+-- Produce a 30-bit hash code. This function must produce the same codes
+-- as the asharp string hasher in src/strops.c
+hashString str ==
+ h := 0
+ for i in 0..#str-1 repeat
+ j := CHAR_-CODE char str.i
+ h := LOGXOR(h, ASH(h, 8))
+ h := h + j + 200041
+ h := LOGAND(h, 1073741823) -- 0x3FFFFFFF
+ REM(h, $hashModulus)
+
+-- Combine two hash codes to make a new one. Must be the same as in
+-- the hashCombine function in aslib/runtime.as in asharp.
+hashCombine(hash1, hash2) ==
+ MOD(ASH(LOGAND(hash2, 16777215), 6) + hash1, $hashModulus)
+
+
+$VoidHash := hashString '"Void"
+
+
+-- following two lines correct bad coSig properties due to SubsetCategory
+--putConstructorProperty('LocalAlgebra,'coSig,'(NIL T T T))
+--putConstructorProperty('Localize,'coSig,'(NIL T T T))