!######################################################
!# HASHCK.BAS - "HASH CHECK"
!#
!# Checks hash totals from the following files:
!#	HASHCK.OLD         HASHCK.NEW
!#
!# (See the .LOG - JAN '86 for details on using HASHCK)
!#
!# Also, grab HSHDSK.CMD and HSHDSK.DOC.... ok?
!#
!# by Dave Heyliger  AMUS Staff
!#
!# last update: 11/16/85
!#######################################################
MAP1	NEW'FILE,S,50,""
MAP1	NEW'NAME,S,10,""
MAP1	NEW'HASH,S,15,""
MAP1	NEW'EXT,S,3,""
MAP1	NEW'PPN,S,15,""
MAP1	OLD'FILE,S,50,""
MAP1	OLD'NAME,S,10,""
MAP1	OLD'HASH,S,15,""
MAP1	OLD'EXT,S,3,""
MAP1	OLD'PPN,S,15,""

INITIALIZE:
!--- 
!	Open two files: HASHCK.OLD and HASKCK.NEW. It is in these two
!	files that all comparisons will be made. Also, open the daily
!	report file, HASHCK.RPT and establish starting P,PN. Grab first
!	filenames and away we go.
!---------------------------------------------------------------------
	OPEN #2,"HASHCK.OLD",INPUT
	OPEN #1,"HASHCK.NEW",INPUT
	OPEN #3,"HASHCK.RPT",OUTPUT
TOP:	INPUT LINE #2,OLD'FILE
	INPUT LINE #1,NEW'FILE
CK:
	!If both files are at the very end, quit.
	IF (EOF(1) = 1 AND EOF(2) = 1) THEN GOTO THE'END

	!If "Grand" on either file, read past it.
	IF MID$(OLD'FILE,1,5) = "Grand" &
		THEN INPUT LINE #2,OLD'FILE
	IF MID$(NEW'FILE,1,5) = "Grand" &
		THEN INPUT LINE #1,NEW'FILE

	!If "No such files" read past it.
	IF MID$(OLD'FILE,1,5) = "%No s" &
		THEN INPUT LINE #2,OLD'FILE
	IF MID$(NEW'FILE,1,5) = "%No s" &
		THEN INPUT LINE #1,NEW'FILE

	!If an old P,PN deleted at the END of the series.
    	IF (EOF(1) = 1 AND  EOF(2) <> 1) &
		   THEN INPUT LINE #2,OLD'FILE :&
			? MID$(OLD'FILE,36,14) : &
			? #3,MID$(OLD'FILE,36,14) &
			" * DELETED *" : GOTO DELETED'PPN

	!If a new P,PN added at the END of the series.
    	IF (EOF(2) = 1 AND EOF(1) <> 1) &
		   THEN ? MID$(NEW'FILE,36,14) : &
			? #3,MID$(NEW'FILE,36,14) &
			 " ** NEW **" : GOTO ADDED'PPN

NEXT'PPN:
!---
!	Determine if P,PN is NEW, DELETED, or same ol' P,PN as last time
!------------------------------------------------------------------------
OLD'PPN = MID$(OLD'FILE,36,15)
NEW'PPN = MID$(NEW'FILE,36,15)
IF OLD'PPN = NEW'PPN &
	THEN ? OLD'PPN : ? #3,OLD'PPN : GOTO BREAKDOWN
IF OLD'PPN > NEW'PPN &
	THEN ? NEW'PPN : ? #3,NEW'PPN "  ** NEW **" : GOTO ADDED'PPN
IF OLD'PPN < NEW'PPN &
	THEN ? OLD'PPN : ? #3,OLD'PPN "  * Deleted *" : GOTO DELETED'PPN

ADDED'PPN:
!--- 
!	This portion of the program will be called if a new P,PN has been
!	added since the last run of HSHDSK (Hash disk). It will report that
!	a new P,PN has been added, and will list the new files in this P,PN
!---------------------------------------------------------------------------
	IF MID$(NEW'FILE,1,2) = "To" &
		THEN INPUT LINE #1,NEW'FILE
	IF MID$(NEW'FILE,1,2) = "  " &
		THEN INPUT LINE #1,NEW'FILE :&
		     IF MID$(NEW'FILE,1,2) <> "Gr" &
			THEN  ? #3, : GOTO CK &
                        ELSE INPUT LINE #1,NEW'FILE : ? #3, : GOTO CK
        NEW'NAME = MID$(NEW'FILE,1,10) 
	? #3,NEW'NAME " has been added"
	INPUT LINE #1,NEW'FILE
	GOTO ADDED'PPN

DELETED'PPN:
!---
!	Similar to ADDED'PPN but here a deletion message is printed, along
!	with a listing of the deleted files within this P,PN
!---------------------------------------------------------------------------
	IF MID$(OLD'FILE,1,2) = "To" &
		THEN INPUT LINE #2,OLD'FILE
	IF MID$(OLD'FILE,1,2) = "  " &
		THEN INPUT LINE #2,OLD'FILE :&
		     IF MID$(OLD'FILE,1,2) <> "Gr" &
			THEN  ? #3, : GOTO CK &
                        ELSE INPUT LINE #2,OLD'FILE : ? #3, : GOTO CK
	OLD'NAME = MID$(OLD'FILE,1,10) 
	? #3,OLD'NAME " has been deleted"
	INPUT LINE #2,OLD'FILE
	GOTO DELETED'PPN

BREAKDOWN:
!---
!	Break down the filename by name, ext, and hash total
!---------------------------------------------------------------------
IF MID$(OLD'FILE,7,1) <> " " &
	THEN INPUT LINE #2,OLD'FILE : GOTO PPN'OLD'END
IF MID$(NEW'FILE,7,1) <> " " &
	THEN INPUT LINE #1,NEW'FILE : GOTO PPN'NEW'END
OLD'NAME = MID$(OLD'FILE,1,10) 
OLD'HASH = MID$(OLD'FILE,18,15)
OLD'EXT = MID$(OLD'FILE,8,3)
NEW'NAME = MID$(NEW'FILE,1,10) 
NEW'HASH = MID$(NEW'FILE,18,15)
NEW'EXT = MID$(NEW'FILE,8,3)

ANALYSE:
!---
!	There are many different combinations of how run-time reading
!	of the two input files can be interpreted, and so this attempts
!	to decide just what the heck is going on!
!----------------------------------------------------------------------

!Case #1: Non-blank equal filenames - only time hash totals are checked.
IF OLD'NAME = NEW'NAME &
	THEN IF MID$(OLD'NAME,1,1) <> " " &
	     	THEN GOTO CHECK'HASH ELSE ? #3, : GOTO TOP

!Case #2: P,PN use to have only ONE file in it, now it has TWO or more new.
IF MID$(OLD'FILE,1,1) = " " &
	THEN ? #3,NEW'NAME " has been added" :&
	     INPUT LINE #1, NEW'FILE : GOTO BREAKDOWN

!Case #3: P,PN use to have TWO or more files in it, now it has only ONE.
IF MID$(NEW'FILE,1,1) = " " &
	THEN ? #3,OLD'NAME " has been deleted" :&
             INPUT LINE #2,OLD'FILE : GOTO BREAKDOWN

!See if extensions are same even though filenames are different.
!If so, bypass this next series of cases #4-#5
IF OLD'EXT = NEW'EXT THEN GOTO C6

!Case #4: A file has been deleted from the P,PN
IF OLD'EXT < NEW'EXT &
	THEN ? #3,OLD'NAME " has been deleted" :&
             INPUT LINE #2,OLD'FILE : GOTO BREAKDOWN

!Case #5: New file has been added to the P,PN
IF OLD'EXT > NEW'EXT &
	THEN ? #3,NEW'NAME " has been added" :&
             INPUT LINE #1,NEW'FILE : GOTO BREAKDOWN
                      
C6:
!Case #6: Same extension, file deletion from P,PN
IF OLD'NAME < NEW'NAME &
	THEN ? #3,OLD'NAME " has been deleted" :&
             INPUT LINE #2,OLD'FILE : GOTO BREAKDOWN

!Case #7: Same extension, file addition into P,PN
IF OLD'NAME > NEW'NAME &
	THEN ? #3,NEW'NAME " has been added" :&
             INPUT LINE #1,NEW'FILE : GOTO BREAKDOWN

CHECK'HASH:
!---
!	Examimes hash total only when names are identical
!-----------------------------------------------------------
IF OLD'HASH <> NEW'HASH &
	THEN IF MID$(OLD'NAME,1,6) <> "HASHCK" &
                THEN IF MID$(OLD'NAME,1,5) <> "START" &
		 	THEN ? #3,OLD'NAME " has a hash conflict:  old = "; :&
                             ? #3,MID$(OLD'FILE,18,15) "   new = "; :&
                             ? #3,MID$(NEW'FILE,18,15)
INPUT LINE #2,OLD'FILE
INPUT LINE #1,NEW'FILE
GOTO BREAKDOWN


PPN'OLD'END:
!---
!	If the end of the OLD P,PN listing has occurred but not the NEW
!	listing, then all remaining files in the NEW listing are new, and
!	so write these files to the report file.
!-------------------------------------------------------------------------
	IF MID$(NEW'FILE,1,2) = "To" &
	   THEN INPUT LINE #1,NEW'FILE
	IF MID$(NEW'FILE,1,2) = "  " &
	   THEN ? #3, : GOTO TOP
        NEW'NAME = MID$(NEW'FILE,1,10) 
	? #3,NEW'NAME " has been added"
	INPUT LINE #1,NEW'FILE
	GOTO PPN'OLD'END

PPN'NEW'END:
!---
!	Similar to PPN'OLD'END but OLD listing is longer than NEW listing.
!-------------------------------------------------------------------------
	IF MID$(OLD'FILE,1,2) = "To" &
	   THEN INPUT LINE #2,OLD'FILE
	IF MID$(OLD'FILE,1,2) = "  " &
	   THEN ?#3, : GOTO TOP
	OLD'NAME = MID$(OLD'FILE,1,10) 
	? #3,OLD'NAME " has been deleted"
	INPUT LINE #2,OLD'FILE
	GOTO PPN'NEW'END

THE'END:
? "Comparison is complete"
CLOSE #1:CLOSE #2:CLOSE #3:END