(DEFINE-FILE-INFO READTABLE "XCL" PACKAGE "LISP") (IL:FILECREATED "16-May-90 13:25:03" IL:|{DSK}local>lde>lispcore>sources>CMLHASH.;2| 8265 IL:|changes| IL:|to:| (IL:VARS IL:CMLHASHCOMS) IL:|previous| IL:|date:| " 8-Jun-89 17:15:50" IL:|{DSK}local>lde>lispcore>sources>CMLHASH.;1| ) ; Copyright (c) 1985, 1986, 1987, 1989, 1990 by Venue & Xerox Corporation. All rights reserved. (IL:PRETTYCOMPRINT IL:CMLHASHCOMS) (IL:RPAQQ IL:CMLHASHCOMS ( (IL:* IL:|;;| "External interface") (IL:FUNCTIONS MAKE-HASH-TABLE GETHASH MAPHASH HASH-TABLE-COUNT HASH-TABLE-P SXHASH) (XCL:OPTIMIZERS GETHASH HASH-TABLE-COUNT HASH-TABLE-P) (IL:SETFS GETHASH) (IL:* IL:|;;| "Internal interface") (IL:FUNCTIONS EQLHASHBITSFN SXHASH-PATHNAME) (IL:DECLARE\: IL:DONTCOPY IL:DOEVAL@COMPILE (IL:VARIABLES SXHASH-MAX) (IL:FUNCTIONS SXHASH-LIST SXHASH-STRING SXHASH-BIT-VECTOR SXHASH-ROT)) (IL:* IL:|;;| "UFN for the SXHASH opcode (a MISCN)") (IL:FNS SXHASH-UFN EQLHASHBITSFN-UFN %SXHASH) (XCL:OPTIMIZERS SXHASH EQLHASHBITSFN) (XCL:OPTIMIZERS IL:STRINGHASHBITS IL:STRING-EQUAL-HASHBITS) (IL:PROP (IL:FILETYPE IL:MAKEFILE-ENVIRONMENT) IL:CMLHASH))) (IL:* IL:|;;| "External interface") (DEFUN MAKE-HASH-TABLE (&KEY (TEST 'EQL) (SIZE 65) REHASH-SIZE REHASH-THRESHOLD) (IL:* IL:|;;| "Creates and returns a hash table. See manual for details.") (IF (NOT (SYMBOLP TEST)) (COND ((%EQCODEP TEST 'EQ) (SETQ TEST 'EQ)) ((%EQCODEP TEST 'EQL) (SETQ TEST 'EQL)) ((%EQCODEP TEST 'EQUAL) (SETQ TEST 'EQUAL)))) (ECASE TEST (EQ (IL:HASHARRAY SIZE REHASH-SIZE)) (EQL (IL:HASHARRAY SIZE REHASH-SIZE 'EQLHASHBITSFN 'EQL)) (EQUAL (IL:HASHARRAY SIZE REHASH-SIZE 'SXHASH 'EQUAL)))) (DEFUN GETHASH (KEY HASHTABLE &OPTIONAL DEFAULT) (IL:GETHASH KEY HASHTABLE DEFAULT T)) (DEFUN MAPHASH (FN HASH-TABLE) "Call function with each key/value pair in the hash-table" (IL:MAPHASH HASH-TABLE #'(LAMBDA (VALUE KEY) (FUNCALL FN KEY VALUE))) NIL) (DEFUN HASH-TABLE-COUNT (HASH-TABLE) (IL:HARRAYPROP HASH-TABLE 'IL:NUMKEYS)) (DEFUN HASH-TABLE-P (OBJECT) (IL:TYPENAMEP OBJECT 'IL:HARRAYP)) (DEFUN SXHASH (OBJECT) (IL:MISCN SXHASH OBJECT)) (XCL:DEFOPTIMIZER GETHASH (KEY HASHTABLE &OPTIONAL DEFAULT XCL:&CONTEXT CONTEXT) (IF (EQ 1 (COMPILER:CONTEXT-VALUES-USED CONTEXT)) (IF DEFAULT `(IL:GETHASH ,KEY ,HASHTABLE ,DEFAULT) `(IL:GETHASH ,KEY ,HASHTABLE)) 'COMPILER:PASS)) (XCL:DEFOPTIMIZER HASH-TABLE-COUNT (HASH-TABLE) `(IL:HARRAYPROP ,HASH-TABLE 'IL:NUMKEYS)) (XCL:DEFOPTIMIZER HASH-TABLE-P (OBJECT) `(IL:TYPENAMEP ,OBJECT 'IL:HARRAYP)) (DEFSETF GETHASH PUTHASH) (IL:* IL:|;;| "Internal interface") (DEFUN EQLHASHBITSFN (OBJ) (IL:MISCN EQLHASHBITSFN OBJ)) (DEFUN SXHASH-PATHNAME (PATHNAME) (LET ((HASH (SXHASH-ROT (LOGXOR (%SXHASH (IL:%PATHNAME-HOST PATHNAME)) (%SXHASH (IL:%PATHNAME-DEVICE PATHNAME)))))) (SETQ HASH (SXHASH-ROT (LOGXOR HASH (%SXHASH (IL:%PATHNAME-TYPE PATHNAME))))) (SETQ HASH (SXHASH-ROT (LOGXOR HASH (%SXHASH (IL:%PATHNAME-VERSION PATHNAME))))) (SETQ HASH (SXHASH-ROT (LOGXOR HASH (%SXHASH (IL:%PATHNAME-DIRECTORY PATHNAME))))) (SETQ HASH (SXHASH-ROT (LOGXOR HASH (%SXHASH (IL:%PATHNAME-NAME PATHNAME))))))) (IL:DECLARE\: IL:DONTCOPY IL:DOEVAL@COMPILE (DEFCONSTANT SXHASH-MAX 13) (DEFMACRO SXHASH-LIST (LIST) `(DO ((LIST ,LIST (CDR LIST)) (INDEX 0 (1+ INDEX)) (HASH 0)) ((OR (NOT (CONSP LIST)) (EQ INDEX SXHASH-MAX)) HASH) (SETQ HASH (SXHASH-ROT (LOGXOR HASH (%SXHASH (CAR LIST))))))) (DEFMACRO SXHASH-STRING (STRING) (IL:* IL:\;  "Returns hash value for a general string.") `(DO ((I 0 (1+ I)) (LENGTH (MIN (LENGTH ,STRING) SXHASH-MAX)) (HASH 0)) ((EQ I LENGTH) HASH) (IL:* IL:|;;| "the spice code had a fairly general \"rotate X within integerlength of most-positive-fixnum bits, but (a) it was slow and (b) it was buggy anyway, since it assumed that most-positive-fixnum was 1 less than a power of two.") (SETQ HASH (SXHASH-ROT (LOGXOR HASH (CHAR-INT (AREF ,STRING I))))))) (DEFMACRO SXHASH-BIT-VECTOR (BIT-VECTOR) `(DO ((I 0 (1+ I)) (LENGTH (MIN (LENGTH ,BIT-VECTOR) 16)) (HASH 0)) ((EQ I LENGTH) HASH) (SETQ HASH (+ (ASH HASH 1) (AREF ,BIT-VECTOR I))))) (DEFMACRO SXHASH-ROT (X) `(LET ((X ,X)) (DPB X (BYTE 9 7) (LDB (BYTE 7 9) X)))) ) (IL:* IL:|;;| "UFN for the SXHASH opcode (a MISCN)") (IL:DEFINEQ (SXHASH-UFN (IL:LAMBDA (IL:INDEX IL:ARGCOUNT IL:ARG-PTR) (IL:* IL:\; "Edited 23-Feb-89 19:45 by jds") (IL:* IL:|;;|  "This is the UFN for the CL:SXHASH MISCN sub-opcode. That MISCN is being implemented on Suns.") (%SXHASH (IL:\\GETBASEPTR IL:ARG-PTR 0)))) (EQLHASHBITSFN-UFN (IL:LAMBDA (IL:INDEX IL:ARGCOUNT IL:ARG-PTR) (IL:* IL:\; "Edited 23-Feb-89 18:10 by jds") (LET ((OBJ (IL:\\GETBASEPTR IL:ARG-PTR 0))) (TYPECASE OBJ (CHARACTER (CHAR-INT OBJ)) (INTEGER (LOGAND OBJ 65535)) (FLOAT (LOGXOR (IL:|fetch| (IL:FLOATP IL:HIWORD) IL:|of| OBJ) (IL:|fetch| (IL:FLOATP IL:LOWORD) IL:|of| OBJ))) (RATIO (LOGXOR (EQLHASHBITSFN (NUMERATOR OBJ)) (EQLHASHBITSFN (DENOMINATOR OBJ)))) (COMPLEX (LOGXOR (EQLHASHBITSFN (REALPART OBJ)) (EQLHASHBITSFN (IMAGPART OBJ)))) (T (IL:\\EQHASHINGBITS OBJ)))))) (%SXHASH (IL:LAMBDA (OBJECT) (IL:* IL:\; "Edited 23-Feb-89 19:42 by jds") (COND ((SYMBOLP OBJECT) (IL:\\EQHASHINGBITS OBJECT)) ((LISTP OBJECT) (SXHASH-LIST OBJECT)) ((NUMBERP OBJECT) (TYPECASE OBJECT (INTEGER (LOGAND OBJECT MOST-POSITIVE-FIXNUM)) (FLOAT (LOGXOR (IL:|fetch| (IL:FLOATP IL:HIWORD) IL:|of| OBJECT) (IL:|fetch| (IL:FLOATP IL:LOWORD) IL:|of| OBJECT))) (RATIO (LOGXOR (%SXHASH (NUMERATOR OBJECT)) (%SXHASH (DENOMINATOR OBJECT)))) (COMPLEX (LOGXOR (%SXHASH (REALPART OBJECT)) (%SXHASH (IMAGPART OBJECT)))))) ((STRINGP OBJECT) (SXHASH-STRING OBJECT)) ((BIT-VECTOR-P OBJECT) (SXHASH-BIT-VECTOR OBJECT)) ((PATHNAMEP OBJECT) (SXHASH-PATHNAME OBJECT)) (T (IL:\\EQHASHINGBITS OBJECT))))) ) (XCL:DEFOPTIMIZER SXHASH (OBJECT) `(IL:MISCN SXHASH ,OBJECT)) (XCL:DEFOPTIMIZER EQLHASHBITSFN (OBJECT) `(IL:MISCN EQLHASHBITSFN ,OBJECT)) (XCL:DEFOPTIMIZER IL:STRINGHASHBITS (STRING) `(IL:MISCN IL:STRINGHASHBITS ,STRING)) (XCL:DEFOPTIMIZER IL:STRING-EQUAL-HASHBITS (STRING) `(IL:MISCN IL:STRING-EQUAL-HASHBITS ,STRING)) (IL:PUTPROPS IL:CMLHASH IL:FILETYPE COMPILE-FILE) (IL:PUTPROPS IL:CMLHASH IL:MAKEFILE-ENVIRONMENT (:READTABLE "XCL" :PACKAGE "LISP")) (IL:PUTPROPS IL:CMLHASH IL:COPYRIGHT ("Venue & Xerox Corporation" 1985 1986 1987 1989 1990)) (IL:DECLARE\: IL:DONTCOPY (IL:FILEMAP (NIL (5446 7499 (SXHASH-UFN 5459 . 5758) (EQLHASHBITSFN-UFN 5760 . 6499) (%SXHASH 6501 . 7497))))) IL:STOP