(DEFINE-FILE-INFO READTABLE "INTERLISP" PACKAGE "INTERLISP")
(FILECREATED "15-Sep-87 11:26:06" |{MCS:MCS:STANFORD}<LANE>HASHBUFFER.;6| 6916   

      changes to%:  (VARS HASHBUFFERCOMS)

      previous date%: " 3-Sep-87 17:06:23" |{MCS:MCS:STANFORD}<LANE>HASHBUFFER.;5|)


(* "
Copyright (c) 1985, 1986, 1987 by Stanford University.  All rights reserved.
")

(PRETTYCOMPRINT HASHBUFFERCOMS)

(RPAQQ HASHBUFFERCOMS ((FNS CREATEHASHBUFFER OPENHASHBUFFER CLOSEHASHBUFFER GETHASHBUFFER 
                            PUTHASHBUFFER)
                       (INITVARS (EMPTYHASHENTRYMARKER '**EMPTYHASHENTRY**))
                       (GLOBALVARS EMPTYHASHENTRYMARKER)
                       (FNS HASHARRAY.TO.HASHFILE HASHFILE.TO.HASHARRAY)
                       (DECLARE%: DONTCOPY (RECORDS HASHBUFFER))
                       (FILES HASH)))
(DEFINEQ

(CREATEHASHBUFFER
  [LAMBDA (FILE VALUETYPE ITEMLENGTH %#ENTRIES OVERFLOW HASHBITSFN EQUIVFN)
                                                             (* cdl " 1-May-87 16:08")
    (DECLARE (GLOBALVARS HASHFILEDEFAULTSIZE))
    (PROG [(HASHBUFFER (create HASHBUFFER
                              HASHFILE _ (CREATEHASHFILE FILE VALUETYPE ITEMLENGTH %#ENTRIES)
                              HASHARRAY _ (HASHARRAY (OR %#ENTRIES HASHFILEDEFAULTSIZE)
                                                 OVERFLOW HASHBITSFN EQUIVFN]
          (replace (HASHBUFFER ACCESS) of HASHBUFFER with (GETFILEINFO (with HashFile
                                                                             (with HASHBUFFER 
                                                                                   HASHBUFFER 
                                                                                   HASHFILE)
                                                                             Stream)
                                                                 'ACCESS))
          (RETURN HASHBUFFER])

(OPENHASHBUFFER
  [LAMBDA (FILE ACCESS MINKEYS OVERFLOW HASHBITSFN EQUIVFN)  (* cdl " 1-May-87 16:10")
    (PROG [(HASHBUFFER (create HASHBUFFER
                              HASHFILE _ (OPENHASHFILE FILE ACCESS]
          (replace (HASHBUFFER HASHARRAY) of HASHBUFFER
             with (HASHARRAY (OR MINKEYS (with HashFile (with HASHBUFFER HASHBUFFER HASHFILE)
                                               %#Entries))
                         OVERFLOW HASHBITSFN EQUIVFN))
          (replace (HASHBUFFER ACCESS) of HASHBUFFER with (GETFILEINFO (with HashFile
                                                                             (with HASHBUFFER 
                                                                                   HASHBUFFER 
                                                                                   HASHFILE)
                                                                             Stream)
                                                                 'ACCESS))
          (RETURN HASHBUFFER])

(CLOSEHASHBUFFER
  [LAMBDA (HASHBUFFER FILEONLY?)                             (* cdl " 1-May-87 16:21")
    (with HASHBUFFER HASHBUFFER (PROG1 (HASHFILEPROP HASHFILE 'NAME)
                                       (CLOSEHASHFILE HASHFILE)
                                       (if (NOT FILEONLY?)
                                           then (SETQ HASHARRAY NIL])

(GETHASHBUFFER
  [LAMBDA (KEY HASHBUFFER)                                   (* cdl "24-Oct-85 08:37")
    (PROG (VALUE)
          (with HASHBUFFER HASHBUFFER (if (EQ EMPTYHASHENTRYMARKER (SETQ VALUE (GETHASH KEY HASHARRAY
                                                                                      )))
                                          then (RETURN)
                                        elseif VALUE
                                          then (RETURN VALUE)
                                        elseif (SETQ VALUE (GETHASHFILE KEY HASHFILE))
                                          then (PUTHASH KEY VALUE HASHARRAY)
                                               (RETURN VALUE)
                                        else (PUTHASH KEY EMPTYHASHENTRYMARKER HASHARRAY])

(PUTHASHBUFFER
  [LAMBDA (KEY VALUE HASHBUFFER)                             (* cdl "24-Oct-85 08:26")
    (with HASHBUFFER HASHBUFFER (if (NEQ ACCESS 'INPUT)
                                    then (PUTHASHFILE KEY VALUE HASHFILE))
          (PUTHASH KEY VALUE HASHARRAY])
)

(RPAQ? EMPTYHASHENTRYMARKER '**EMPTYHASHENTRY**)
(DECLARE%: DOEVAL@COMPILE DONTCOPY

(GLOBALVARS EMPTYHASHENTRYMARKER)
)
(DEFINEQ

(HASHARRAY.TO.HASHFILE
  [LAMBDA (HASHARRAY HASHFILE TESTFN)                        (* ; "Edited  3-Sep-87 17:05 by cdl")

    (DECLARE (SPECVARS HASHARRAY HASHFILE TESTFN))
    (LET (REOPEN)
         (DECLARE (SPECVARS REOPEN))
         [if (HASHFILEP HASHFILE)
             then (SETQ REOPEN T)
           else (SETQ HASHFILE (CREATEHASHFILE HASHFILE NIL NIL (HARRAYPROP HASHARRAY 'NUMKEYS]
         [RESETLST [RESETSAVE NIL `(CLOSEHASHFILE ,HASHFILE ,REOPEN]
                (MAPHASH HASHARRAY (FUNCTION (LAMBDA (VALUE KEY)
                                               (if (OR (NULL TESTFN)
                                                       (APPLY* TESTFN KEY VALUE HASHARRAY HASHFILE))
                                                   then (PUTHASHFILE KEY VALUE HASHFILE]
         (if REOPEN
             then HASHFILE
           else (with HashFile HASHFILE File])

(HASHFILE.TO.HASHARRAY
  [LAMBDA (HASHFILE HASHARRAY TESTFN)                        (* ; "Edited  3-Sep-87 17:05 by cdl")

    (DECLARE (SPECVARS HASHFILE HASHARRAY TESTFN))
    (LET (REOPEN)
         (DECLARE (SPECVARS REOPEN))
         [if (HASHFILEP HASHFILE)
             then (SETQ REOPEN T)
           else (SETQ HASHFILE (OPENHASHFILE HASHFILE 'INPUT]
         [if (NULL HASHARRAY)
             then (SETQ HASHARRAY (with HashFile HASHFILE (HASHARRAY %#Entries]
         [RESETLST [RESETSAVE NIL `(CLOSEHASHFILE ,HASHFILE ,REOPEN]
                (MAPHASHFILE HASHFILE (FUNCTION (LAMBDA (KEY VALUE)
                                                  (if (OR (NULL TESTFN)
                                                          (APPLY* TESTFN KEY VALUE HASHFILE HASHARRAY
                                                                 ))
                                                      then (PUTHASH KEY VALUE HASHARRAY]
         HASHARRAY])
)
(DECLARE%: DONTCOPY 
(DECLARE%: EVAL@COMPILE

(RECORD HASHBUFFER (HASHARRAY HASHFILE ACCESS))
)
)
(FILESLOAD HASH)
(PUTPROPS HASHBUFFER COPYRIGHT ("Stanford University" 1985 1986 1987))
(DECLARE%: DONTCOPY
  (FILEMAP (NIL (848 4618 (CREATEHASHBUFFER 858 . 1987) (OPENHASHBUFFER 1989 . 3081) (CLOSEHASHBUFFER 
3083 . 3472) (GETHASHBUFFER 3474 . 4317) (PUTHASHBUFFER 4319 . 4616)) (4745 6703 (
HASHARRAY.TO.HASHFILE 4755 . 5690) (HASHFILE.TO.HASHARRAY 5692 . 6701)))))
STOP
