home *** CD-ROM | disk | FTP | other *** search
- {>>>>KEY_SEARCH<<<<}
-
- FUNCTION KEY_SEARCH(VAR KEYS : KEY_FILE;
- VAR KEY_REF : INTEGER;
- MATCH_IT : STRING80) : BOOLEAN;
-
- VAR HI,LO,MID : INTEGER;
- REC_COUNT : INTEGER;
- SEARCH_REC : KEY_REC;
- FOUND : BOOLEAN;
- COLLIDED : BOOLEAN;
-
- BEGIN
- KEY_REF := 0;
- REC_COUNT := FILESIZE(KEYS);
- HI := REC_COUNT;
- LO := 0;
- KEY_SEARCH := FALSE; FOUND := FALSE; COLLIDED := FALSE;
-
- MID := (LO + HI) DIV 2; { Calc first midpoint }
-
- IF REC_COUNT > 0 THEN { Don't search if file is empty }
- REPEAT
- SEEK(KEYS,MID);
- READ(KEYS,SEARCH_REC);
-
- { Was there a collision between MID & LO or MID & HI? }
- IF (LO = MID) OR (HI = MID) THEN COLLIDED := TRUE;
- IF MATCH_IT = SEARCH_REC.KEY THEN { Found it! }
- BEGIN
- FOUND := TRUE; { Set found flag... }
- KEY_SEARCH := TRUE; { ...and function value... }
- KEY_REF := SEARCH_REC.REF { ...and key into data file }
- END
- ELSE { No luck...divide and try again... }
- BEGIN
- IF MATCH_IT > SEARCH_REC.KEY THEN LO := MID
- ELSE HI := MID; { Halve the field }
- MID := (LO + HI) DIV 2; { Recalc the midpoint }
- KEY_REF := MID { Save MID in KEY_REF }
- END
- UNTIL COLLIDED OR FOUND
- END;