	SUBROUTINE HASH(LIST,POINT,LSIZ,ISIZ,KEY,ISTATE,OSTATE)
	CHARACTER LIST(LSIZ)*(*),KEY*(*),KKEY*3
	LOGICAL*1 ZKEY(4)
	INTEGER*4 INTER
	EQUIVALENCE(ZKEY(1),KKEY),(INTER,ZKEY)
	INTEGER*4 LSIZ,POS,HSIZ,POINT(0:LSIZ),ISTATE,OSTATE
	HSIZ = LSIZ/2 -1
C	BUILD FIRST HIT POS
	LL = LEN(KEY)
	POS = 0
	INTER = 0
	DO I=1,LL,3
	KKEY = KEY(I:MIN(I+2,LL))
	POS = POS + INTER
	ENDDO
	POS = MOD(POS,LSIZ)
C	NOW WE HAVE A POSITION   SEE IF A HIT
	IHIT =0
100	IP = POINT(POS)
	IF(IP.EQ.0) GOTO 1000 !NEW TO LIST
C	CHECK ON MATCH
	IF(LIST(IP).EQ.KEY) GOTO 1500	! MATCH
C	NO MATCH SO REHASH VIA QUADRATIC
	IHIT = IHIT + 1
	POS = MOD(POS+IHIT*IHIT,LSIZ)
	IF(IHIT.GT.HSIZ) GOTO 2000    !LIST FULL CONDITION
	GOTO 100
1000	IF(ISTATE.EQ.0) THEN          ! ADD TO LIST
		ISIZ = ISIZ + 1
		POINT(POS) = ISIZ
		LIST(ISIZ) = KEY
		OSTATE = -ISIZ
	ELSE				! LIST ENTRY NOT PRESENT
		OSTATE = 0
	ENDIF
	RETURN
1500	OSTATE = IP
	RETURN
2000	TYPE *,'UNABLE TO HASH ',KEY,'  HASH LIST FULL'
	OSTATE = 0
	RETURN
	END
