INTEGER I,LOOKS,ENTRI0,HASHM0,PROBE,HASHW0
INTEGER MINHA0,FD
INTEGER GETARG,CTOI,GETLIN,MKTEMP
INTEGER NAMES(9,1001)
INTEGER ARG1(102),ARG2(102),BUF(102)
REAL HASHD0,MINDE0
INTEGER HASHC0(2)
INTEGER * 4 LONGH0
INTEGER AAAAB0
INTEGER AAAAA0
INTEGER AAAAC0
EQUIVALENCE (HASHC0(1),LONGH0)
IF((GETARG(1,ARG1,102).EQ.-1))GOTO 10002
IF((GETARG(2,ARG2,102).EQ.-1))GOTO 10002
GOTO 10001
10002 CALL ERROR('Usage: hasher
.')
10001 I=1
HASHM0=CTOI(ARG1,I)
IF(((HASHM0.GE.1).AND.(HASHM0.LE.1001)))GOTO 10003
CALL ERROR('Hash table size < 1 or too large.')
10003 I=1
HASHW0=CTOI(ARG2,I)
IF((HASHM0-HASHW0.LT.1))GOTO 10005
IF((HASHM0+HASHW0.GT.1001))GOTO 10005
IF((HASHW0.LT.0))GOTO 10005
GOTO 10004
10005 CALL ERROR('Hash size search width too big.')
10004 FD=MKTEMP(3)
IF((FD.NE.-3))GOTO 10006
CALL ERROR('Can''t create temporary file.')
10006 CALL FCOPY(-10,FD)
AAAAA0=HASHM0-HASHW0
AAAAB0=1
GOTO 10000
10007 MINDE0=HASHD0
MINHA0=HASHM0-HASHW0
I=HASHM0-HASHW0+1
GOTO 10010
10008 I=I+(1)
10010 IF((I.GT.HASHM0+HASHW0))GOTO 10009
AAAAA0=I
AAAAB0=2
GOTO 10000
10011 IF((HASHD0.GE.MINDE0))GOTO 10012
MINDE0=HASHD0
MINHA0=I
10012 GOTO 10008
10009 AAAAA0=MINHA0
AAAAB0=3
GOTO 10000
10013 CALL PRINT(-11,'** Hash table generated by hasher*n.')
CALL PRINT(-11,'HMOD DATA *iL*nHTAB EQU ***n.',MINHA0)
I=1
GOTO 10016
10014 I=I+1
10016 IF(((I.GT.MINHA0).AND.(NAMES(1,I).EQ.0)))GOTO 10015
IF((NAMES(1,I).NE.0))GOTO 10017
CALL PRINT(-11,'***n BSZ 6*n.')
GOTO 10018
10017 CALL PRINT(-11,'***n EXT *s*n.',NAMES(1,I))
CALL PRINT(-11,' DATA C''*s''*n.',NAMES(1,I))
CALL PRINT(-11,' IP *s*n.',NAMES(1,I))
10018 GOTO 10014
10015 CALL PRINT(-11,'***n OCT 0*n.')
CALL PRINT(-15,'entries: *i, table size: *i, search depth: *r*n.',
*ENTRI0,I-1,MINDE0)
CALL SWT
10000 CALL REWIND(FD)
DO 10019 AAAAC0=1,1001
NAMES(1,AAAAC0)=0
10019 CONTINUE
10020 ENTRI0=0
LOOKS=0
10021 IF((GETLIN(BUF,FD).EQ.-1))GOTO 10022
IF((BUF(1).NE.170))GOTO 10023
GOTO 10021
10023 ENTRI0=ENTRI0+1
AAAAC0=LENGTH(BUF)
GOTO 10026
10024 AAAAC0=AAAAC0+1
10026 IF((AAAAC0.GT.8))GOTO 10025
BUF(AAAAC0)=160
GOTO 10024
10025 BUF(9)=0
IF((BUF(3).NE.160))GOTO 10027
IF((BUF(4).NE.160))GOTO 10027
HASHC0(1)=0
HASHC0(2)=XOR(LS(BUF(1),8),BUF(2))
GOTO 10028
10027 IF((BUF(5).NE.160))GOTO 10029
IF((BUF(6).NE.160))GOTO 10029
HASHC0(1)=XOR(LS(BUF(3),8),BUF(4))
HASHC0(2)=XOR(LS(BUF(1),8),BUF(2))
GOTO 10030
10029 IF((BUF(7).NE.160))GOTO 10031
IF((BUF(8).NE.160))GOTO 10031
HASHC0(1)=XOR(LS(BUF(3),8),BUF(4))
HASHC0(2)=XOR(XOR(LS(BUF(1),8),BUF(2)),XOR(LS(BUF(5),8),BU
*F(6)))
GOTO 10032
10031 HASHC0(1)=XOR(XOR(LS(BUF(3),8),BUF(4)),XOR(LS(BUF(7),8),BU
*F(8)))
HASHC0(2)=XOR(XOR(LS(BUF(1),8),BUF(2)),XOR(LS(BUF(5),8),BU
*F(6)))
10032 CONTINUE
10030 CONTINUE
10028 HASHC0(1)=AND(HASHC0(1),:77777)
PROBE=MOD(LONGH0,INTL(AAAAA0))+1
10033 IF((NAMES(1,PROBE).EQ.0))GOTO 10034
LOOKS=LOOKS+1
PROBE=PROBE+1
IF((PROBE.LE.1001))GOTO 10035
CALL ERROR('Hash table overflow -- make mod + width bigger.'
*)
10035 GOTO 10033
10034 CALL SCOPY(BUF,1,NAMES(1,PROBE),1)
GOTO 10021
10022 HASHD0=FLOAT(LOOKS)/FLOAT(ENTRI0)+1.0
GOTO 10036
10036 GOTO(10007,10011,10013),AAAAB0
GOTO 10036
END
C ---- Long Name Map ----
C hashmod hashm0
C minhash minha0
C hashwidth hashw0
C entries entri0
C mindepth minde0
C longhashcalc longh0
C hashnames hashn0
C hashdepth hashd0
C hashcalc hashc0